提交 1dcdccb7 编写于 作者: S slguan

enable the client to compile under darwin

上级 25ff54c9
...@@ -9,6 +9,7 @@ release/ ...@@ -9,6 +9,7 @@ release/
target/ target/
debs/ debs/
rpms/ rpms/
mac/
*.pyc *.pyc
*.tmp *.tmp
src/connector/nodejs/node_modules/ src/connector/nodejs/node_modules/
......
...@@ -25,17 +25,17 @@ SET(TD_ROOT_DIR ${PROJECT_SOURCE_DIR}) ...@@ -25,17 +25,17 @@ SET(TD_ROOT_DIR ${PROJECT_SOURCE_DIR})
# #
# Set macro definitions according to os platform # Set macro definitions according to os platform
SET(TD_OS_WINDOWS FALSE) SET(TD_WINDOWS FALSE)
SET(TD_OS_LINUX FALSE) SET(TD_LINUX FALSE)
SET(TD_OS_ARM FALSE) SET(TD_ARM FALSE)
SET(TD_OS_MAC FALSE) SET(TD_DARWIN FALSE)
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux") IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
SET(TD_OS_DIR ${PROJECT_SOURCE_DIR}/src/os/linux) SET(TD_OS_DIR ${PROJECT_SOURCE_DIR}/src/os/linux)
SET(TD_LINUX TRUE) SET(TD_LINUX TRUE)
ADD_DEFINITIONS(-DLINUX) ADD_DEFINITIONS(-DLINUX)
IF (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang") IF (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
SET(COMMON_FLAGS "-std=gnu99 -Wall -fPIC -malign-double -g -Wno-char-subscripts -msse4.2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE") SET(COMMON_FLAGS "-std=gnu99 -Wall -fPIC -malign-double -g -Wno-char-subscripts -msse4.2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
ELSE () ELSE ()
...@@ -77,9 +77,28 @@ ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Windows") ...@@ -77,9 +77,28 @@ ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
EXIT () EXIT ()
ENDIF () ENDIF ()
ELSE () ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
SET(TD_OS_DIR ${PROJECT_SOURCE_DIR}/src/os/darwin)
SET(TD_DARWIN TRUE)
ADD_DEFINITIONS(-DDARWIN)
SET(COMMON_FLAGS "-std=gnu99 -Wall -fPIC -malign-double -g -Wno-char-subscripts -msse4.2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE -Wno-unused-variable -Wno-bitfield-constant-conversion")
SET(DEBUG_FLAGS "-O0 -DDEBUG")
SET(RELEASE_FLAGS "-O0")
ADD_DEFINITIONS(-D_REENTRANT -D__USE_POSIX -D_LIBC_REENTRANT)
IF (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
MESSAGE(STATUS "The current platform is Darwin 64-bit")
ADD_DEFINITIONS(-D_M_X64)
ELSE ()
MESSAGE(FATAL_ERROR "The current platform is Darwin 32-bit, not supported yet")
EXIT ()
ENDIF ()
MESSAGE(FATAL_ERROR "The current platform is not Linux or Windows, stop compile") ELSE ()
MESSAGE(FATAL_ERROR "The current platform is not Linux/MAC/Windows, stop compile")
EXIT () EXIT ()
ENDIF () ENDIF ()
......
...@@ -6,23 +6,20 @@ AUX_SOURCE_DIRECTORY(./src SRC) ...@@ -6,23 +6,20 @@ AUX_SOURCE_DIRECTORY(./src SRC)
INCLUDE_DIRECTORIES(inc jni ${TD_ROOT_DIR}/src/inc ${TD_OS_DIR}/inc) INCLUDE_DIRECTORIES(inc jni ${TD_ROOT_DIR}/src/inc ${TD_OS_DIR}/inc)
IF (TD_LINUX) IF (TD_LINUX)
# generate dynamic library (*.so)
ADD_LIBRARY(taos SHARED ${SRC}) INCLUDE_DIRECTORIES(${TD_ROOT_DIR}/deps/jni/linux)
ADD_LIBRARY(taos_static STATIC ${SRC})
TARGET_LINK_LIBRARIES(taos_static trpc tutil pthread m rt)
TARGET_LINK_LIBRARIES(taos trpc tutil pthread m rt)
# set the static lib name # set the static lib name
ADD_LIBRARY(taos_static STATIC ${SRC})
TARGET_LINK_LIBRARIES(taos_static trpc tutil pthread m rt)
SET_TARGET_PROPERTIES(taos_static PROPERTIES OUTPUT_NAME "taos_static") SET_TARGET_PROPERTIES(taos_static PROPERTIES OUTPUT_NAME "taos_static")
SET_TARGET_PROPERTIES(taos_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
# enable static lib and so exists # generate dynamic library (*.so)
INCLUDE_DIRECTORIES(${TD_ROOT_DIR}/deps/jni/linux) ADD_LIBRARY(taos SHARED ${SRC})
TARGET_LINK_LIBRARIES(taos trpc tutil pthread m rt)
SET_TARGET_PROPERTIES(taos PROPERTIES CLEAN_DIRECT_OUTPUT 1) SET_TARGET_PROPERTIES(taos PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(taos_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
TARGET_LINK_LIBRARIES(taos_static trpc tutil pthread)
TARGET_LINK_LIBRARIES(taos trpc tutil pthread)
#set version of .so #set version of .so
#VERSION so version #VERSION so version
#SOVERSION api version #SOVERSION api version
...@@ -41,10 +38,23 @@ ELSEIF (TD_WINDOWS) ...@@ -41,10 +38,23 @@ ELSEIF (TD_WINDOWS)
ADD_LIBRARY(taos_static STATIC ${SRC}) ADD_LIBRARY(taos_static STATIC ${SRC})
TARGET_LINK_LIBRARIES(taos_static trpc tutil) TARGET_LINK_LIBRARIES(taos_static trpc tutil)
# generate dynamic library (*.dll)
ADD_LIBRARY(taos SHARED ${SRC}) ADD_LIBRARY(taos SHARED ${SRC})
SET_TARGET_PROPERTIES(taos PROPERTIES LINK_FLAGS /DEF:${TD_ROOT_DIR}/src/client/src/taos.def) SET_TARGET_PROPERTIES(taos PROPERTIES LINK_FLAGS /DEF:${TD_ROOT_DIR}/src/client/src/taos.def)
TARGET_LINK_LIBRARIES(taos trpc) TARGET_LINK_LIBRARIES(taos trpc)
ELSEIF (TD_DARWIN)
INCLUDE_DIRECTORIES(${TD_ROOT_DIR}/deps/jni/linux)
ADD_LIBRARY(taos_static STATIC ${SRC})
TARGET_LINK_LIBRARIES(taos_static trpc tutil pthread m)
SET_TARGET_PROPERTIES(taos_static PROPERTIES OUTPUT_NAME "taos_static")
# generate dynamic library (*.dylib)
ADD_LIBRARY(taos SHARED ${SRC})
TARGET_LINK_LIBRARIES(taos trpc tutil pthread m)
ENDIF () ENDIF ()
...@@ -310,8 +310,8 @@ typedef struct _sql_obj { ...@@ -310,8 +310,8 @@ typedef struct _sql_obj {
char index; char index;
char freed : 4; char freed : 4;
char listed : 4; char listed : 4;
sem_t rspSem; tsem_t rspSem;
sem_t emptyRspSem; tsem_t emptyRspSem;
SSqlCmd cmd; SSqlCmd cmd;
SSqlRes res; SSqlRes res;
......
...@@ -460,7 +460,7 @@ void tscMeterMetaCallBack(void *param, TAOS_RES *res, int code) { ...@@ -460,7 +460,7 @@ void tscMeterMetaCallBack(void *param, TAOS_RES *res, int code) {
code = abs(code); code = abs(code);
pRes->code = code; pRes->code = code;
tscTrace("%p failed to renew meterMeta", pSql); tscTrace("%p failed to renew meterMeta", pSql);
sem_post(&pSql->rspSem); tsem_post(&pSql->rspSem);
} else { } else {
tscTrace("%p renew meterMeta successfully, command:%d, code:%d, thandle:%p, retry:%d", tscTrace("%p renew meterMeta successfully, command:%d, code:%d, thandle:%p, retry:%d",
pSql, pSql->cmd.command, pSql->res.code, pSql->thandle, pSql->retry); pSql, pSql->cmd.command, pSql->res.code, pSql->thandle, pSql->retry);
...@@ -471,7 +471,7 @@ void tscMeterMetaCallBack(void *param, TAOS_RES *res, int code) { ...@@ -471,7 +471,7 @@ void tscMeterMetaCallBack(void *param, TAOS_RES *res, int code) {
code = tscSendMsgToServer(pSql); code = tscSendMsgToServer(pSql);
if (code != 0) { if (code != 0) {
pRes->code = code; pRes->code = code;
sem_post(&pSql->rspSem); tsem_post(&pSql->rspSem);
} }
} }
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
return TSDB_CODE_INVALID_SQL; \ return TSDB_CODE_INVALID_SQL; \
} while (0) } while (0)
static enum { enum {
TSDB_USE_SERVER_TS = 0, TSDB_USE_SERVER_TS = 0,
TSDB_USE_CLI_TS = 1, TSDB_USE_CLI_TS = 1,
}; };
......
...@@ -357,7 +357,7 @@ void *tscProcessMsgFromServer(char *msg, void *ahandle, void *thandle) { ...@@ -357,7 +357,7 @@ void *tscProcessMsgFromServer(char *msg, void *ahandle, void *thandle) {
} }
} }
if (pSql->fp == NULL) sem_wait(&pSql->emptyRspSem); if (pSql->fp == NULL) tsem_wait(&pSql->emptyRspSem);
pRes->rspLen = 0; pRes->rspLen = 0;
if (pRes->code != TSDB_CODE_QUERY_CANCELLED) { if (pRes->code != TSDB_CODE_QUERY_CANCELLED) {
...@@ -402,7 +402,7 @@ void *tscProcessMsgFromServer(char *msg, void *ahandle, void *thandle) { ...@@ -402,7 +402,7 @@ void *tscProcessMsgFromServer(char *msg, void *ahandle, void *thandle) {
} }
if (pSql->fp == NULL) { if (pSql->fp == NULL) {
sem_post(&pSql->rspSem); tsem_post(&pSql->rspSem);
} else { } else {
if (pRes->code == TSDB_CODE_SUCCESS && tscProcessMsgRsp[pCmd->command]) if (pRes->code == TSDB_CODE_SUCCESS && tscProcessMsgRsp[pCmd->command])
code = (*tscProcessMsgRsp[pCmd->command])(pSql); code = (*tscProcessMsgRsp[pCmd->command])(pSql);
...@@ -493,11 +493,11 @@ int tscProcessSql(SSqlObj *pSql) { ...@@ -493,11 +493,11 @@ int tscProcessSql(SSqlObj *pSql) {
} }
if (fp == NULL) { if (fp == NULL) {
sem_post(&pSql->emptyRspSem); tsem_post(&pSql->emptyRspSem);
sem_wait(&pSql->rspSem); tsem_wait(&pSql->rspSem);
assert(pSql->cmd.vnodeIdx == 0); assert(pSql->cmd.vnodeIdx == 0);
sem_post(&pSql->emptyRspSem); tsem_post(&pSql->emptyRspSem);
// set the command flag must be after the semaphore been correctly set. // set the command flag must be after the semaphore been correctly set.
pSql->cmd.command = TSDB_SQL_RETRIEVE_METRIC; pSql->cmd.command = TSDB_SQL_RETRIEVE_METRIC;
...@@ -525,11 +525,11 @@ int tscProcessSql(SSqlObj *pSql) { ...@@ -525,11 +525,11 @@ int tscProcessSql(SSqlObj *pSql) {
return code; return code;
} }
sem_wait(&pSql->rspSem); tsem_wait(&pSql->rspSem);
if (pRes->code == 0 && tscProcessMsgRsp[pCmd->command]) (*tscProcessMsgRsp[pCmd->command])(pSql); if (pRes->code == 0 && tscProcessMsgRsp[pCmd->command]) (*tscProcessMsgRsp[pCmd->command])(pSql);
sem_post(&pSql->emptyRspSem); tsem_post(&pSql->emptyRspSem);
return pRes->code; return pRes->code;
} }
...@@ -725,10 +725,10 @@ static void tscHandleSubRetrievalError(SRetrieveSupport *trsupport, SSqlObj *pSq ...@@ -725,10 +725,10 @@ static void tscHandleSubRetrievalError(SRetrieveSupport *trsupport, SSqlObj *pSq
if (pPObj->fp == NULL) { if (pPObj->fp == NULL) {
// sync query, wait for the master SSqlObj to proceed // sync query, wait for the master SSqlObj to proceed
sem_wait(&pPObj->emptyRspSem); tsem_wait(&pPObj->emptyRspSem);
sem_wait(&pPObj->emptyRspSem); tsem_wait(&pPObj->emptyRspSem);
sem_post(&pPObj->rspSem); tsem_post(&pPObj->rspSem);
pPObj->cmd.command = TSDB_SQL_RETRIEVE_METRIC; pPObj->cmd.command = TSDB_SQL_RETRIEVE_METRIC;
} else { } else {
...@@ -850,10 +850,10 @@ void tscRetrieveFromVnodeCallBack(void *param, TAOS_RES *tres, int numOfRows) { ...@@ -850,10 +850,10 @@ void tscRetrieveFromVnodeCallBack(void *param, TAOS_RES *tres, int numOfRows) {
tscFreeSubSqlObj(trsupport, pSql); tscFreeSubSqlObj(trsupport, pSql);
if (pPObj->fp == NULL) { if (pPObj->fp == NULL) {
sem_wait(&pPObj->emptyRspSem); tsem_wait(&pPObj->emptyRspSem);
sem_wait(&pPObj->emptyRspSem); tsem_wait(&pPObj->emptyRspSem);
sem_post(&pPObj->rspSem); tsem_post(&pPObj->rspSem);
} else { } else {
// set the command flag must be after the semaphore been correctly set. // set the command flag must be after the semaphore been correctly set.
pPObj->cmd.command = TSDB_SQL_RETRIEVE_METRIC; pPObj->cmd.command = TSDB_SQL_RETRIEVE_METRIC;
...@@ -2759,8 +2759,8 @@ static int32_t tscDoGetMeterMeta(SSqlObj *pSql, char *meterId) { ...@@ -2759,8 +2759,8 @@ static int32_t tscDoGetMeterMeta(SSqlObj *pSql, char *meterId) {
tscTrace("%p new pSqlObj:%p to get meterMeta", pSql, pNew); tscTrace("%p new pSqlObj:%p to get meterMeta", pSql, pNew);
if (pSql->fp == NULL) { if (pSql->fp == NULL) {
sem_init(&pNew->rspSem, 0, 0); tsem_init(&pNew->rspSem, 0, 0);
sem_init(&pNew->emptyRspSem, 0, 1); tsem_init(&pNew->emptyRspSem, 0, 1);
code = tscProcessSql(pNew); code = tscProcessSql(pNew);
if (code == TSDB_CODE_SUCCESS) { if (code == TSDB_CODE_SUCCESS) {
...@@ -2911,8 +2911,8 @@ int tscGetMetricMeta(SSqlObj *pSql, char *meterId) { ...@@ -2911,8 +2911,8 @@ int tscGetMetricMeta(SSqlObj *pSql, char *meterId) {
tscTrace("%p allocate new pSqlObj:%p to get metricMeta", pSql, pNew); tscTrace("%p allocate new pSqlObj:%p to get metricMeta", pSql, pNew);
if (pSql->fp == NULL) { if (pSql->fp == NULL) {
sem_init(&pNew->rspSem, 0, 0); tsem_init(&pNew->rspSem, 0, 0);
sem_init(&pNew->emptyRspSem, 0, 1); tsem_init(&pNew->emptyRspSem, 0, 1);
code = tscProcessSql(pNew); code = tscProcessSql(pNew);
pSql->cmd.pMetricMeta = taosGetDataFromCache(tscCacheHandle, tagstr); pSql->cmd.pMetricMeta = taosGetDataFromCache(tscCacheHandle, tagstr);
......
...@@ -63,7 +63,9 @@ TAOS *taos_connect_imp(char *ip, char *user, char *pass, char *db, int port, voi ...@@ -63,7 +63,9 @@ TAOS *taos_connect_imp(char *ip, char *user, char *pass, char *db, int port, voi
} }
if (ip && ip[0]) { if (ip && ip[0]) {
strcpy(tsServerIpStr, ip); if (ip != tsServerIpStr) {
strcpy(tsServerIpStr, ip);
}
tsServerIp = inet_addr(ip); tsServerIp = inet_addr(ip);
} }
...@@ -97,8 +99,8 @@ TAOS *taos_connect_imp(char *ip, char *user, char *pass, char *db, int port, voi ...@@ -97,8 +99,8 @@ TAOS *taos_connect_imp(char *ip, char *user, char *pass, char *db, int port, voi
memset(pSql, 0, sizeof(SSqlObj)); memset(pSql, 0, sizeof(SSqlObj));
pSql->pTscObj = pObj; pSql->pTscObj = pObj;
pSql->signature = pSql; pSql->signature = pSql;
sem_init(&pSql->rspSem, 0, 0); tsem_init(&pSql->rspSem, 0, 0);
sem_init(&pSql->emptyRspSem, 0, 1); tsem_init(&pSql->emptyRspSem, 0, 1);
pObj->pSql = pSql; pObj->pSql = pSql;
pSql->fp = fp; pSql->fp = fp;
pSql->param = param; pSql->param = param;
...@@ -601,7 +603,7 @@ int taos_errno(TAOS *taos) { ...@@ -601,7 +603,7 @@ int taos_errno(TAOS *taos) {
if (pObj == NULL || pObj->signature != pObj) return globalCode; if (pObj == NULL || pObj->signature != pObj) return globalCode;
if (pObj->pSql->res.code == -1) if ((int8_t)(pObj->pSql->res.code) == -1)
code = TSDB_CODE_OTHERS; code = TSDB_CODE_OTHERS;
else else
code = pObj->pSql->res.code; code = pObj->pSql->res.code;
...@@ -616,7 +618,7 @@ char *taos_errstr(TAOS *taos) { ...@@ -616,7 +618,7 @@ char *taos_errstr(TAOS *taos) {
if (pObj == NULL || pObj->signature != pObj) return tsError[globalCode]; if (pObj == NULL || pObj->signature != pObj) return tsError[globalCode];
if (pObj->pSql->res.code == -1) if ((int8_t)(pObj->pSql->res.code) == -1)
code = TSDB_CODE_OTHERS; code = TSDB_CODE_OTHERS;
else else
code = pObj->pSql->res.code; code = pObj->pSql->res.code;
......
...@@ -472,8 +472,8 @@ TAOS_STREAM *taos_open_stream(TAOS *taos, char *sqlstr, void (*fp)(void *param, ...@@ -472,8 +472,8 @@ TAOS_STREAM *taos_open_stream(TAOS *taos, char *sqlstr, void (*fp)(void *param,
return NULL; return NULL;
} }
sem_init(&pSql->rspSem, 0, 0); tsem_init(&pSql->rspSem, 0, 0);
sem_init(&pSql->emptyRspSem, 0, 1); tsem_init(&pSql->emptyRspSem, 0, 1);
SSqlInfo SQLInfo = {0}; SSqlInfo SQLInfo = {0};
tSQLParse(&SQLInfo, pSql->sqlstr); tSQLParse(&SQLInfo, pSql->sqlstr);
......
...@@ -82,7 +82,7 @@ void taos_init_imp() { ...@@ -82,7 +82,7 @@ void taos_init_imp() {
sprintf(temp, "%s/taoslog", logDir); sprintf(temp, "%s/taoslog", logDir);
if (taosInitLog(temp, tsNumOfLogLines, 10) < 0) { if (taosInitLog(temp, tsNumOfLogLines, 10) < 0) {
printf("failed to open log file:%s", temp); printf("failed to open log file in directory:%s\n", logDir);
} }
tsReadGlobalConfig(); tsReadGlobalConfig();
......
...@@ -327,8 +327,8 @@ void tscFreeSqlObj(SSqlObj* pSql) { ...@@ -327,8 +327,8 @@ void tscFreeSqlObj(SSqlObj* pSql) {
} }
if (pSql->fp == NULL) { if (pSql->fp == NULL) {
sem_destroy(&pSql->rspSem); tsem_destroy(&pSql->rspSem);
sem_destroy(&pSql->emptyRspSem); tsem_destroy(&pSql->emptyRspSem);
} }
free(pSql); free(pSql);
......
...@@ -22,6 +22,7 @@ extern "C" { ...@@ -22,6 +22,7 @@ extern "C" {
#include <pthread.h> #include <pthread.h>
#include <semaphore.h> #include <semaphore.h>
#include "os.h"
typedef struct _msg_header { typedef struct _msg_header {
int mid; /* message ID */ int mid; /* message ID */
...@@ -34,8 +35,8 @@ typedef struct _msg_header { ...@@ -34,8 +35,8 @@ typedef struct _msg_header {
typedef struct { typedef struct {
char * name; /* module name */ char * name; /* module name */
pthread_t thread; /* thread ID */ pthread_t thread; /* thread ID */
sem_t emptySem; tsem_t emptySem;
sem_t fullSem; tsem_t fullSem;
int fullSlot; int fullSlot;
int emptySlot; int emptySlot;
int debugFlag; int debugFlag;
......
...@@ -25,6 +25,22 @@ typedef void *tmr_h; ...@@ -25,6 +25,22 @@ typedef void *tmr_h;
extern int tmrDebugFlag; extern int tmrDebugFlag;
extern int taosTmrThreads; extern int taosTmrThreads;
#define tmrError(...) \
if (tmrDebugFlag & DEBUG_ERROR) { \
tprintf("ERROR TMR ", tmrDebugFlag, __VA_ARGS__); \
}
#define tmrWarn(...) \
if (tmrDebugFlag & DEBUG_WARN) { \
tprintf("WARN TMR ", tmrDebugFlag, __VA_ARGS__); \
}
#define tmrTrace(...) \
if (tmrDebugFlag & DEBUG_TRACE) { \
tprintf("TMR ", tmrDebugFlag, __VA_ARGS__); \
}
#define MAX_NUM_OF_TMRCTL 512
#define MSECONDS_PER_TICK 5
void *taosTmrInit(int maxTmr, int resoultion, int longest, char *label); void *taosTmrInit(int maxTmr, int resoultion, int longest, char *label);
tmr_h taosTmrStart(void (*fp)(void *, void *), int mseconds, void *param1, void *handle); tmr_h taosTmrStart(void (*fp)(void *, void *), int mseconds, void *param1, void *handle);
......
...@@ -46,22 +46,6 @@ extern "C" { ...@@ -46,22 +46,6 @@ extern "C" {
} \ } \
} }
#ifdef WINDOWS
#define taosCloseSocket(fd) closesocket(fd)
#define taosWriteSocket(fd, buf, len) send(fd, buf, len, 0)
#define taosReadSocket(fd, buf, len) recv(fd, buf, len, 0)
#else
#define taosCloseSocket(x) \
{ \
if (VALIDFD(x)) { \
close(x); \
x = -1; \
} \
}
#define taosWriteSocket(fd, buf, len) write(fd, buf, len)
#define taosReadSocket(fd, buf, len) read(fd, buf, len)
#endif
#define tclose(x) taosCloseSocket(x) #define tclose(x) taosCloseSocket(x)
#ifdef ASSERTION #ifdef ASSERTION
...@@ -104,42 +88,6 @@ extern "C" { ...@@ -104,42 +88,6 @@ extern "C" {
#define DEFAULT_UNICODE_ENCODEC "UCS-4LE" #define DEFAULT_UNICODE_ENCODEC "UCS-4LE"
#ifdef LINUX
#define SWAP(a, b, c) \
do { \
typeof(a) __tmp = (a); \
(a) = (b); \
(b) = __tmp; \
} while (0)
#define MAX(a, b) \
({ \
typeof(a) __a = (a); \
typeof(b) __b = (b); \
(__a > __b) ? __a : __b; \
})
#define MIN(a, b) \
({ \
typeof(a) __a = (a); \
typeof(b) __b = (b); \
(__a < __b) ? __a : __b; \
})
#else
#define SWAP(a, b, c) \
do { \
c __tmp = (c)(a); \
(a) = (c)(b); \
(b) = __tmp; \
} while (0)
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))
#endif
#define DEFAULT_COMP(x, y) \ #define DEFAULT_COMP(x, y) \
do { \ do { \
if ((x) == (y)) { \ if ((x) == (y)) { \
...@@ -161,12 +109,6 @@ extern "C" { ...@@ -161,12 +109,6 @@ extern "C" {
// align to 8bytes // align to 8bytes
#define ALIGN8(n) ALIGN_NUM(n, 8) #define ALIGN8(n) ALIGN_NUM(n, 8)
#ifdef WINDOWS
#define MILLISECOND_PER_SECOND (1000i64)
#else
#define MILLISECOND_PER_SECOND (1000L)
#endif
#define MILLISECOND_PER_MINUTE (MILLISECOND_PER_SECOND * 60) #define MILLISECOND_PER_MINUTE (MILLISECOND_PER_SECOND * 60)
#define MILLISECOND_PER_HOUR (MILLISECOND_PER_MINUTE * 60) #define MILLISECOND_PER_HOUR (MILLISECOND_PER_MINUTE * 60)
#define MILLISECOND_PER_DAY (MILLISECOND_PER_HOUR * 24) #define MILLISECOND_PER_DAY (MILLISECOND_PER_HOUR * 24)
...@@ -202,7 +144,7 @@ int64_t str2int64(char *str); ...@@ -202,7 +144,7 @@ int64_t str2int64(char *str);
int32_t taosFileRename(char *fullPath, char *suffix, char delimiter, char **dstPath); int32_t taosFileRename(char *fullPath, char *suffix, char delimiter, char **dstPath);
int32_t taosInitTimer(void *(*callback)(void *), int32_t ms); int32_t taosInitTimer(void (*callback)(int), int32_t ms);
/** /**
* murmur hash algorithm * murmur hash algorithm
...@@ -231,24 +173,6 @@ static FORCE_INLINE void taosEncryptPass(uint8_t *inBuf, unsigned int inLen, cha ...@@ -231,24 +173,6 @@ static FORCE_INLINE void taosEncryptPass(uint8_t *inBuf, unsigned int inLen, cha
memcpy(target, context.digest, TSDB_KEY_LEN); memcpy(target, context.digest, TSDB_KEY_LEN);
} }
#ifdef WINDOWS
int32_t __sync_val_compare_and_swap_32(int32_t *ptr, int32_t oldval, int32_t newval);
int32_t __sync_add_and_fetch_32(int32_t *ptr, int32_t val);
int64_t __sync_val_compare_and_swap_64(int64_t *ptr, int64_t oldval, int64_t newval);
int64_t __sync_add_and_fetch_64(int64_t *ptr, int64_t val);
#define twrite write
#ifndef PATH_MAX
#define PATH_MAX 256
#endif
#else
#define __sync_val_compare_and_swap_64 __sync_val_compare_and_swap
#define __sync_val_compare_and_swap_32 __sync_val_compare_and_swap
#define __sync_add_and_fetch_64 __sync_add_and_fetch
#define __sync_add_and_fetch_32 __sync_add_and_fetch
ssize_t tsendfile(int dfd, int sfd, off_t *offset, size_t size);
ssize_t twrite(int fd, void *buf, size_t n);
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
...@@ -4,12 +4,8 @@ PROJECT(TDengine) ...@@ -4,12 +4,8 @@ PROJECT(TDengine)
IF (TD_LINUX) IF (TD_LINUX)
SET(SHELL_BUILD_NAME "ts")
SET(SHELL_FINAL_NAME "taos")
SET(SHELL_CMD_NAME "taos_cmd")
SET(SHELL_TARGET_NAME "taos_target")
INCLUDE_DIRECTORIES(inc ${TD_ROOT_DIR}/src/inc ${TD_ROOT_DIR}/src/client/inc ${TD_OS_DIR}/inc) INCLUDE_DIRECTORIES(inc ${TD_ROOT_DIR}/src/inc ${TD_ROOT_DIR}/src/client/inc ${TD_OS_DIR}/inc)
AUX_SOURCE_DIRECTORY(./src SRC) AUX_SOURCE_DIRECTORY(./src SRC)
LIST(REMOVE_ITEM SRC ./src/shellWindows.c) LIST(REMOVE_ITEM SRC ./src/shellWindows.c)
...@@ -19,16 +15,29 @@ IF (TD_LINUX) ...@@ -19,16 +15,29 @@ IF (TD_LINUX)
ELSEIF (TD_WINDOWS) ELSEIF (TD_WINDOWS)
ADD_DEFINITIONS(-DUSE_LIBICONV)
INCLUDE_DIRECTORIES(${TD_ROOT_DIR}/deps/pthread) INCLUDE_DIRECTORIES(${TD_ROOT_DIR}/deps/pthread)
INCLUDE_DIRECTORIES(${TD_ROOT_DIR}/deps/regex) INCLUDE_DIRECTORIES(${TD_ROOT_DIR}/deps/regex)
INCLUDE_DIRECTORIES(inc ${TD_ROOT_DIR}/src/inc ${TD_ROOT_DIR}/src/client/inc ${TD_OS_DIR}/inc) INCLUDE_DIRECTORIES(inc ${TD_ROOT_DIR}/src/inc ${TD_ROOT_DIR}/src/client/inc ${TD_OS_DIR}/inc)
LIST(APPEND SRC ./src/shellEngine.c) LIST(APPEND SRC ./src/shellEngine.c)
LIST(APPEND SRC ./src/shellMain.c) LIST(APPEND SRC ./src/shellMain.c)
LIST(APPEND SRC ./src/shellWindows.c) LIST(APPEND SRC ./src/shellWindows.c)
ADD_EXECUTABLE(shell ${SRC})
ADD_EXECUTABLE(shell ${SRC})
TARGET_LINK_LIBRARIES(shell taos_static) TARGET_LINK_LIBRARIES(shell taos_static)
SET_TARGET_PROPERTIES(shell PROPERTIES OUTPUT_NAME "taos") SET_TARGET_PROPERTIES(shell PROPERTIES OUTPUT_NAME "taos")
ELSEIF (TD_DARWIN)
INCLUDE_DIRECTORIES(inc ${TD_ROOT_DIR}/src/inc ${TD_ROOT_DIR}/src/client/inc ${TD_OS_DIR}/inc)
LIST(APPEND SRC ./src/shellEngine.c)
LIST(APPEND SRC ./src/shellMain.c)
LIST(APPEND SRC ./src/shellWindows.c)
ADD_EXECUTABLE(shell ${SRC})
TARGET_LINK_LIBRARIES(shell taos_static)
SET_TARGET_PROPERTIES(shell PROPERTIES OUTPUT_NAME "taos")
ENDIF () ENDIF ()
...@@ -34,7 +34,6 @@ struct Command { ...@@ -34,7 +34,6 @@ struct Command {
unsigned endOffset; unsigned endOffset;
}; };
extern void insertChar(Command *cmd, char *c, int size);
extern void backspaceChar(Command *cmd); extern void backspaceChar(Command *cmd);
extern void deleteChar(Command *cmd); extern void deleteChar(Command *cmd);
extern void moveCursorLeft(Command *cmd); extern void moveCursorLeft(Command *cmd);
......
...@@ -34,9 +34,11 @@ ...@@ -34,9 +34,11 @@
/**************** Global variables ****************/ /**************** Global variables ****************/
#ifdef WINDOWS #ifdef WINDOWS
char CLIENT_VERSION[] = "Welcome to the TDengine shell from windows, client version:%s, "; char CLIENT_VERSION[] = "Welcome to the TDengine shell from windows, client version:%s ";
#elif defined(DARWIN)
char CLIENT_VERSION[] = "Welcome to the TDengine shell from mac, client version:%s ";
#else #else
char CLIENT_VERSION[] = "Welcome to the TDengine shell from linux, client version:%s, "; char CLIENT_VERSION[] = "Welcome to the TDengine shell from linux, client version:%s ";
#endif #endif
char SERVER_VERSION[] = "server version:%s\nCopyright (c) 2017 by TAOS Data, Inc. All rights reserved.\n\n"; char SERVER_VERSION[] = "server version:%s\nCopyright (c) 2017 by TAOS Data, Inc. All rights reserved.\n\n";
char PROMPT_HEADER[] = "taos> "; char PROMPT_HEADER[] = "taos> ";
...@@ -441,10 +443,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) { ...@@ -441,10 +443,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
printf("%*d|", l[i], *((int *)row[i])); printf("%*d|", l[i], *((int *)row[i]));
break; break;
case TSDB_DATA_TYPE_BIGINT: case TSDB_DATA_TYPE_BIGINT:
#ifdef WINDOWS #ifdef LINUX
printf("%*lld|", l[i], *((int64_t *)row[i]));
#else
printf("%*ld|", l[i], *((int64_t *)row[i])); printf("%*ld|", l[i], *((int64_t *)row[i]));
#else
printf("%*lld|", l[i], *((int64_t *)row[i]));
#endif #endif
break; break;
case TSDB_DATA_TYPE_FLOAT: case TSDB_DATA_TYPE_FLOAT:
...@@ -464,10 +466,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) { ...@@ -464,10 +466,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
break; break;
case TSDB_DATA_TYPE_TIMESTAMP: case TSDB_DATA_TYPE_TIMESTAMP:
if (args.is_raw_time) { if (args.is_raw_time) {
#ifdef WINDOWS #ifdef LINUX
printf(" %lld|", *(int64_t *)row[i]);
#else
printf(" %ld|", *(int64_t *)row[i]); printf(" %ld|", *(int64_t *)row[i]);
#else
printf(" %lld|", *(int64_t *)row[i]);
#endif #endif
} else { } else {
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) { if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
...@@ -518,10 +520,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) { ...@@ -518,10 +520,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
printf("%d\n", *((int *)row[i])); printf("%d\n", *((int *)row[i]));
break; break;
case TSDB_DATA_TYPE_BIGINT: case TSDB_DATA_TYPE_BIGINT:
#ifdef WINDOWS #ifdef LINUX
printf("%lld\n", *((int64_t *)row[i]));
#else
printf("%ld\n", *((int64_t *)row[i])); printf("%ld\n", *((int64_t *)row[i]));
#else
printf("%lld\n", *((int64_t *)row[i]));
#endif #endif
break; break;
case TSDB_DATA_TYPE_FLOAT: case TSDB_DATA_TYPE_FLOAT:
...@@ -539,10 +541,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) { ...@@ -539,10 +541,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
break; break;
case TSDB_DATA_TYPE_TIMESTAMP: case TSDB_DATA_TYPE_TIMESTAMP:
if (args.is_raw_time) { if (args.is_raw_time) {
#ifdef WINDOWS #ifdef LINUX
printf("%lld\n", *(int64_t *)row[i]);
#else
printf("%ld\n", *(int64_t *)row[i]); printf("%ld\n", *(int64_t *)row[i]);
#else
printf("%lld\n", *(int64_t *)row[i]);
#endif #endif
} else { } else {
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) { if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
...@@ -588,10 +590,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) { ...@@ -588,10 +590,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
fprintf(fp, "%d", *((int *)row[i])); fprintf(fp, "%d", *((int *)row[i]));
break; break;
case TSDB_DATA_TYPE_BIGINT: case TSDB_DATA_TYPE_BIGINT:
#ifdef WINDOWS #ifdef LINUX
fprintf(fp, "%lld", *((int64_t *)row[i]));
#else
fprintf(fp, "%ld", *((int64_t *)row[i])); fprintf(fp, "%ld", *((int64_t *)row[i]));
#else
fprintf(fp, "%lld", *((int64_t *)row[i]));
#endif #endif
break; break;
case TSDB_DATA_TYPE_FLOAT: case TSDB_DATA_TYPE_FLOAT:
...@@ -607,10 +609,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) { ...@@ -607,10 +609,10 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
fprintf(fp, "\'%s\'", t_str); fprintf(fp, "\'%s\'", t_str);
break; break;
case TSDB_DATA_TYPE_TIMESTAMP: case TSDB_DATA_TYPE_TIMESTAMP:
#ifdef WINDOWS #ifdef LINUX
fprintf(fp, "%lld", *(int64_t *)row[i]);
#else
fprintf(fp, "%ld", *(int64_t *)row[i]); fprintf(fp, "%ld", *(int64_t *)row[i]);
#else
fprintf(fp, "%lld", *(int64_t *)row[i]);
#endif #endif
break; break;
default: default:
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
int indicator = 1; int indicator = 1;
struct termios oldtio; struct termios oldtio;
void insertChar(Command *cmd, char *c, int size);
const char *argp_program_version = version; const char *argp_program_version = version;
const char *argp_program_bug_address = "<support@taosdata.com>"; const char *argp_program_bug_address = "<support@taosdata.com>";
static char doc[] = ""; static char doc[] = "";
......
...@@ -31,6 +31,7 @@ int32_t TIMESTAMP_OUTPUT_LENGTH = 22; ...@@ -31,6 +31,7 @@ int32_t TIMESTAMP_OUTPUT_LENGTH = 22;
// TODO: IMPLEMENT INTERRUPT HANDLER. // TODO: IMPLEMENT INTERRUPT HANDLER.
void interruptHandler(int signum) { void interruptHandler(int signum) {
#ifdef LINUX
TAOS_RES* res = taos_use_result(con); TAOS_RES* res = taos_use_result(con);
taos_stop_query(res); taos_stop_query(res);
if (res != NULL) { if (res != NULL) {
...@@ -41,6 +42,10 @@ void interruptHandler(int signum) { ...@@ -41,6 +42,10 @@ void interruptHandler(int signum) {
tscQueueAsyncFreeResult(res); tscQueueAsyncFreeResult(res);
} }
result = NULL; result = NULL;
#else
printf("\nReceive ctrl+c or other signal, quit shell.\n");
exit(0);
#endif
} }
int checkVersion() { int checkVersion() {
......
...@@ -4,3 +4,4 @@ PROJECT(TDengine) ...@@ -4,3 +4,4 @@ PROJECT(TDengine)
ADD_SUBDIRECTORY(linux) ADD_SUBDIRECTORY(linux)
ADD_SUBDIRECTORY(windows) ADD_SUBDIRECTORY(windows)
ADD_SUBDIRECTORY(darwin)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(TDengine)
IF (TD_DARWIN)
AUX_SOURCE_DIRECTORY(src SRC)
INCLUDE_DIRECTORIES(inc ${TD_ROOT_DIR}/src/inc)
ADD_LIBRARY(os ${SRC})
ENDIF ()
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TDENGINE_PLATFORM_DARWIN_H
#define TDENGINE_PLATFORM_DARWIN_H
#include <ifaddrs.h>
#include <netdb.h>
#include <pwd.h>
#include <syslog.h>
#include <termios.h>
#include <wordexp.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <sys/uio.h>
#include <sys/un.h>
#include <stdint.h>
#include <pthread.h>
#include <stdbool.h>
#include <limits.h>
#include <locale.h>
#include <dispatch/dispatch.h>
#define htobe64 htonll
#define taosCloseSocket(x) \
{ \
if (VALIDFD(x)) { \
close(x); \
x = -1; \
} \
}
#define taosWriteSocket(fd, buf, len) write(fd, buf, len)
#define taosReadSocket(fd, buf, len) read(fd, buf, len)
#define __sync_val_compare_and_swap_64 __sync_val_compare_and_swap
#define __sync_val_compare_and_swap_32 __sync_val_compare_and_swap
#define __sync_add_and_fetch_64 __sync_add_and_fetch
#define __sync_add_and_fetch_32 __sync_add_and_fetch
#define SWAP(a, b, c) \
do { \
typeof(a) __tmp = (a); \
(a) = (b); \
(b) = __tmp; \
} while (0)
#define MAX(a, b) \
({ \
typeof(a) __a = (a); \
typeof(b) __b = (b); \
(__a > __b) ? __a : __b; \
})
#define MIN(a, b) \
({ \
typeof(a) __a = (a); \
typeof(b) __b = (b); \
(__a < __b) ? __a : __b; \
})
#define MILLISECOND_PER_SECOND (1000L)
#define tsem_t dispatch_semaphore_t
int tsem_init(dispatch_semaphore_t *sem, int pshared, unsigned int value);
int tsem_wait(dispatch_semaphore_t *sem);
int tsem_post(dispatch_semaphore_t *sem);
int tsem_destroy(dispatch_semaphore_t *sem);
ssize_t twrite(int fd, void *buf, size_t n);
char *taosCharsetReplace(char *charsetstr);
bool taosCheckPthreadValid(pthread_t thread);
void taosResetPthread(pthread_t *thread);
int64_t taosGetPthreadId();
int taosSetNonblocking(int sock, int on);
int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen);
void tsPrintOsInfo();
char *taosCharsetReplace(char *charsetstr);
void tsPrintOsInfo();
void taosGetSystemInfo();
void taosKillSystem();
bool taosSkipSocketCheck();
bool taosGetDisk();
typedef int(*__compar_fn_t)(const void *, const void *);
// for send function in tsocket.c
#define MSG_NOSIGNAL 0
#define SO_NO_CHECK 0x1234
#define SOL_TCP 0x1234
#define TCP_KEEPIDLE 0x1234
#ifndef PTHREAD_MUTEX_RECURSIVE_NP
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#endif
#endif
\ No newline at end of file
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <errno.h>
#include <fcntl.h>
#include <ifaddrs.h>
#include <netdb.h>
#include <netinet/in.h>
#include <pthread.h>
#include <signal.h>
#include <stdint.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/un.h>
#include <unistd.h>
#include <sys/utsname.h>
#include "tglobalcfg.h"
#include "tlog.h"
#include "tsdb.h"
#include "tutil.h"
char configDir[TSDB_FILENAME_LEN] = "~/TDengine/cfg";
char tsDirectory[TSDB_FILENAME_LEN] = "~/TDengine/data";
char dataDir[TSDB_FILENAME_LEN] = "~/TDengine/data";
char logDir[TSDB_FILENAME_LEN] = "~/TDengine/log";
char scriptDir[TSDB_FILENAME_LEN] = "~/TDengine/script";
int64_t str2int64(char *str) {
char *endptr = NULL;
return strtoll(str, &endptr, 10);
}
/*
to make taosMsleep work,
signal SIGALRM shall be blocked in the calling thread,
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGALRM);
pthread_sigmask(SIG_BLOCK, &set, NULL);
*/
void taosMsleep(int mseconds) {
struct timeval timeout;
int seconds, useconds;
seconds = mseconds / 1000;
useconds = (mseconds % 1000) * 1000;
timeout.tv_sec = seconds;
timeout.tv_usec = useconds;
/* sigset_t set; */
/* sigemptyset(&set); */
/* sigaddset(&set, SIGALRM); */
/* pthread_sigmask(SIG_BLOCK, &set, NULL); */
select(0, NULL, NULL, NULL, &timeout);
/* pthread_sigmask(SIG_UNBLOCK, &set, NULL); */
}
bool taosCheckPthreadValid(pthread_t thread) { return thread != 0; }
void taosResetPthread(pthread_t *thread) { *thread = 0; }
int64_t taosGetPthreadId() { return (int64_t)pthread_self(); }
/*
* Function to get the private ip address of current machine. If get IP
* successfully, return 0, else, return -1. The return values is ip.
*
* Use:
* if (taosGetPrivateIp(ip) != 0) {
* perror("Fail to get private IP address\n");
* exit(EXIT_FAILURE);
* }
*/
int taosGetPrivateIp(char *const ip) {
bool hasLoCard = false;
struct ifaddrs *ifaddr, *ifa;
int family, s;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1) {
return -1;
}
/* Walk through linked list, maintaining head pointer so we can free list later */
int flag = 0;
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL) continue;
family = ifa->ifa_addr->sa_family;
if (strcmp("lo", ifa->ifa_name) == 0) {
hasLoCard = true;
continue;
}
if (family == AF_INET) {
/* printf("%-8s", ifa->ifa_name); */
s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6),
host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if (s != 0) {
freeifaddrs(ifaddr);
return -1;
}
strcpy(ip, host);
flag = 1;
break;
}
}
freeifaddrs(ifaddr);
if (flag) {
return 0;
} else {
if (hasLoCard) {
pPrint("no net card was found, use lo:127.0.0.1 as default");
strcpy(ip, "127.0.0.1");
return 0;
}
return -1;
}
}
int taosSetNonblocking(int sock, int on) {
int flags = 0;
if ((flags = fcntl(sock, F_GETFL, 0)) < 0) {
pError("fcntl(F_GETFL) error: %d (%s)\n", errno, strerror(errno));
return 1;
}
if (on)
flags |= O_NONBLOCK;
else
flags &= ~O_NONBLOCK;
if ((flags = fcntl(sock, F_SETFL, flags)) < 0) {
pError("fcntl(F_SETFL) error: %d (%s)\n", errno, strerror(errno));
return 1;
}
return 0;
}
int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen) {
if (level == SOL_SOCKET && optname == SO_SNDBUF) {
return 0;
}
if (level == SOL_SOCKET && optname == SO_RCVBUF) {
return 0;
}
return setsockopt(socketfd, level, optname, optval, (socklen_t)optlen);
}
int taosOpenUDClientSocket(char *ip, short port) {
int sockFd = 0;
struct sockaddr_un serverAddr;
int ret;
char name[128];
sprintf(name, "%s.%d", ip, port);
sockFd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sockFd < 0) {
pError("failed to open the UD socket:%s, reason:%s", name, strerror(errno));
return -1;
}
memset((char *)&serverAddr, 0, sizeof(serverAddr));
serverAddr.sun_family = AF_UNIX;
strcpy(serverAddr.sun_path + 1, name);
ret = connect(sockFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
if (ret != 0) {
pError("failed to connect UD socket, name:%d, reason: %s", name, strerror(errno));
sockFd = -1;
}
return sockFd;
}
int taosOpenUDServerSocket(char *ip, short port) {
struct sockaddr_un serverAdd;
int sockFd;
char name[128];
pTrace("open ud socket:%s", name);
// if (tsAllowLocalhost) ip = "0.0.0.0";
sprintf(name, "%s.%d", ip, port);
bzero((char *)&serverAdd, sizeof(serverAdd));
serverAdd.sun_family = AF_UNIX;
strcpy(serverAdd.sun_path + 1, name);
unlink(name);
if ((sockFd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
pError("failed to open UD socket:%s, reason:%s", name, strerror(errno));
return -1;
}
/* bind socket to server address */
if (bind(sockFd, (struct sockaddr *)&serverAdd, sizeof(serverAdd)) < 0) {
pError("bind socket:%s failed, reason:%s", name, strerror(errno));
tclose(sockFd);
return -1;
}
if (listen(sockFd, 10) < 0) {
pError("listen socket:%s failed, reason:%s", name, strerror(errno));
return -1;
}
return sockFd;
}
int taosInitTimer(void (*callback)(int), int ms) {
signal(SIGALRM, callback);
struct itimerval tv;
tv.it_interval.tv_sec = 0; /* my timer resolution */
tv.it_interval.tv_usec = 1000 * ms; // resolution is in msecond
tv.it_value = tv.it_interval;
return setitimer(ITIMER_REAL, &tv, NULL);
}
char *taosCharsetReplace(char *charsetstr) {
return charsetstr;
}
void taosGetSystemTimezone() {
// get and set default timezone
SGlobalConfig *cfg_timezone = tsGetConfigOption("timezone");
if (cfg_timezone && cfg_timezone->cfgStatus < TSDB_CFG_CSTATUS_DEFAULT) {
char *tz = getenv("TZ");
if (tz == NULL || strlen(tz) == 0) {
strcpy(tsTimezone, "not configured");
}
else {
strcpy(tsTimezone, tz);
}
cfg_timezone->cfgStatus = TSDB_CFG_CSTATUS_DEFAULT;
pPrint("timezone not configured, use default");
}
}
void taosGetSystemLocale() {
// get and set default locale
SGlobalConfig *cfg_locale = tsGetConfigOption("locale");
if (cfg_locale && cfg_locale->cfgStatus < TSDB_CFG_CSTATUS_DEFAULT) {
char *locale = setlocale(LC_CTYPE, "chs");
if (locale != NULL) {
strncpy(tsLocale, locale, sizeof(tsLocale) / sizeof(tsLocale[0]));
cfg_locale->cfgStatus = TSDB_CFG_CSTATUS_DEFAULT;
pPrint("locale not configured, set to default:%s", tsLocale);
}
}
SGlobalConfig *cfg_charset = tsGetConfigOption("charset");
if (cfg_charset && cfg_charset->cfgStatus < TSDB_CFG_CSTATUS_DEFAULT) {
strcpy(tsCharset, "cp936");
cfg_charset->cfgStatus = TSDB_CFG_CSTATUS_DEFAULT;
pPrint("charset not configured, set to default:%s", tsCharset);
}
}
void tsPrintOsInfo() {}
void taosKillSystem() {
tError("function taosKillSystem, exit!");
exit(0);
}
bool taosGetDisk() {
return true;
}
void taosGetSystemInfo() {
taosGetSystemTimezone();
taosGetSystemLocale();
}
void *taosInitTcpClient(char *ip, short port, char *flabel, int num, void *fp, void *shandle) {
tError("function taosInitTcpClient is not implemented in darwin system, exit!");
exit(0);
}
void taosCloseTcpClientConnection(void *chandle) {
tError("function taosCloseTcpClientConnection is not implemented in darwin system, exit!");
exit(0);
}
void *taosOpenTcpClientConnection(void *shandle, void *thandle, char *ip, short port) {
tError("function taosOpenTcpClientConnection is not implemented in darwin system, exit!");
exit(0);
}
int taosSendTcpClientData(unsigned int ip, short port, char *data, int len, void *chandle) {
tError("function taosSendTcpClientData is not implemented in darwin system, exit!");
exit(0);
}
void taosCleanUpTcpClient(void *chandle) {
tError("function taosCleanUpTcpClient is not implemented in darwin system, exit!");
exit(0);
}
void taosCloseTcpServerConnection(void *chandle) {
tError("function taosCloseTcpServerConnection is not implemented in darwin system, exit!");
exit(0);
}
void taosCleanUpTcpServer(void *handle) {
tError("function taosCleanUpTcpServer is not implemented in darwin system, exit!");
exit(0);
}
void *taosInitTcpServer(char *ip, short port, char *label, int numOfThreads, void *fp, void *shandle) {
tError("function taosInitTcpServer is not implemented in darwin system, exit!");
exit(0);
}
int taosSendTcpServerData(unsigned int ip, short port, char *data, int len, void *chandle) {
tError("function taosSendTcpServerData is not implemented in darwin system, exit!");
exit(0);
}
void taosFreeMsgHdr(void *hdr) {
tError("function taosFreeMsgHdr is not implemented in darwin system, exit!");
exit(0);
}
int taosMsgHdrSize(void *hdr) {
tError("function taosMsgHdrSize is not implemented in darwin system, exit!");
exit(0);
}
void taosSendMsgHdr(void *hdr, int fd) {
tError("function taosSendMsgHdr is not implemented in darwin system, exit!");
exit(0);
}
void taosInitMsgHdr(void **hdr, void *dest, int maxPkts) {
tError("function taosInitMsgHdr is not implemented in darwin system, exit!");
exit(0);
}
void taosSetMsgHdrData(void *hdr, char *data, int dataLen) {
tError("function taosSetMsgHdrData is not implemented in darwin system, exit!");
exit(0);
}
ssize_t twrite(int fd, void *buf, size_t n) {
size_t nleft = n;
ssize_t nwritten = 0;
char *tbuf = (char *)buf;
while (nleft > 0) {
nwritten = write(fd, (void *)tbuf, nleft);
if (nwritten < 0) {
if (errno == EINTR) {
continue;
}
return -1;
}
nleft -= nwritten;
tbuf += nwritten;
}
return n;
}
bool taosSkipSocketCheck() {
return true;
}
int tsem_init(dispatch_semaphore_t *sem, int pshared, unsigned int value) {
*sem = dispatch_semaphore_create(value);
if (*sem == NULL) {
return -1;
} else {
return 0;
}
}
int tsem_wait(dispatch_semaphore_t *sem) {
dispatch_semaphore_wait(*sem, DISPATCH_TIME_FOREVER);
return 0;
}
int tsem_post(dispatch_semaphore_t *sem) {
dispatch_semaphore_signal(*sem);
return 0;
}
int tsem_destroy(dispatch_semaphore_t *sem) {
return 0;
}
\ No newline at end of file
...@@ -45,6 +45,54 @@ ...@@ -45,6 +45,54 @@
#include <limits.h> #include <limits.h>
#include <sys/sendfile.h> #include <sys/sendfile.h>
#define taosCloseSocket(x) \
{ \
if (VALIDFD(x)) { \
close(x); \
x = -1; \
} \
}
#define taosWriteSocket(fd, buf, len) write(fd, buf, len)
#define taosReadSocket(fd, buf, len) read(fd, buf, len)
#define __sync_val_compare_and_swap_64 __sync_val_compare_and_swap
#define __sync_val_compare_and_swap_32 __sync_val_compare_and_swap
#define __sync_add_and_fetch_64 __sync_add_and_fetch
#define __sync_add_and_fetch_32 __sync_add_and_fetch
#define SWAP(a, b, c) \
do { \
typeof(a) __tmp = (a); \
(a) = (b); \
(b) = __tmp; \
} while (0)
#define MAX(a, b) \
({ \
typeof(a) __a = (a); \
typeof(b) __b = (b); \
(__a > __b) ? __a : __b; \
})
#define MIN(a, b) \
({ \
typeof(a) __a = (a); \
typeof(b) __b = (b); \
(__a < __b) ? __a : __b; \
})
#define MILLISECOND_PER_SECOND (1000L)
#define tsem_t sem_t
#define tsem_init sem_init
#define tsem_wait sem_wait
#define tsem_post sem_post
#define tsem_destroy sem_destroy
ssize_t tsendfile(int dfd, int sfd, off_t *offset, size_t size);
ssize_t twrite(int fd, void *buf, size_t n);
bool taosCheckPthreadValid(pthread_t thread); bool taosCheckPthreadValid(pthread_t thread);
void taosResetPthread(pthread_t *thread); void taosResetPthread(pthread_t *thread);
...@@ -63,6 +111,6 @@ void taosGetSystemInfo(); ...@@ -63,6 +111,6 @@ void taosGetSystemInfo();
void taosKillSystem(); void taosKillSystem();
bool taosIsRunningWSLv1(); bool taosSkipSocketCheck();
#endif #endif
\ No newline at end of file
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "tlog.h" #include "tlog.h"
#include "tsdb.h" #include "tsdb.h"
#include "tutil.h" #include "tutil.h"
#include "ttimer.h"
char configDir[TSDB_FILENAME_LEN] = "/etc/taos"; char configDir[TSDB_FILENAME_LEN] = "/etc/taos";
char tsDirectory[TSDB_FILENAME_LEN] = "/var/lib/taos"; char tsDirectory[TSDB_FILENAME_LEN] = "/var/lib/taos";
...@@ -224,32 +225,61 @@ int taosOpenUDServerSocket(char *ip, short port) { ...@@ -224,32 +225,61 @@ int taosOpenUDServerSocket(char *ip, short port) {
return sockFd; return sockFd;
} }
// The callback functions MUST free the param pass to it after finishing use it. void *taosProcessAlarmSignal(void *tharg) {
int taosInitTimer(void *(*callback)(void *), int ms) { // Block the signal
/******************************************************** sigset_t sigset;
* Create SIGALRM loop thread sigemptyset(&sigset);
********************************************************/ sigaddset(&sigset, SIGALRM);
pthread_t thread; sigprocmask(SIG_BLOCK, &sigset, NULL);
pthread_attr_t tattr; void (*callback)(int) = tharg;
if (pthread_attr_init(&tattr)) {
return -1; timer_t timerId;
struct sigevent sevent;
sevent.sigev_notify = SIGEV_THREAD_ID;
sevent._sigev_un._tid = syscall(__NR_gettid);
sevent.sigev_signo = SIGALRM;
if (timer_create(CLOCK_REALTIME, &sevent, &timerId) == -1) {
tmrError("Failed to create timer");
} }
if (pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED)) { struct itimerspec ts;
return -1; ts.it_value.tv_sec = 0;
ts.it_value.tv_nsec = 1000000 * MSECONDS_PER_TICK;
ts.it_interval.tv_sec = 0;
ts.it_interval.tv_nsec = 1000000 * MSECONDS_PER_TICK;
if (timer_settime(timerId, 0, &ts, NULL)) {
tmrError("Failed to init timer");
return NULL;
} }
int *tms = (int *) malloc(sizeof(int)); int signo;
*tms = ms; while (1) {
if (pthread_create(&thread, &tattr, callback, (void *) tms)) { if (sigwait(&sigset, &signo)) {
free(tms); tmrError("Failed to wait signal: number %d", signo);
return -1; continue;
}
/* printf("Signal handling: number %d ......\n", signo); */
callback(0);
} }
if (pthread_attr_destroy(&tattr)) { assert(0);
return -1; return NULL;
}
int taosInitTimer(void (*callback)(int), int ms) {
pthread_t thread;
pthread_attr_t tattr;
pthread_attr_init(&tattr);
pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
if (pthread_create(&thread, &tattr, taosProcessAlarmSignal, callback) != 0) {
tmrError("failed to create timer thread");
return -1;
} }
pthread_attr_destroy(&tattr);
return 0; return 0;
} }
...@@ -296,16 +326,15 @@ ssize_t twrite(int fd, void *buf, size_t n) { ...@@ -296,16 +326,15 @@ ssize_t twrite(int fd, void *buf, size_t n) {
return n; return n;
} }
// check if the linux running is WSL bool taosSkipSocketCheck() {
bool taosIsRunningWSLv1() {
struct utsname buf; struct utsname buf;
if (uname(&buf)) { if (uname(&buf)) {
pPrint(" can't fetch os info"); pPrint("can't fetch os info");
return false; return false;
} }
if (strstr(buf.release, "Microsoft") != 0) { if (strstr(buf.release, "Microsoft") != 0) {
pPrint(" using WSLv1"); pPrint("using WSLv1");
return true; return true;
} }
......
...@@ -64,6 +64,38 @@ extern "C" { ...@@ -64,6 +64,38 @@ extern "C" {
#define in_addr_t unsigned long #define in_addr_t unsigned long
#define socklen_t int #define socklen_t int
#define htobe64 htonll #define htobe64 htonll
#define twrite write
#ifndef PATH_MAX
#define PATH_MAX 256
#endif
#define taosCloseSocket(fd) closesocket(fd)
#define taosWriteSocket(fd, buf, len) send(fd, buf, len, 0)
#define taosReadSocket(fd, buf, len) recv(fd, buf, len, 0)
int32_t __sync_val_compare_and_swap_32(int32_t *ptr, int32_t oldval, int32_t newval);
int32_t __sync_add_and_fetch_32(int32_t *ptr, int32_t val);
int64_t __sync_val_compare_and_swap_64(int64_t *ptr, int64_t oldval, int64_t newval);
int64_t __sync_add_and_fetch_64(int64_t *ptr, int64_t val);
#define SWAP(a, b, c) \
do { \
c __tmp = (c)(a); \
(a) = (c)(b); \
(b) = __tmp; \
} while (0)
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MILLISECOND_PER_SECOND (1000i64)
#define tsem_t sem_t
#define tsem_init sem_init
#define tsem_wait sem_wait
#define tsem_post sem_post
#define tsem_destroy sem_destroy
int getline(char **lineptr, size_t *n, FILE *stream); int getline(char **lineptr, size_t *n, FILE *stream);
...@@ -124,7 +156,7 @@ int sigaction(int, struct sigaction *, void *); ...@@ -124,7 +156,7 @@ int sigaction(int, struct sigaction *, void *);
void sleep(int mseconds); void sleep(int mseconds);
bool taosIsRunningWSLv1(); bool taosSkipSocketCheck();
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -47,10 +47,6 @@ int64_t taosGetPthreadId() { ...@@ -47,10 +47,6 @@ int64_t taosGetPthreadId() {
} }
int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen) { int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen) {
if (level == SOL_SOCKET && optname == SO_NO_CHECK) {
return 0;
}
if (level == SOL_TCP && optname == TCP_KEEPCNT) { if (level == SOL_TCP && optname == TCP_KEEPCNT) {
return 0; return 0;
} }
...@@ -195,8 +191,10 @@ int wordexp(const char *words, wordexp_t *pwordexp, int flags) { ...@@ -195,8 +191,10 @@ int wordexp(const char *words, wordexp_t *pwordexp, int flags) {
} }
void wordfree(wordexp_t *pwordexp) {} void wordfree(wordexp_t *pwordexp) {}
void taosGetDisk() {} void taosGetDisk() {}
bool taosIsRunningWSLv1() {
bool taosSkipSocketCheck() {
return false; return false;
} }
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#pragma warning( disable : 4244 ) #pragma warning( disable : 4244 )
typedef void(*win_timer_f)(int signo); typedef void (*win_timer_f)(int signo);
void WINAPI taosWinOnTimer(UINT wTimerID, UINT msg, DWORD_PTR dwUser, DWORD_PTR dwl, DWORD_PTR dw2) void WINAPI taosWinOnTimer(UINT wTimerID, UINT msg, DWORD_PTR dwUser, DWORD_PTR dwl, DWORD_PTR dw2)
{ {
......
...@@ -6,6 +6,11 @@ INCLUDE_DIRECTORIES(inc ${TD_ROOT_DIR}/src/inc ${TD_OS_DIR}/inc) ...@@ -6,6 +6,11 @@ INCLUDE_DIRECTORIES(inc ${TD_ROOT_DIR}/src/inc ${TD_OS_DIR}/inc)
IF (TD_LINUX) IF (TD_LINUX)
AUX_SOURCE_DIRECTORY(./src SRC) AUX_SOURCE_DIRECTORY(./src SRC)
ELSEIF (TD_DARWIN)
LIST(APPEND SRC ./src/thaship.c)
LIST(APPEND SRC ./src/trpc.c)
LIST(APPEND SRC ./src/tstring.c)
LIST(APPEND SRC ./src/tudp.c)
ELSEIF (TD_WINDOWS) ELSEIF (TD_WINDOWS)
INCLUDE_DIRECTORIES(${TD_ROOT_DIR}/deps/pthread) INCLUDE_DIRECTORIES(${TD_ROOT_DIR}/deps/pthread)
LIST(APPEND SRC ./src/thaship.c) LIST(APPEND SRC ./src/thaship.c)
......
...@@ -61,5 +61,41 @@ ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Windows") ...@@ -61,5 +61,41 @@ ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
LIST(APPEND SRC ./src/version.c) LIST(APPEND SRC ./src/version.c)
ADD_LIBRARY(tutil ${SRC}) ADD_LIBRARY(tutil ${SRC})
TARGET_LINK_LIBRARIES(tutil iconv regex pthread os winmm IPHLPAPI ws2_32) TARGET_LINK_LIBRARIES(tutil iconv regex pthread os winmm IPHLPAPI ws2_32)
ELSEIF (TD_DARWIN)
ADD_DEFINITIONS(-DUSE_LIBICONV)
INCLUDE_DIRECTORIES(${TD_ROOT_DIR}/src/inc)
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
LIST(APPEND SRC ./src/ihash.c)
LIST(APPEND SRC ./src/shash.c)
LIST(APPEND SRC ./src/sql.c)
LIST(APPEND SRC ./src/tbase64.c)
LIST(APPEND SRC ./src/tcache.c)
LIST(APPEND SRC ./src/textbuffer.c)
LIST(APPEND SRC ./src/tglobalcfg.c)
LIST(APPEND SRC ./src/thash.c)
LIST(APPEND SRC ./src/thashutil.c)
LIST(APPEND SRC ./src/thistogram.c)
LIST(APPEND SRC ./src/tidpool.c)
LIST(APPEND SRC ./src/tinterpolation.c)
LIST(APPEND SRC ./src/tlog.c)
LIST(APPEND SRC ./src/tlosertree.c)
LIST(APPEND SRC ./src/tmd5.c)
LIST(APPEND SRC ./src/tmempool.c)
LIST(APPEND SRC ./src/tmodule.c)
LIST(APPEND SRC ./src/tsched.c)
LIST(APPEND SRC ./src/tskiplist.c)
LIST(APPEND SRC ./src/tsocket.c)
LIST(APPEND SRC ./src/tstatus.c)
LIST(APPEND SRC ./src/tstoken.c)
LIST(APPEND SRC ./src/ttime.c)
LIST(APPEND SRC ./src/ttimer.c)
LIST(APPEND SRC ./src/ttokenizer.c)
LIST(APPEND SRC ./src/ttypes.c)
LIST(APPEND SRC ./src/tutil.c)
LIST(APPEND SRC ./src/version.c)
ADD_LIBRARY(tutil ${SRC})
TARGET_LINK_LIBRARIES(tutil iconv pthread os)
ENDIF () ENDIF ()
...@@ -615,11 +615,11 @@ void tsReadGlobalLogConfig() { ...@@ -615,11 +615,11 @@ void tsReadGlobalLogConfig() {
} }
wordfree(&full_path); wordfree(&full_path);
tsReadLogOption("logDir", logDir);
sprintf(fileName, "%s/taos.cfg", configDir); sprintf(fileName, "%s/taos.cfg", configDir);
fp = fopen(fileName, "r"); fp = fopen(fileName, "r");
if (fp == NULL) { if (fp == NULL) {
printf("option file:%s not found, all options are set to system default\n", fileName); printf("\noption file:%s not found, all options are set to system default\n", fileName);
tsReadLogOption("logDir", logDir);
return; return;
} }
......
...@@ -453,7 +453,7 @@ void tHistogramPrint(SHistogramInfo* pHisto) { ...@@ -453,7 +453,7 @@ void tHistogramPrint(SHistogramInfo* pHisto) {
printf("total entries: %d, elements: %d\n", pHisto->numOfEntries, pHisto->numOfElems); printf("total entries: %d, elements: %d\n", pHisto->numOfEntries, pHisto->numOfElems);
#if defined(USE_ARRAYLIST) #if defined(USE_ARRAYLIST)
for (int32_t i = 0; i < pHisto->numOfEntries; ++i) { for (int32_t i = 0; i < pHisto->numOfEntries; ++i) {
printf("%d: (%f, %ld)\n", i + 1, pHisto->elems[i].val, pHisto->elems[i].num); printf("%d: (%f, %lld)\n", i + 1, pHisto->elems[i].val, pHisto->elems[i].num);
} }
#else #else
tSkipListNode* pNode = pHisto->pList->pHead.pForward[0]; tSkipListNode* pNode = pHisto->pList->pHead.pForward[0];
......
...@@ -55,7 +55,7 @@ typedef struct { ...@@ -55,7 +55,7 @@ typedef struct {
int stop; int stop;
pthread_t asyncThread; pthread_t asyncThread;
pthread_mutex_t buffMutex; pthread_mutex_t buffMutex;
sem_t buffNotEmpty; tsem_t buffNotEmpty;
} SLogBuff; } SLogBuff;
int uDebugFlag = 131; // all the messages int uDebugFlag = 131; // all the messages
...@@ -113,7 +113,7 @@ void taosStopLog() { ...@@ -113,7 +113,7 @@ void taosStopLog() {
void taosCloseLogger() { void taosCloseLogger() {
taosStopLog(); taosStopLog();
sem_post(&(logHandle->buffNotEmpty)); tsem_post(&(logHandle->buffNotEmpty));
if (taosCheckPthreadValid(logHandle->asyncThread)) { if (taosCheckPthreadValid(logHandle->asyncThread)) {
pthread_join(logHandle->asyncThread, NULL); pthread_join(logHandle->asyncThread, NULL);
} }
...@@ -211,7 +211,7 @@ bool taosCheckFileIsOpen(char *logFileName) { ...@@ -211,7 +211,7 @@ bool taosCheckFileIsOpen(char *logFileName) {
int fd = open(logFileName, O_WRONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO); int fd = open(logFileName, O_WRONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
if (fd < 0) { if (fd < 0) {
printf("failed to open log file:%s, reason:%s\n", logFileName, strerror(errno)); printf("\nfailed to open log file:%s, reason:%s\n", logFileName, strerror(errno));
return true; return true;
} }
...@@ -286,7 +286,7 @@ int taosOpenLogFileWithMaxLines(char *fn, int maxLines, int maxFileNum) { ...@@ -286,7 +286,7 @@ int taosOpenLogFileWithMaxLines(char *fn, int maxLines, int maxFileNum) {
logHandle->fd = open(name, O_WRONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO); logHandle->fd = open(name, O_WRONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
if (logHandle->fd < 0) { if (logHandle->fd < 0) {
printf("failed to open log file:%s, reason:%s\n", name, strerror(errno)); printf("\nfailed to open log file:%s, reason:%s\n", name, strerror(errno));
return -1; return -1;
} }
taosLockFile(logHandle->fd); taosLockFile(logHandle->fd);
...@@ -318,7 +318,7 @@ char *tprefix(char *prefix) { ...@@ -318,7 +318,7 @@ char *tprefix(char *prefix) {
curTime = timeSecs.tv_sec; curTime = timeSecs.tv_sec;
ptm = localtime_r(&curTime, &Tm); ptm = localtime_r(&curTime, &Tm);
#ifdef WINDOWS #ifndef LINUX
sprintf(prefix, "%02d/%02d %02d:%02d:%02d.%06d 0x%lld ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, sprintf(prefix, "%02d/%02d %02d:%02d:%02d.%06d 0x%lld ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min,
ptm->tm_sec, (int)timeSecs.tv_usec, taosGetPthreadId()); ptm->tm_sec, (int)timeSecs.tv_usec, taosGetPthreadId());
#else #else
...@@ -345,7 +345,7 @@ void tprintf(const char *const flags, int dflag, const char *const format, ...) ...@@ -345,7 +345,7 @@ void tprintf(const char *const flags, int dflag, const char *const format, ...)
gettimeofday(&timeSecs, NULL); gettimeofday(&timeSecs, NULL);
curTime = timeSecs.tv_sec; curTime = timeSecs.tv_sec;
ptm = localtime_r(&curTime, &Tm); ptm = localtime_r(&curTime, &Tm);
#ifdef WINDOWS #ifndef LINUX
len = sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d 0x%lld ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, len = sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d 0x%lld ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
ptm->tm_min, ptm->tm_sec, (int)timeSecs.tv_usec, taosGetPthreadId()); ptm->tm_min, ptm->tm_sec, (int)timeSecs.tv_usec, taosGetPthreadId());
#else #else
...@@ -436,7 +436,7 @@ void taosPrintLongString(const char *const flags, int dflag, const char *const f ...@@ -436,7 +436,7 @@ void taosPrintLongString(const char *const flags, int dflag, const char *const f
gettimeofday(&timeSecs, NULL); gettimeofday(&timeSecs, NULL);
curTime = timeSecs.tv_sec; curTime = timeSecs.tv_sec;
ptm = localtime_r(&curTime, &Tm); ptm = localtime_r(&curTime, &Tm);
#ifdef WINDOWS #ifndef LINUX
len = sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d 0x%lld ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, len = sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d 0x%lld ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
ptm->tm_min, ptm->tm_sec, (int)timeSecs.tv_usec, taosGetPthreadId()); ptm->tm_min, ptm->tm_sec, (int)timeSecs.tv_usec, taosGetPthreadId());
#else #else
...@@ -498,7 +498,7 @@ SLogBuff *taosLogBuffNew(int bufSize) { ...@@ -498,7 +498,7 @@ SLogBuff *taosLogBuffNew(int bufSize) {
tLogBuff->stop = 0; tLogBuff->stop = 0;
if (pthread_mutex_init(&LOG_BUF_MUTEX(tLogBuff), NULL) < 0) goto _err; if (pthread_mutex_init(&LOG_BUF_MUTEX(tLogBuff), NULL) < 0) goto _err;
sem_init(&(tLogBuff->buffNotEmpty), 0, 0); tsem_init(&(tLogBuff->buffNotEmpty), 0, 0);
return tLogBuff; return tLogBuff;
...@@ -509,7 +509,7 @@ _err: ...@@ -509,7 +509,7 @@ _err:
} }
void taosLogBuffDestroy(SLogBuff *tLogBuff) { void taosLogBuffDestroy(SLogBuff *tLogBuff) {
sem_destroy(&(tLogBuff->buffNotEmpty)); tsem_destroy(&(tLogBuff->buffNotEmpty));
pthread_mutex_destroy(&(tLogBuff->buffMutex)); pthread_mutex_destroy(&(tLogBuff->buffMutex));
free(tLogBuff->buffer); free(tLogBuff->buffer);
tfree(tLogBuff); tfree(tLogBuff);
...@@ -547,7 +547,7 @@ int taosPushLogBuffer(SLogBuff *tLogBuff, char *msg, int msgLen) { ...@@ -547,7 +547,7 @@ int taosPushLogBuffer(SLogBuff *tLogBuff, char *msg, int msgLen) {
// TODO : put string in the buffer // TODO : put string in the buffer
sem_post(&(tLogBuff->buffNotEmpty)); tsem_post(&(tLogBuff->buffNotEmpty));
pthread_mutex_unlock(&LOG_BUF_MUTEX(tLogBuff)); pthread_mutex_unlock(&LOG_BUF_MUTEX(tLogBuff));
...@@ -587,7 +587,7 @@ void *taosAsyncOutputLog(void *param) { ...@@ -587,7 +587,7 @@ void *taosAsyncOutputLog(void *param) {
char tempBuffer[TSDB_DEFAULT_LOG_BUF_UNIT]; char tempBuffer[TSDB_DEFAULT_LOG_BUF_UNIT];
while (1) { while (1) {
sem_wait(&(tLogBuff->buffNotEmpty)); tsem_wait(&(tLogBuff->buffNotEmpty));
// Polling the buffer // Polling the buffer
while (1) { while (1) {
......
...@@ -57,13 +57,13 @@ int taosInitModule(module_t *pMod) { ...@@ -57,13 +57,13 @@ int taosInitModule(module_t *pMod) {
return -1; return -1;
} }
if (sem_init(&pMod->emptySem, 0, (unsigned int)pMod->queueSize) != 0) { if (tsem_init(&pMod->emptySem, 0, (unsigned int)pMod->queueSize) != 0) {
printf("ERROR: init %s empty semaphore failed, reason:%s\n", pMod->name, strerror(errno)); printf("ERROR: init %s empty semaphore failed, reason:%s\n", pMod->name, strerror(errno));
taosCleanUpModule(pMod); taosCleanUpModule(pMod);
return -1; return -1;
} }
if (sem_init(&pMod->fullSem, 0, 0) != 0) { if (tsem_init(&pMod->fullSem, 0, 0) != 0) {
printf("ERROR: init %s full semaphore failed, reason:%s\n", pMod->name, strerror(errno)); printf("ERROR: init %s full semaphore failed, reason:%s\n", pMod->name, strerror(errno));
taosCleanUpModule(pMod); taosCleanUpModule(pMod);
return -1; return -1;
...@@ -103,7 +103,7 @@ void *taosProcessQueue(void *param) { ...@@ -103,7 +103,7 @@ void *taosProcessQueue(void *param) {
signal(SIGINT, SIG_IGN); signal(SIGINT, SIG_IGN);
while (1) { while (1) {
if (sem_wait(&pMod->fullSem) != 0) if (tsem_wait(&pMod->fullSem) != 0)
printf("ERROR: wait %s fullSem failed, reason:%s\n", pMod->name, strerror(errno)); printf("ERROR: wait %s fullSem failed, reason:%s\n", pMod->name, strerror(errno));
if (pthread_mutex_lock(&pMod->queueMutex) != 0) if (pthread_mutex_lock(&pMod->queueMutex) != 0)
...@@ -116,7 +116,7 @@ void *taosProcessQueue(void *param) { ...@@ -116,7 +116,7 @@ void *taosProcessQueue(void *param) {
if (pthread_mutex_unlock(&pMod->queueMutex) != 0) if (pthread_mutex_unlock(&pMod->queueMutex) != 0)
printf("ERROR: unlock %s queueMutex failed, reason:%s\n", pMod->name, strerror(errno)); printf("ERROR: unlock %s queueMutex failed, reason:%s\n", pMod->name, strerror(errno));
if (sem_post(&pMod->emptySem) != 0) if (tsem_post(&pMod->emptySem) != 0)
printf("ERROR: post %s emptySem failed, reason:%s\n", pMod->name, strerror(errno)); printf("ERROR: post %s emptySem failed, reason:%s\n", pMod->name, strerror(errno));
/* process the message */ /* process the message */
...@@ -142,7 +142,7 @@ void *taosProcessQueue(void *param) { ...@@ -142,7 +142,7 @@ void *taosProcessQueue(void *param) {
} }
int taosSendMsgToModule(module_t *pMod, int cid, int mid, int tid, char *msg) { int taosSendMsgToModule(module_t *pMod, int cid, int mid, int tid, char *msg) {
if (sem_wait(&pMod->emptySem) != 0) if (tsem_wait(&pMod->emptySem) != 0)
printf("ERROR: wait %s emptySem failed, reason:%s\n", pMod->name, strerror(errno)); printf("ERROR: wait %s emptySem failed, reason:%s\n", pMod->name, strerror(errno));
if (pthread_mutex_lock(&pMod->queueMutex) != 0) if (pthread_mutex_lock(&pMod->queueMutex) != 0)
...@@ -157,7 +157,7 @@ int taosSendMsgToModule(module_t *pMod, int cid, int mid, int tid, char *msg) { ...@@ -157,7 +157,7 @@ int taosSendMsgToModule(module_t *pMod, int cid, int mid, int tid, char *msg) {
if (pthread_mutex_unlock(&pMod->queueMutex) != 0) if (pthread_mutex_unlock(&pMod->queueMutex) != 0)
printf("ERROR: unlock %s queueMutex failed, reason:%s\n", pMod->name, strerror(errno)); printf("ERROR: unlock %s queueMutex failed, reason:%s\n", pMod->name, strerror(errno));
if (sem_post(&pMod->fullSem) != 0) printf("ERROR: post %s fullSem failed, reason:%s\n", pMod->name, strerror(errno)); if (tsem_post(&pMod->fullSem) != 0) printf("ERROR: post %s fullSem failed, reason:%s\n", pMod->name, strerror(errno));
return 0; return 0;
} }
...@@ -173,8 +173,8 @@ void taosCleanUpModule(module_t *pMod) { ...@@ -173,8 +173,8 @@ void taosCleanUpModule(module_t *pMod) {
} }
taosResetPthread(&pMod->thread); taosResetPthread(&pMod->thread);
sem_destroy(&pMod->emptySem); tsem_destroy(&pMod->emptySem);
sem_destroy(&pMod->fullSem); tsem_destroy(&pMod->fullSem);
pthread_mutex_destroy(&pMod->queueMutex); pthread_mutex_destroy(&pMod->queueMutex);
pthread_mutex_destroy(&pMod->stmMutex); pthread_mutex_destroy(&pMod->stmMutex);
......
...@@ -27,8 +27,8 @@ ...@@ -27,8 +27,8 @@
typedef struct { typedef struct {
char label[16]; char label[16];
sem_t emptySem; tsem_t emptySem;
sem_t fullSem; tsem_t fullSem;
pthread_mutex_t queueMutex; pthread_mutex_t queueMutex;
int fullSlot; int fullSlot;
int emptySlot; int emptySlot;
...@@ -59,12 +59,12 @@ void *taosInitScheduler(int queueSize, int numOfThreads, const char *label) { ...@@ -59,12 +59,12 @@ void *taosInitScheduler(int queueSize, int numOfThreads, const char *label) {
goto _error; goto _error;
} }
if (sem_init(&pSched->emptySem, 0, (unsigned int)pSched->queueSize) != 0) { if (tsem_init(&pSched->emptySem, 0, (unsigned int)pSched->queueSize) != 0) {
pError("init %s:empty semaphore failed, reason:%s", pSched->label, strerror(errno)); pError("init %s:empty semaphore failed, reason:%s", pSched->label, strerror(errno));
goto _error; goto _error;
} }
if (sem_init(&pSched->fullSem, 0, 0) != 0) { if (tsem_init(&pSched->fullSem, 0, 0) != 0) {
pError("init %s:full semaphore failed, reason:%s", pSched->label, strerror(errno)); pError("init %s:full semaphore failed, reason:%s", pSched->label, strerror(errno));
goto _error; goto _error;
} }
...@@ -109,7 +109,7 @@ void *taosProcessSchedQueue(void *param) { ...@@ -109,7 +109,7 @@ void *taosProcessSchedQueue(void *param) {
SSchedQueue *pSched = (SSchedQueue *)param; SSchedQueue *pSched = (SSchedQueue *)param;
while (1) { while (1) {
if (sem_wait(&pSched->fullSem) != 0) { if (tsem_wait(&pSched->fullSem) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
/* sem_wait is interrupted by interrupt, ignore and continue */ /* sem_wait is interrupted by interrupt, ignore and continue */
pTrace("wait %s fullSem was interrupted", pSched->label); pTrace("wait %s fullSem was interrupted", pSched->label);
...@@ -128,7 +128,7 @@ void *taosProcessSchedQueue(void *param) { ...@@ -128,7 +128,7 @@ void *taosProcessSchedQueue(void *param) {
if (pthread_mutex_unlock(&pSched->queueMutex) != 0) if (pthread_mutex_unlock(&pSched->queueMutex) != 0)
pError("unlock %s queueMutex failed, reason:%s\n", pSched->label, strerror(errno)); pError("unlock %s queueMutex failed, reason:%s\n", pSched->label, strerror(errno));
if (sem_post(&pSched->emptySem) != 0) if (tsem_post(&pSched->emptySem) != 0)
pError("post %s emptySem failed, reason:%s\n", pSched->label, strerror(errno)); pError("post %s emptySem failed, reason:%s\n", pSched->label, strerror(errno));
if (msg.fp) if (msg.fp)
...@@ -145,7 +145,7 @@ int taosScheduleTask(void *qhandle, SSchedMsg *pMsg) { ...@@ -145,7 +145,7 @@ int taosScheduleTask(void *qhandle, SSchedMsg *pMsg) {
return 0; return 0;
} }
while (sem_wait(&pSched->emptySem) != 0) { while (tsem_wait(&pSched->emptySem) != 0) {
if (errno != EINTR) { if (errno != EINTR) {
pError("wait %s emptySem failed, reason:%s", pSched->label, strerror(errno)); pError("wait %s emptySem failed, reason:%s", pSched->label, strerror(errno));
break; break;
...@@ -162,7 +162,7 @@ int taosScheduleTask(void *qhandle, SSchedMsg *pMsg) { ...@@ -162,7 +162,7 @@ int taosScheduleTask(void *qhandle, SSchedMsg *pMsg) {
if (pthread_mutex_unlock(&pSched->queueMutex) != 0) if (pthread_mutex_unlock(&pSched->queueMutex) != 0)
pError("unlock %s queueMutex failed, reason:%s", pSched->label, strerror(errno)); pError("unlock %s queueMutex failed, reason:%s", pSched->label, strerror(errno));
if (sem_post(&pSched->fullSem) != 0) pError("post %s fullSem failed, reason:%s", pSched->label, strerror(errno)); if (tsem_post(&pSched->fullSem) != 0) pError("post %s fullSem failed, reason:%s", pSched->label, strerror(errno));
return 0; return 0;
} }
...@@ -178,8 +178,8 @@ void taosCleanUpScheduler(void *param) { ...@@ -178,8 +178,8 @@ void taosCleanUpScheduler(void *param) {
pthread_join(pSched->qthread[i], NULL); pthread_join(pSched->qthread[i], NULL);
} }
sem_destroy(&pSched->emptySem); tsem_destroy(&pSched->emptySem);
sem_destroy(&pSched->fullSem); tsem_destroy(&pSched->fullSem);
pthread_mutex_destroy(&pSched->queueMutex); pthread_mutex_destroy(&pSched->queueMutex);
free(pSched->queue); free(pSched->queue);
......
...@@ -301,14 +301,12 @@ int taosOpenUdpSocket(char *ip, short port) { ...@@ -301,14 +301,12 @@ int taosOpenUdpSocket(char *ip, short port) {
nocheck = 1; nocheck = 1;
if (taosSetSockOpt(sockFd, SOL_SOCKET, SO_NO_CHECK, (void *)&nocheck, sizeof(nocheck)) < 0) { if (taosSetSockOpt(sockFd, SOL_SOCKET, SO_NO_CHECK, (void *)&nocheck, sizeof(nocheck)) < 0) {
// no_check is not implemented in WSL if (!taosSkipSocketCheck()) {
// skip the following check if system running WSLv1
if (!taosIsRunningWSLv1()) {
pError("setsockopt SO_NO_CHECK failed: %d (%s)", errno, strerror(errno)); pError("setsockopt SO_NO_CHECK failed: %d (%s)", errno, strerror(errno));
close(sockFd); close(sockFd);
return -1; return -1;
} else { } else {
pError("Skipping: setsockopt SO_NO_CHECK failed: %d (%s)", errno, strerror(errno)); pPrint("Skipping setsockopt SO_NO_CHECK error: %d (%s)", errno, strerror(errno));
} }
} }
......
...@@ -46,22 +46,6 @@ char *tmrMemPoolMalloc(mpool_h handle); ...@@ -46,22 +46,6 @@ char *tmrMemPoolMalloc(mpool_h handle);
void tmrMemPoolFree(mpool_h handle, char *p); void tmrMemPoolFree(mpool_h handle, char *p);
void tmrMemPoolCleanUp(mpool_h handle); void tmrMemPoolCleanUp(mpool_h handle);
#define tmrError(...) \
if (tmrDebugFlag & DEBUG_ERROR) { \
tprintf("ERROR TMR ", tmrDebugFlag, __VA_ARGS__); \
}
#define tmrWarn(...) \
if (tmrDebugFlag & DEBUG_WARN) { \
tprintf("WARN TMR ", tmrDebugFlag, __VA_ARGS__); \
}
#define tmrTrace(...) \
if (tmrDebugFlag & DEBUG_TRACE) { \
tprintf("TMR ", tmrDebugFlag, __VA_ARGS__); \
}
#define maxNumOfTmrCtrl 512
#define MSECONDS_PER_TICK 5
typedef struct _tmr_obj { typedef struct _tmr_obj {
void *param1; void *param1;
void (*fp)(void *, void *); void (*fp)(void *, void *);
...@@ -98,17 +82,17 @@ typedef struct _tmr_ctrl_t { ...@@ -98,17 +82,17 @@ typedef struct _tmr_ctrl_t {
int tmrDebugFlag = DEBUG_ERROR | DEBUG_WARN | DEBUG_FILE; int tmrDebugFlag = DEBUG_ERROR | DEBUG_WARN | DEBUG_FILE;
void taosTmrProcessList(tmr_ctrl_t *); void taosTmrProcessList(tmr_ctrl_t *);
tmr_ctrl_t tmrCtrl[maxNumOfTmrCtrl]; tmr_ctrl_t tmrCtrl[MAX_NUM_OF_TMRCTL];
int numOfTmrCtrl = 0; int numOfTmrCtrl = 0;
void * tmrIdPool = NULL; void * tmrIdPool = NULL;
void * tmrQhandle; void * tmrQhandle;
int taosTmrThreads = 1; int taosTmrThreads = 1;
void *taosTimerLoopFunc(int signo) { void taosTimerLoopFunc(int signo) {
tmr_ctrl_t *pCtrl; tmr_ctrl_t *pCtrl;
int count = 0; int count = 0;
for (int i = 1; i < maxNumOfTmrCtrl; ++i) { for (int i = 1; i < MAX_NUM_OF_TMRCTL; ++i) {
pCtrl = tmrCtrl + i; pCtrl = tmrCtrl + i;
if (pCtrl->signature) { if (pCtrl->signature) {
count++; count++;
...@@ -120,73 +104,13 @@ void *taosTimerLoopFunc(int signo) { ...@@ -120,73 +104,13 @@ void *taosTimerLoopFunc(int signo) {
if (count >= numOfTmrCtrl) break; if (count >= numOfTmrCtrl) break;
} }
} }
return NULL;
} }
#ifndef WINDOWS
void *taosProcessAlarmSignal(void *tharg) {
// Block the signal
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGALRM);
sigprocmask(SIG_BLOCK, &sigset, NULL);
timer_t timerId;
struct sigevent sevent;
sevent.sigev_notify = SIGEV_THREAD_ID;
sevent._sigev_un._tid = syscall(__NR_gettid);
sevent.sigev_signo = SIGALRM;
if (timer_create(CLOCK_REALTIME, &sevent, &timerId) == -1) {
tmrError("Failed to create timer");
}
struct itimerspec ts;
ts.it_value.tv_sec = 0;
ts.it_value.tv_nsec = 1000000 * MSECONDS_PER_TICK;
ts.it_interval.tv_sec = 0;
ts.it_interval.tv_nsec = 1000000 * MSECONDS_PER_TICK;
if (timer_settime(timerId, 0, &ts, NULL)) {
tmrError("Failed to init timer");
return NULL;
}
int signo;
while (1) {
if (sigwait(&sigset, &signo)) {
tmrError("Failed to wait signal: number %d", signo);
continue;
}
/* printf("Signal handling: number %d ......\n", signo); */
taosTimerLoopFunc(0);
}
assert(0);
return NULL;
}
#endif
void taosTmrModuleInit(void) { void taosTmrModuleInit(void) {
tmrIdPool = taosInitIdPool(maxNumOfTmrCtrl); tmrIdPool = taosInitIdPool(MAX_NUM_OF_TMRCTL);
memset(tmrCtrl, 0, sizeof(tmrCtrl)); memset(tmrCtrl, 0, sizeof(tmrCtrl));
#ifdef LINUX
pthread_t thread;
pthread_attr_t tattr;
pthread_attr_init(&tattr);
pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
if (pthread_create(&thread, &tattr, taosProcessAlarmSignal, NULL) != 0) {
tmrError("failed to create timer thread");
return;
}
pthread_attr_destroy(&tattr);
#else
taosInitTimer(taosTimerLoopFunc, MSECONDS_PER_TICK); taosInitTimer(taosTimerLoopFunc, MSECONDS_PER_TICK);
#endif
tmrQhandle = taosInitScheduler(10000, taosTmrThreads, "tmr"); tmrQhandle = taosInitScheduler(10000, taosTmrThreads, "tmr");
tmrTrace("timer module is initialized, thread:%d", taosTmrThreads); tmrTrace("timer module is initialized, thread:%d", taosTmrThreads);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册