TBASE-870: fix link error in windows
This commit is contained in:
parent
128a49fc2d
commit
82ce093aff
|
@ -84,8 +84,8 @@
|
|||
#define __sync_add_and_fetch_64 __sync_add_and_fetch
|
||||
#define __sync_add_and_fetch_32 __sync_add_and_fetch
|
||||
#define __sync_add_and_fetch_16 __sync_add_and_fetch
|
||||
#define __sync_add_and_fetch_ptr __sync_add_and_fetch
|
||||
#define __sync_add_and_fetch_8 __sync_add_and_fetch
|
||||
#define __sync_add_and_fetch_ptr __sync_add_and_fetch
|
||||
|
||||
#define __sync_sub_and_fetch_64 __sync_sub_and_fetch
|
||||
#define __sync_sub_and_fetch_32 __sync_sub_and_fetch
|
||||
|
|
|
@ -100,8 +100,8 @@ extern "C" {
|
|||
#define __sync_add_and_fetch_64 __sync_add_and_fetch
|
||||
#define __sync_add_and_fetch_32 __sync_add_and_fetch
|
||||
#define __sync_add_and_fetch_16 __sync_add_and_fetch
|
||||
#define __sync_add_and_fetch_ptr __sync_add_and_fetch
|
||||
#define __sync_add_and_fetch_8 __sync_add_and_fetch
|
||||
#define __sync_add_and_fetch_ptr __sync_add_and_fetch
|
||||
|
||||
#define __sync_sub_and_fetch_64 __sync_sub_and_fetch
|
||||
#define __sync_sub_and_fetch_32 __sync_sub_and_fetch
|
||||
|
|
|
@ -127,16 +127,19 @@ extern "C" {
|
|||
#define __sync_val_compare_and_swap_64(ptr, oldval, newval) _InterlockedCompareExchange64((__int64 volatile*)(ptr), (__int64)(newval), (__int64)(oldval))
|
||||
#define __sync_val_compare_and_swap_ptr(ptr, oldval, newval) _InterlockedCompareExchangePointer((void* volatile*)(ptr), (void*)(newval), (void*)(oldval))
|
||||
|
||||
char interlocked_add_8(char volatile* ptr, char val);
|
||||
short interlocked_add_16(short volatile* ptr, short val);
|
||||
char interlocked_add_8(char volatile *ptr, char val);
|
||||
short interlocked_add_16(short volatile *ptr, short val);
|
||||
long interlocked_add_32(long volatile *ptr, long val);
|
||||
__int64 interlocked_add_64(__int64 volatile *ptr, __int64 val);
|
||||
|
||||
#define __sync_add_and_fetch_8(ptr, val) interlocked_add_8((char volatile*)(ptr), (char)(val))
|
||||
#define __sync_add_and_fetch_16(ptr, val) interlocked_add_16((short volatile*)(ptr), (short)(val))
|
||||
#define __sync_add_and_fetch_32(ptr, val) _InterlockedAdd((long volatile*)(ptr), (long)(val))
|
||||
#define __sync_add_and_fetch_64(ptr, val) _InterlockedAdd64((__int64 volatile*)(ptr), (__int64)(val))
|
||||
#define __sync_add_and_fetch_32(ptr, val) interlocked_add_32((long volatile*)(ptr), (long)(val))
|
||||
#define __sync_add_and_fetch_64(ptr, val) interlocked_add_64((__int64 volatile*)(ptr), (__int64)(val))
|
||||
#ifdef _WIN64
|
||||
#define __sync_add_and_fetch_ptr atomic_add_fetch_64
|
||||
#define __sync_add_and_fetch_ptr __sync_add_and_fetch_64
|
||||
#else
|
||||
#define __sync_add_and_fetch_ptr atomic_add_fetch_32
|
||||
#define __sync_add_and_fetch_ptr __sync_add_and_fetch_32
|
||||
#endif
|
||||
|
||||
#define __sync_sub_and_fetch_8(ptr, val) __sync_add_and_fetch_8((ptr), -(val))
|
||||
|
|
|
@ -43,8 +43,11 @@ void taosResetPthread(pthread_t *thread) {
|
|||
}
|
||||
|
||||
int64_t taosGetPthreadId() {
|
||||
pthread_t id = pthread_self();
|
||||
return (int64_t)id.p;
|
||||
#ifdef PTW32_VERSION
|
||||
return pthread_getw32threadid_np(pthread_self());
|
||||
#else
|
||||
return (int64_t)pthread_self();
|
||||
#endif
|
||||
}
|
||||
|
||||
int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen) {
|
||||
|
@ -72,6 +75,14 @@ short interlocked_add_16(short volatile* ptr, short val) {
|
|||
return _InterlockedExchangeAdd16(ptr, val) + val;
|
||||
}
|
||||
|
||||
long interlocked_add_32(long volatile* ptr, long val) {
|
||||
return _InterlockedExchangeAdd(ptr, val) + val;
|
||||
}
|
||||
|
||||
__int64 interlocked_add_64(__int64 volatile* ptr, __int64 val) {
|
||||
return _InterlockedExchangeAdd64(ptr, val) + val;
|
||||
}
|
||||
|
||||
int32_t __sync_val_load_32(int32_t *ptr) {
|
||||
return InterlockedOr(ptr, 0);
|
||||
}
|
||||
|
|
|
@ -27,15 +27,6 @@
|
|||
#include "tutil.h"
|
||||
|
||||
|
||||
static uintptr_t pthreadGetId() {
|
||||
#ifdef PTW32_VERSION
|
||||
return pthread_getw32threadid_np(pthread_self());
|
||||
#else
|
||||
assert(sizeof(pthread_t) == sizeof(uintptr_t));
|
||||
return (uintptr_t)pthread_self();
|
||||
#endif
|
||||
}
|
||||
|
||||
#define TIMER_STATE_WAITING 0
|
||||
#define TIMER_STATE_EXPIRED 1
|
||||
#define TIMER_STATE_STOPPED 2
|
||||
|
@ -63,15 +54,15 @@ typedef struct tmr_obj_t {
|
|||
uint8_t reserved1;
|
||||
uint16_t reserved2;
|
||||
union {
|
||||
int64_t expireAt;
|
||||
uintptr_t executedBy;
|
||||
int64_t expireAt;
|
||||
int64_t executedBy;
|
||||
};
|
||||
TAOS_TMR_CALLBACK fp;
|
||||
void* param;
|
||||
} tmr_obj_t;
|
||||
|
||||
typedef struct timer_list_t {
|
||||
uintptr_t lockedBy;
|
||||
int64_t lockedBy;
|
||||
tmr_obj_t* timers;
|
||||
} timer_list_t;
|
||||
|
||||
|
@ -125,9 +116,9 @@ static void timerDecRef(tmr_obj_t* timer) {
|
|||
}
|
||||
|
||||
static void lockTimerList(timer_list_t* list) {
|
||||
uintptr_t tid = pthreadGetId();
|
||||
int64_t tid = taosGetPthreadId();
|
||||
int i = 0;
|
||||
while (__sync_val_compare_and_swap_ptr(&(list->lockedBy), 0, tid) != 0) {
|
||||
while (__sync_val_compare_and_swap_64(&(list->lockedBy), 0, tid) != 0) {
|
||||
if (++i % 1000 == 0) {
|
||||
sched_yield();
|
||||
}
|
||||
|
@ -135,8 +126,8 @@ static void lockTimerList(timer_list_t* list) {
|
|||
}
|
||||
|
||||
static void unlockTimerList(timer_list_t* list) {
|
||||
uintptr_t tid = pthreadGetId();
|
||||
if (__sync_val_compare_and_swap_ptr(&(list->lockedBy), tid, 0) != tid) {
|
||||
int64_t tid = taosGetPthreadId();
|
||||
if (__sync_val_compare_and_swap_64(&(list->lockedBy), tid, 0) != tid) {
|
||||
assert(false);
|
||||
tmrError("trying to unlock a timer list not locked by current thread.");
|
||||
}
|
||||
|
@ -262,7 +253,7 @@ static bool removeFromWheel(tmr_obj_t* timer) {
|
|||
|
||||
static void processExpiredTimer(void* handle, void* arg) {
|
||||
tmr_obj_t* timer = (tmr_obj_t*)handle;
|
||||
timer->executedBy = pthreadGetId();
|
||||
timer->executedBy = taosGetPthreadId();
|
||||
uint8_t state = __sync_val_compare_and_swap_8(&timer->state, TIMER_STATE_WAITING, TIMER_STATE_EXPIRED);
|
||||
if (state == TIMER_STATE_WAITING) {
|
||||
const char* fmt = "timer[label=%s, id=%lld, fp=%p, param=%p] execution start.";
|
||||
|
@ -402,12 +393,12 @@ static bool doStopTimer(tmr_obj_t* timer, uint8_t state) {
|
|||
tmrTrace(fmt, timer->ctrl->label, timer->id, timer->fp, timer->param);
|
||||
} else if (state != TIMER_STATE_EXPIRED) {
|
||||
// timer already stopped or cancelled, has nothing to do in this case
|
||||
} else if (timer->executedBy == pthreadGetId()) {
|
||||
} else if (timer->executedBy == taosGetPthreadId()) {
|
||||
// taosTmrReset is called in the timer callback, should do nothing in this
|
||||
// case to avoid dead lock. note taosTmrReset must be the last statement
|
||||
// of the callback funtion, will be a bug otherwise.
|
||||
} else {
|
||||
assert(timer->executedBy != pthreadGetId());
|
||||
assert(timer->executedBy != taosGetPthreadId());
|
||||
|
||||
const char* fmt = "timer[label=%s, id=%lld, fp=%p, param=%p] fired, waiting...";
|
||||
tmrTrace(fmt, timer->ctrl->label, timer->id, timer->fp, timer->param);
|
||||
|
|
Loading…
Reference in New Issue