Merge pull request #1145 from birarda/assignment

fix silent node removal thread join bug
This commit is contained in:
ZappoMan 2013-10-29 16:35:41 -07:00
commit 32b1fb2e23

View file

@ -767,24 +767,19 @@ void* removeSilentNodes(void *args) {
uint64_t checkTimeUsecs = 0;
int sleepTime = 0;
while (!silentNodeThreadStopFlag) {
while (!::silentNodeThreadStopFlag) {
checkTimeUsecs = usecTimestampNow();
for(NodeList::iterator node = nodeList->begin(); node != nodeList->end(); ++node) {
qDebug() << "Locking node" << node->getUUID() << "\n";
node->lock();
qDebug() << "N:" << usecTimestampNow() << "LH:" << node->getLastHeardMicrostamp() << "\n";
qDebug() << "Diff:" << usecTimestampNow() - node->getLastHeardMicrostamp() << "\n";
if ((usecTimestampNow() - node->getLastHeardMicrostamp()) > NODE_SILENCE_THRESHOLD_USECS) {
// kill this node, don't lock - we already did it
nodeList->killNode(&(*node), false);
}
node->unlock();
qDebug() << "Unlocking node" << node->getUUID() << "\n";
}
sleepTime = NODE_SILENCE_THRESHOLD_USECS - (usecTimestampNow() - checkTimeUsecs);
@ -796,7 +791,6 @@ void* removeSilentNodes(void *args) {
#else
if (sleepTime > 0) {
qDebug() << "Sleeping for" << sleepTime << "\n";
usleep(sleepTime);
}
@ -808,13 +802,23 @@ void* removeSilentNodes(void *args) {
}
void NodeList::startSilentNodeRemovalThread() {
pthread_create(&removeSilentNodesThread, NULL, removeSilentNodes, (void*) this);
if (!::silentNodeThreadStopFlag) {
pthread_create(&removeSilentNodesThread, NULL, removeSilentNodes, (void*) this);
} else {
qDebug("Refusing to start silent node removal thread from previously failed join.\n");
}
}
void NodeList::stopSilentNodeRemovalThread() {
silentNodeThreadStopFlag = true;
pthread_join(removeSilentNodesThread, NULL);
::silentNodeThreadStopFlag = true;
int joinResult = pthread_join(removeSilentNodesThread, NULL);
if (joinResult == 0) {
::silentNodeThreadStopFlag = false;
} else {
qDebug("Silent node removal thread join failed with %d. Will not restart.\n", joinResult);
}
}
const QString QSETTINGS_GROUP_NAME = "NodeList";