26 #include <config-network.h>
28 #include <sys/types.h>
29 #include <netinet/in.h>
34 # include <sys/stat.h>
36 # include <arpa/nameser.h>
43 #include <QCoreApplication>
45 #include <QMutableListIterator>
52 #include <QWaitCondition>
61 using namespace KNetwork;
62 using namespace KNetwork::Internal;
131 # ifndef RES_INIT_THREADSAFE
140 if (KDE_stat(
"/etc/resolv.conf", &st) != 0)
143 if (mTime != st.st_mtime)
145 kDebug(179) <<
"shouldResInit: /etc/resolv.conf updated";
157 kDebug(179) <<
"callResInit: calling res_init()";
162 if (KDE_stat(
"/etc/resolv.conf", &st) == 0)
167 : mTime(0), useCount(0)
175 # ifndef RES_INIT_THREADSAFE
176 QMutexLocker locker(&mutex);
195 # ifndef RES_INIT_THREADSAFE
251 KResolverThread::KResolverThread()
257 void KResolverThread::run()
295 return resInit.shouldResInit();
300 #if defined(NEED_MUTEX) && !defined(Q_OS_FREEBSD)
309 #if defined(NEED_MUTEX) && !defined(Q_OS_FREEBSD)
325 KResolverManager::KResolverManager()
326 : runningThreads(0), availableThreads(0)
361 QMutexLocker locker(&mutex);
370 feedWorkers.wait(&mutex, maxWaitTime);
385 QMutableListIterator<RequestData*> it(newRequests);
389 if (!curr->
worker->m_finished)
398 currentRequests.append(curr);
423 data->
worker->m_finished =
true;
431 void KResolverManager::handleFinished()
434 QQueue<RequestData*> doneRequests;
437 if (currentRequests.isEmpty())
446 QMutableListIterator<RequestData*> it(currentRequests);
448 while (it.hasPrevious())
451 if (curr->
worker->th == 0L)
453 if (handleFinishedItem(curr))
456 doneRequests.enqueue(curr);
468 while (!doneRequests.isEmpty())
469 doNotifying(doneRequests.dequeue());
482 bool KResolverManager::handleFinishedItem(
RequestData* curr)
508 workerFactories.append(factory);
531 worker->input = &p->
input;
536 if (worker->m_finished)
654 newrequest->
obj = obj->d;
660 if ((newrequest->
worker = findWorker(obj->d)) == 0L)
668 doNotifying(newrequest);
677 if (!newrequest->
worker->m_finished)
682 currentRequests.append(newrequest);
687 doNotifying(newrequest);
698 QMutexLocker locker(&mutex);
701 newRequests.append(data);
729 if (availableThreads == 0 && runningThreads <
maxThreads)
735 for (
int i = 0; i < workers.size(); ++i)
736 if (!workers[i]->isRunning())
753 feedWorkers.wakeAll();
756 QMutableListIterator<KResolverThread*> it(workers);
760 if (!worker->isRunning())
769 bool KResolverManager::dequeueNew(
KResolver* obj)
778 for (QMutableListIterator<RequestData*> it(newRequests);
799 for (
int i = 0; i < currentRequests.size(); ++i)
829 QMutexLocker locker(&mutex);