d_tickinterval=::arg().asNum("slave-cycle-interval");
makeNotifySockets();
+ int rc;
+ time_t next, tick;
+
for(;;) {
slaveRefresh(&P);
masterUpdateCheck(&P);
+ tick=doNotifications(); // this processes any notification acknowledgements and actually send out our own notifications
+
+ tick = min (tick, d_tickinterval);
+
+ next=time(0)+tick;
- time_t tick = doNotifications(); // this processes any notification acknowledgements and actually send out our own notifications
- tick = min(tick, d_tickinterval);
- time_t next = time(0) + tick;
-
- while (time(0) < next) {
- std::unique_lock<std::mutex> lk(d_any_mutex);
- auto rc = d_any_condvar.wait_for(lk, std::chrono::seconds(1));
- lk.unlock();
+ while(time(0) < next) {
+ rc=d_any_sem.tryWait();
- if (rc == std::cv_status::timeout) {
+ if(rc) {
bool extraSlaveRefresh = false;
+ Utility::sleep(1);
{
Lock l(&d_lock);
if (d_tocheck.size())
slaveRefresh(&P);
}
else {
+ // eat up extra posts to avoid busy looping if many posts were done
+ while (d_any_sem.tryWait() == 0) {
+ }
break; // something happened
}
// this gets executed at least once every second
#include <pthread.h>
#include <string>
#include <semaphore.h>
-#include <condition_variable>
#include <queue>
#include <list>
#include <limits>
set<DNSName> d_inprogress;
Semaphore d_suck_sem;
- std::condition_variable d_any_condvar;
- std::mutex d_any_mutex;
+ Semaphore d_any_sem;
time_t d_tickinterval;
set<DomainInfo> d_tocheck;
struct cmp {
}
d_tocheck.erase(di);
d_tocheck.insert(ours);
- d_any_condvar.notify_one(); // kick the loop!
+ d_any_sem.post(); // kick the loop!
}
void CommunicatorClass::addTrySuperMasterRequest(DNSPacket *p)
Lock l(&d_lock);
DNSPacket ours = *p;
if(d_potentialsupermasters.insert(ours).second)
- d_any_condvar.notify_one(); // kick the loop!
+ d_any_sem.post(); // kick the loop!
}
void CommunicatorClass::slaveRefresh(PacketHandler *P)