提交 4b0528e7 编写于 作者: F freemine

sem_timedwait porting issue

上级 0fb3cf19
......@@ -31,7 +31,11 @@
#include "mnodeAcct.h"
#include "dnodeTelemetry.h"
static tsem_t tsExitSem;
// sem_timedwait is NOT implemented on MacOSX
// thus, we use pthread_mutex_t/pthread_cond_t to simulate
static pthread_mutex_t tsExitLock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t tsExitCond = PTHREAD_COND_INITIALIZER;
static volatile int tsExit = 0;
static pthread_t tsTelemetryThread;
#define TELEMETRY_SERVER "telemetry.taosdata.com"
......@@ -248,12 +252,14 @@ static void* telemetryThread(void* param) {
clock_gettime(CLOCK_REALTIME, &end);
end.tv_sec += 300; // wait 5 minutes before send first report
while (1) {
if (sem_timedwait(&tsExitSem, &end) == 0) {
break;
} else if (errno != ETIMEDOUT) {
continue;
}
while (!tsExit) {
int r = 0;
struct timespec ts = end;
pthread_mutex_lock(&tsExitLock);
r = pthread_cond_timedwait(&tsExitCond, &tsExitLock, &ts);
pthread_mutex_unlock(&tsExitLock);
if (r==0) break;
if (r!=ETIMEDOUT) continue;
if (sdbIsMaster()) {
sendTelemetryReport();
......@@ -284,12 +290,6 @@ int32_t dnodeInitTelemetry() {
dnodeGetEmail("/usr/local/taos/email");
if (tsem_init(&tsExitSem, 0, 0) == -1) {
// just log the error, it is ok for telemetry to fail
dTrace("failed to create semaphore for telemetry, reason:%s", strerror(errno));
return 0;
}
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
......@@ -310,8 +310,11 @@ void dnodeCleanupTelemetry() {
}
if (taosCheckPthreadValid(tsTelemetryThread)) {
tsem_post(&tsExitSem);
pthread_mutex_lock(&tsExitLock);
tsExit = 1;
pthread_cond_signal(&tsExitCond);
pthread_mutex_unlock(&tsExitLock);
pthread_join(tsTelemetryThread, NULL);
tsem_destroy(&tsExitSem);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册