start/stop process
This commit is contained in:
parent
abedeb23d6
commit
9c12e2bf6e
|
@ -20,6 +20,9 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//TODO replaces them with fnDebug
|
||||||
|
//#define debugPrint(...) taosPrintLog("Function", DEBUG_INFO, 135, __VA_ARGS__)
|
||||||
|
#define debugPrint(...) {fprintf(stderr, __VA_ARGS__);fprintf(stderr, "\n");}
|
||||||
enum {
|
enum {
|
||||||
UDF_TASK_SETUP = 0,
|
UDF_TASK_SETUP = 0,
|
||||||
UDF_TASK_CALL = 1,
|
UDF_TASK_CALL = 1,
|
||||||
|
|
|
@ -14,17 +14,10 @@
|
||||||
*/
|
*/
|
||||||
#include "uv.h"
|
#include "uv.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
#include "tlog.h"
|
||||||
#include "tudf.h"
|
#include "tudf.h"
|
||||||
#include "tudfInt.h"
|
#include "tudfInt.h"
|
||||||
|
|
||||||
//TODO replace them with qDebug
|
|
||||||
#define DEBUG
|
|
||||||
#ifdef DEBUG
|
|
||||||
#define debugPrint(...) fprintf(__VA_ARGS__)
|
|
||||||
#else
|
|
||||||
#define debugPrint(...) /**/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//TODO: when startup, set thread poll size. add it to cfg
|
//TODO: when startup, set thread poll size. add it to cfg
|
||||||
//TODO: udfd restart when exist or aborts
|
//TODO: udfd restart when exist or aborts
|
||||||
//TODO: network error processing.
|
//TODO: network error processing.
|
||||||
|
@ -179,21 +172,21 @@ void udfTaskQueueMove(SClientUvTaskQueue q, SClientUvTaskQueue n) {
|
||||||
|
|
||||||
|
|
||||||
int32_t encodeRequest(char **pBuf, int32_t *pBufLen, SUdfRequest *request) {
|
int32_t encodeRequest(char **pBuf, int32_t *pBufLen, SUdfRequest *request) {
|
||||||
debugPrint(stdout, "%s\n", "encoding request");
|
debugPrint("%s", "encoding request");
|
||||||
|
|
||||||
int len = sizeof(SUdfRequest) - sizeof(void *);
|
int len = sizeof(SUdfRequest) - sizeof(void *);
|
||||||
switch (request->type) {
|
switch (request->type) {
|
||||||
case 0: {
|
case UDF_TASK_SETUP: {
|
||||||
SUdfSetupRequest *setup = (SUdfSetupRequest *) (request->subReq);
|
SUdfSetupRequest *setup = (SUdfSetupRequest *) (request->subReq);
|
||||||
len += sizeof(SUdfSetupRequest) - 1 * sizeof(char *) + setup->pathSize;
|
len += sizeof(SUdfSetupRequest) - 1 * sizeof(char *) + setup->pathSize;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1: {
|
case UDF_TASK_CALL: {
|
||||||
SUdfCallRequest *call = (SUdfCallRequest *) (request->subReq);
|
SUdfCallRequest *call = (SUdfCallRequest *) (request->subReq);
|
||||||
len += sizeof(SUdfCallRequest) - 2 * sizeof(char *) + call->inputBytes + call->stateBytes;
|
len += sizeof(SUdfCallRequest) - 2 * sizeof(char *) + call->inputBytes + call->stateBytes;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2: {
|
case UDF_TASK_TEARDOWN: {
|
||||||
SUdfTeardownRequest *teardown = (SUdfTeardownRequest *) (request->subReq);
|
SUdfTeardownRequest *teardown = (SUdfTeardownRequest *) (request->subReq);
|
||||||
len += sizeof(SUdfTeardownRequest);
|
len += sizeof(SUdfTeardownRequest);
|
||||||
break;
|
break;
|
||||||
|
@ -214,7 +207,7 @@ int32_t encodeRequest(char **pBuf, int32_t *pBufLen, SUdfRequest *request) {
|
||||||
buf += sizeof(int8_t);
|
buf += sizeof(int8_t);
|
||||||
|
|
||||||
switch (request->type) {
|
switch (request->type) {
|
||||||
case 0: {
|
case UDF_TASK_SETUP: {
|
||||||
SUdfSetupRequest *setup = (SUdfSetupRequest *) (request->subReq);
|
SUdfSetupRequest *setup = (SUdfSetupRequest *) (request->subReq);
|
||||||
memcpy(buf, setup->udfName, 16);
|
memcpy(buf, setup->udfName, 16);
|
||||||
buf += 16;
|
buf += 16;
|
||||||
|
@ -229,7 +222,7 @@ int32_t encodeRequest(char **pBuf, int32_t *pBufLen, SUdfRequest *request) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 1: {
|
case UDF_TASK_CALL: {
|
||||||
SUdfCallRequest *call = (SUdfCallRequest *) (request->subReq);
|
SUdfCallRequest *call = (SUdfCallRequest *) (request->subReq);
|
||||||
*(int64_t *) buf = call->udfHandle;
|
*(int64_t *) buf = call->udfHandle;
|
||||||
buf += sizeof(int64_t);
|
buf += sizeof(int64_t);
|
||||||
|
@ -246,7 +239,7 @@ int32_t encodeRequest(char **pBuf, int32_t *pBufLen, SUdfRequest *request) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 2: {
|
case UDF_TASK_TEARDOWN: {
|
||||||
SUdfTeardownRequest *teardown = (SUdfTeardownRequest *) (request->subReq);
|
SUdfTeardownRequest *teardown = (SUdfTeardownRequest *) (request->subReq);
|
||||||
*(int64_t *) buf = teardown->udfHandle;
|
*(int64_t *) buf = teardown->udfHandle;
|
||||||
buf += sizeof(int64_t);
|
buf += sizeof(int64_t);
|
||||||
|
@ -264,9 +257,9 @@ int32_t encodeRequest(char **pBuf, int32_t *pBufLen, SUdfRequest *request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t decodeRequest(char *bufMsg, int32_t bufLen, SUdfRequest **pRequest) {
|
int32_t decodeRequest(char *bufMsg, int32_t bufLen, SUdfRequest **pRequest) {
|
||||||
debugPrint(stdout, "%s\n", "decoding request");
|
debugPrint("%s", "decoding request");
|
||||||
if (*(int32_t *) bufMsg != bufLen) {
|
if (*(int32_t *) bufMsg != bufLen) {
|
||||||
debugPrint(stderr, "%s\n", "dequest request error");
|
debugPrint("%s", "decoding request error");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
char *buf = bufMsg;
|
char *buf = bufMsg;
|
||||||
|
@ -280,7 +273,7 @@ int32_t decodeRequest(char *bufMsg, int32_t bufLen, SUdfRequest **pRequest) {
|
||||||
buf += sizeof(int8_t);
|
buf += sizeof(int8_t);
|
||||||
|
|
||||||
switch (request->type) {
|
switch (request->type) {
|
||||||
case 0: {
|
case UDF_TASK_SETUP: {
|
||||||
SUdfSetupRequest *setup = malloc(sizeof(SUdfSetupRequest));
|
SUdfSetupRequest *setup = malloc(sizeof(SUdfSetupRequest));
|
||||||
|
|
||||||
memcpy(setup->udfName, buf, 16);
|
memcpy(setup->udfName, buf, 16);
|
||||||
|
@ -297,7 +290,7 @@ int32_t decodeRequest(char *bufMsg, int32_t bufLen, SUdfRequest **pRequest) {
|
||||||
request->subReq = setup;
|
request->subReq = setup;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1: {
|
case UDF_TASK_CALL: {
|
||||||
SUdfCallRequest *call = malloc(sizeof(SUdfCallRequest));
|
SUdfCallRequest *call = malloc(sizeof(SUdfCallRequest));
|
||||||
|
|
||||||
call->udfHandle = *(int64_t *) buf;
|
call->udfHandle = *(int64_t *) buf;
|
||||||
|
@ -317,7 +310,7 @@ int32_t decodeRequest(char *bufMsg, int32_t bufLen, SUdfRequest **pRequest) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 2: {
|
case UDF_TASK_TEARDOWN: {
|
||||||
SUdfTeardownRequest *teardown = malloc(sizeof(SUdfTeardownRequest));
|
SUdfTeardownRequest *teardown = malloc(sizeof(SUdfTeardownRequest));
|
||||||
|
|
||||||
teardown->udfHandle = *(int64_t *) buf;
|
teardown->udfHandle = *(int64_t *) buf;
|
||||||
|
@ -328,7 +321,7 @@ int32_t decodeRequest(char *bufMsg, int32_t bufLen, SUdfRequest **pRequest) {
|
||||||
|
|
||||||
}
|
}
|
||||||
if (buf - bufMsg != bufLen) {
|
if (buf - bufMsg != bufLen) {
|
||||||
debugPrint(stderr, "%s\n", "decode request error");
|
debugPrint("%s", "decode request error");
|
||||||
free(request->subReq);
|
free(request->subReq);
|
||||||
free(request);
|
free(request);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -338,22 +331,22 @@ int32_t decodeRequest(char *bufMsg, int32_t bufLen, SUdfRequest **pRequest) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t encodeResponse(char **pBuf, int32_t *pBufLen, SUdfResponse *response) {
|
int32_t encodeResponse(char **pBuf, int32_t *pBufLen, SUdfResponse *response) {
|
||||||
debugPrint(stdout, "%s\n", "encoding response");
|
debugPrint("%s", "encoding response");
|
||||||
|
|
||||||
int32_t len = sizeof(SUdfResponse) - sizeof(void *);
|
int32_t len = sizeof(SUdfResponse) - sizeof(void *);
|
||||||
|
|
||||||
switch (response->type) {
|
switch (response->type) {
|
||||||
case 0: {
|
case UDF_TASK_SETUP: {
|
||||||
len += sizeof(SUdfSetupResponse);
|
len += sizeof(SUdfSetupResponse);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1: {
|
case UDF_TASK_CALL: {
|
||||||
SUdfCallResponse *callResp = (SUdfCallResponse *) (response->subRsp);
|
SUdfCallResponse *callResp = (SUdfCallResponse *) (response->subRsp);
|
||||||
len += sizeof(SUdfCallResponse) - 2 * sizeof(char *) +
|
len += sizeof(SUdfCallResponse) - 2 * sizeof(char *) +
|
||||||
callResp->outputBytes + callResp->newStateBytes;
|
callResp->outputBytes + callResp->newStateBytes;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2: {
|
case UDF_TASK_TEARDOWN: {
|
||||||
len += sizeof(SUdfTeardownResponse);
|
len += sizeof(SUdfTeardownResponse);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -374,13 +367,13 @@ int32_t encodeResponse(char **pBuf, int32_t *pBufLen, SUdfResponse *response) {
|
||||||
|
|
||||||
|
|
||||||
switch (response->type) {
|
switch (response->type) {
|
||||||
case 0: {
|
case UDF_TASK_SETUP: {
|
||||||
SUdfSetupResponse *setupResp = (SUdfSetupResponse *) (response->subRsp);
|
SUdfSetupResponse *setupResp = (SUdfSetupResponse *) (response->subRsp);
|
||||||
*(int64_t *) buf = setupResp->udfHandle;
|
*(int64_t *) buf = setupResp->udfHandle;
|
||||||
buf += sizeof(int64_t);
|
buf += sizeof(int64_t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1: {
|
case UDF_TASK_CALL: {
|
||||||
SUdfCallResponse *callResp = (SUdfCallResponse *) (response->subRsp);
|
SUdfCallResponse *callResp = (SUdfCallResponse *) (response->subRsp);
|
||||||
*(int32_t *) buf = callResp->outputBytes;
|
*(int32_t *) buf = callResp->outputBytes;
|
||||||
buf += sizeof(int32_t);
|
buf += sizeof(int32_t);
|
||||||
|
@ -393,7 +386,7 @@ int32_t encodeResponse(char **pBuf, int32_t *pBufLen, SUdfResponse *response) {
|
||||||
buf += callResp->newStateBytes;
|
buf += callResp->newStateBytes;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2: {
|
case UDF_TASK_TEARDOWN: {
|
||||||
SUdfTeardownResponse *teardownResp = (SUdfTeardownResponse *) (response->subRsp);
|
SUdfTeardownResponse *teardownResp = (SUdfTeardownResponse *) (response->subRsp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -408,10 +401,10 @@ int32_t encodeResponse(char **pBuf, int32_t *pBufLen, SUdfResponse *response) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t decodeResponse(char *bufMsg, int32_t bufLen, SUdfResponse **pResponse) {
|
int32_t decodeResponse(char *bufMsg, int32_t bufLen, SUdfResponse **pResponse) {
|
||||||
debugPrint(stdout, "%s\n", "decoding response");
|
debugPrint("%s", "decoding response");
|
||||||
|
|
||||||
if (*(int32_t *) bufMsg != bufLen) {
|
if (*(int32_t *) bufMsg != bufLen) {
|
||||||
debugPrint(stderr, "%s\n", "can not decode response");
|
debugPrint("%s", "can not decode response");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
char *buf = bufMsg;
|
char *buf = bufMsg;
|
||||||
|
@ -426,14 +419,14 @@ int32_t decodeResponse(char *bufMsg, int32_t bufLen, SUdfResponse **pResponse) {
|
||||||
buf += sizeof(int32_t);
|
buf += sizeof(int32_t);
|
||||||
|
|
||||||
switch (rsp->type) {
|
switch (rsp->type) {
|
||||||
case 0: {
|
case UDF_TASK_SETUP: {
|
||||||
SUdfSetupResponse *setupRsp = (SUdfSetupResponse *) malloc(sizeof(SUdfSetupResponse));
|
SUdfSetupResponse *setupRsp = (SUdfSetupResponse *) malloc(sizeof(SUdfSetupResponse));
|
||||||
setupRsp->udfHandle = *(int64_t *) buf;
|
setupRsp->udfHandle = *(int64_t *) buf;
|
||||||
buf += sizeof(int64_t);
|
buf += sizeof(int64_t);
|
||||||
rsp->subRsp = (char *) setupRsp;
|
rsp->subRsp = (char *) setupRsp;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1: {
|
case UDF_TASK_CALL: {
|
||||||
SUdfCallResponse *callRsp = (SUdfCallResponse *) malloc(sizeof(SUdfCallResponse));
|
SUdfCallResponse *callRsp = (SUdfCallResponse *) malloc(sizeof(SUdfCallResponse));
|
||||||
callRsp->outputBytes = *(int32_t *) buf;
|
callRsp->outputBytes = *(int32_t *) buf;
|
||||||
buf += sizeof(int32_t);
|
buf += sizeof(int32_t);
|
||||||
|
@ -450,7 +443,7 @@ int32_t decodeResponse(char *bufMsg, int32_t bufLen, SUdfResponse **pResponse) {
|
||||||
rsp->subRsp = callRsp;
|
rsp->subRsp = callRsp;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2: {
|
case UDF_TASK_TEARDOWN: {
|
||||||
SUdfTeardownResponse *teardownRsp = (SUdfTeardownResponse *) malloc(sizeof(SUdfTeardownResponse));
|
SUdfTeardownResponse *teardownRsp = (SUdfTeardownResponse *) malloc(sizeof(SUdfTeardownResponse));
|
||||||
rsp->subRsp = teardownRsp;
|
rsp->subRsp = teardownRsp;
|
||||||
break;
|
break;
|
||||||
|
@ -459,7 +452,7 @@ int32_t decodeResponse(char *bufMsg, int32_t bufLen, SUdfResponse **pResponse) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (buf - bufMsg != bufLen) {
|
if (buf - bufMsg != bufLen) {
|
||||||
debugPrint(stderr, "%s\n", "can not decode response");
|
debugPrint("%s", "can not decode response");
|
||||||
free(rsp->subRsp);
|
free(rsp->subRsp);
|
||||||
free(rsp);
|
free(rsp);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -469,8 +462,9 @@ int32_t decodeResponse(char *bufMsg, int32_t bufLen, SUdfResponse **pResponse) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void onUdfdExit(uv_process_t *req, int64_t exit_status, int term_signal) {
|
void onUdfdExit(uv_process_t *req, int64_t exit_status, int term_signal) {
|
||||||
debugPrint(stderr, "Process exited with status %" PRId64 ", signal %d\n", exit_status, term_signal);
|
debugPrint("Process exited with status %" PRId64 ", signal %d", exit_status, term_signal);
|
||||||
uv_close((uv_handle_t *) req, NULL);
|
uv_close((uv_handle_t *) req, NULL);
|
||||||
|
//TODO: restart the udfd process
|
||||||
}
|
}
|
||||||
|
|
||||||
void onUdfcPipeClose(uv_handle_t *handle) {
|
void onUdfcPipeClose(uv_handle_t *handle) {
|
||||||
|
@ -488,7 +482,7 @@ void onUdfcPipeClose(uv_handle_t *handle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t udfcGetUvTaskResponseResult(SClientUdfTask *task, SClientUvTaskNode *uvTask) {
|
int32_t udfcGetUvTaskResponseResult(SClientUdfTask *task, SClientUvTaskNode *uvTask) {
|
||||||
debugPrint(stdout, "%s\n", "get uv task result");
|
debugPrint("%s", "get uv task result");
|
||||||
if (uvTask->type == UV_TASK_REQ_RSP) {
|
if (uvTask->type == UV_TASK_REQ_RSP) {
|
||||||
if (uvTask->rspBuf.base != NULL) {
|
if (uvTask->rspBuf.base != NULL) {
|
||||||
SUdfResponse *rsp;
|
SUdfResponse *rsp;
|
||||||
|
@ -497,13 +491,13 @@ int32_t udfcGetUvTaskResponseResult(SClientUdfTask *task, SClientUvTaskNode *uvT
|
||||||
|
|
||||||
switch (task->type) {
|
switch (task->type) {
|
||||||
case UDF_TASK_SETUP: {
|
case UDF_TASK_SETUP: {
|
||||||
//TODO: copy
|
//TODO: copy or not
|
||||||
task->_setup.rsp = *(SUdfSetupResponse *) (rsp->subRsp);
|
task->_setup.rsp = *(SUdfSetupResponse *) (rsp->subRsp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case UDF_TASK_CALL: {
|
case UDF_TASK_CALL: {
|
||||||
task->_call.rsp = *(SUdfCallResponse *) (rsp->subRsp);
|
task->_call.rsp = *(SUdfCallResponse *) (rsp->subRsp);
|
||||||
//TODO: copy
|
//TODO: copy or not
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case UDF_TASK_TEARDOWN: {
|
case UDF_TASK_TEARDOWN: {
|
||||||
|
@ -532,7 +526,7 @@ int32_t udfcGetUvTaskResponseResult(SClientUdfTask *task, SClientUvTaskNode *uvT
|
||||||
}
|
}
|
||||||
|
|
||||||
void udfcAllocateBuffer(uv_handle_t *handle, size_t suggestedSize, uv_buf_t *buf) {
|
void udfcAllocateBuffer(uv_handle_t *handle, size_t suggestedSize, uv_buf_t *buf) {
|
||||||
debugPrint(stdout, "%s\n", "client allocate buffer to receive from pipe");
|
debugPrint("%s", "client allocate buffer to receive from pipe");
|
||||||
SClientUvConn *conn = handle->data;
|
SClientUvConn *conn = handle->data;
|
||||||
SClientConnBuf *connBuf = &conn->readBuf;
|
SClientConnBuf *connBuf = &conn->readBuf;
|
||||||
|
|
||||||
|
@ -565,7 +559,7 @@ void udfcAllocateBuffer(uv_handle_t *handle, size_t suggestedSize, uv_buf_t *buf
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
debugPrint(stdout, "\tconn buf cap - len - total : %d - %d - %d\n", connBuf->cap, connBuf->len, connBuf->total);
|
debugPrint("\tconn buf cap - len - total : %d - %d - %d", connBuf->cap, connBuf->len, connBuf->total);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -621,7 +615,7 @@ void udfcUvHandleError(SClientUvConn *conn) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void onUdfcRead(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
|
void onUdfcRead(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
|
||||||
debugPrint(stdout, "%s, nread: %zd\n", "client read from pipe", nread);
|
debugPrint("%s, nread: %zd", "client read from pipe", nread);
|
||||||
if (nread == 0) return;
|
if (nread == 0) return;
|
||||||
|
|
||||||
SClientUvConn *conn = client->data;
|
SClientUvConn *conn = client->data;
|
||||||
|
@ -634,7 +628,7 @@ void onUdfcRead(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
|
||||||
|
|
||||||
}
|
}
|
||||||
if (nread < 0) {
|
if (nread < 0) {
|
||||||
debugPrint(stderr, "\tclient read error: %s\n", uv_strerror(nread));
|
debugPrint("\tclient read error: %s", uv_strerror(nread));
|
||||||
if (nread == UV_EOF) {
|
if (nread == UV_EOF) {
|
||||||
//TODO:
|
//TODO:
|
||||||
}
|
}
|
||||||
|
@ -644,7 +638,7 @@ void onUdfcRead(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void onUdfClientWrite(uv_write_t *write, int status) {
|
void onUdfClientWrite(uv_write_t *write, int status) {
|
||||||
debugPrint(stderr, "%s\n", "after writing to pipe");
|
debugPrint("%s", "after writing to pipe");
|
||||||
SClientUvTaskNode *uvTask = write->data;
|
SClientUvTaskNode *uvTask = write->data;
|
||||||
if (status == 0) {
|
if (status == 0) {
|
||||||
uv_pipe_t *pipe = uvTask->pipe;
|
uv_pipe_t *pipe = uvTask->pipe;
|
||||||
|
@ -653,7 +647,7 @@ void onUdfClientWrite(uv_write_t *write, int status) {
|
||||||
} else {
|
} else {
|
||||||
//TODO Log error;
|
//TODO Log error;
|
||||||
}
|
}
|
||||||
debugPrint(stdout, "\tlength:%zu\n", uvTask->reqBuf.len);
|
debugPrint("\tlength:%zu", uvTask->reqBuf.len);
|
||||||
free(write);
|
free(write);
|
||||||
free(uvTask->reqBuf.base);
|
free(uvTask->reqBuf.base);
|
||||||
}
|
}
|
||||||
|
@ -707,7 +701,7 @@ int32_t createUdfcUvTask(SClientUdfTask *task, int8_t uvTaskType, SClientUvTaskN
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queueUvUdfTask(SClientUvTaskNode *uvTask) {
|
int32_t queueUvUdfTask(SClientUvTaskNode *uvTask) {
|
||||||
debugPrint(stdout, "%s, %d\n", "queue uv task", uvTask->type);
|
debugPrint("%s, %d", "queue uv task", uvTask->type);
|
||||||
|
|
||||||
uv_mutex_lock(&gUdfTaskQueueMutex);
|
uv_mutex_lock(&gUdfTaskQueueMutex);
|
||||||
udfTaskQueueInsertTail(gUdfTaskQueue, uvTask);
|
udfTaskQueueInsertTail(gUdfTaskQueue, uvTask);
|
||||||
|
@ -721,7 +715,7 @@ int32_t queueUvUdfTask(SClientUvTaskNode *uvTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t startUvUdfTask(SClientUvTaskNode *uvTask) {
|
int32_t startUvUdfTask(SClientUvTaskNode *uvTask) {
|
||||||
debugPrint(stdout, "%s, type %d\n", "start uv task ", uvTask->type);
|
debugPrint("%s, type %d", "start uv task ", uvTask->type);
|
||||||
switch (uvTask->type) {
|
switch (uvTask->type) {
|
||||||
case UV_TASK_CONNECT: {
|
case UV_TASK_CONNECT: {
|
||||||
uv_pipe_t *pipe = malloc(sizeof(uv_pipe_t));
|
uv_pipe_t *pipe = malloc(sizeof(uv_pipe_t));
|
||||||
|
@ -790,20 +784,21 @@ void udfStopAsyncCb(uv_async_t *async) {
|
||||||
void startUdfd(void *argsThread) {
|
void startUdfd(void *argsThread) {
|
||||||
uv_loop_init(&gUdfdLoop);
|
uv_loop_init(&gUdfdLoop);
|
||||||
|
|
||||||
// uv_process_options_t options;
|
//TODO: path
|
||||||
// static char path[256] = {0};
|
uv_process_options_t options;
|
||||||
// size_t cwdSize;
|
static char path[256] = {0};
|
||||||
// uv_cwd(path, &cwdSize);
|
size_t cwdSize;
|
||||||
// strcat(path, "/udfd");
|
uv_cwd(path, &cwdSize);
|
||||||
// char* args[2] = {path, NULL};
|
strcat(path, "./udfd");
|
||||||
// options.args = args;
|
char* args[2] = {path, NULL};
|
||||||
// options.file = path;
|
options.args = args;
|
||||||
// options.exit_cb = onUdfdExit;
|
options.file = path;
|
||||||
//
|
options.exit_cb = onUdfdExit;
|
||||||
// int err = uv_spawn(&gUdfdLoop, &gUdfdProcess, &options);
|
|
||||||
// if (err != 0) {
|
int err = uv_spawn(&gUdfdLoop, &gUdfdProcess, &options);
|
||||||
// debugPrint(stderr, "can not spawn udfd. error: %s", uv_strerror(err));
|
if (err != 0) {
|
||||||
// }
|
debugPrint("can not spawn udfd. path: %s, error: %s", path, uv_strerror(err));
|
||||||
|
}
|
||||||
|
|
||||||
uv_async_init(&gUdfdLoop, &gUdfLoopTaskAync, udfClientAsyncCb);
|
uv_async_init(&gUdfdLoop, &gUdfLoopTaskAync, udfClientAsyncCb);
|
||||||
uv_async_init(&gUdfdLoop, &gUdfLoopStopAsync, udfStopAsyncCb);
|
uv_async_init(&gUdfdLoop, &gUdfLoopStopAsync, udfStopAsyncCb);
|
||||||
|
@ -822,7 +817,7 @@ int32_t startUdfService() {
|
||||||
|
|
||||||
int32_t stopUdfService() {
|
int32_t stopUdfService() {
|
||||||
uv_barrier_destroy(&gUdfInitBarrier);
|
uv_barrier_destroy(&gUdfInitBarrier);
|
||||||
//uv_process_kill(&gUdfdProcess, SIGINT);
|
uv_process_kill(&gUdfdProcess, SIGINT);
|
||||||
uv_async_send(&gUdfLoopStopAsync);
|
uv_async_send(&gUdfLoopStopAsync);
|
||||||
uv_mutex_destroy(&gUdfTaskQueueMutex);
|
uv_mutex_destroy(&gUdfTaskQueueMutex);
|
||||||
uv_thread_join(&gUdfLoopThread);
|
uv_thread_join(&gUdfLoopThread);
|
||||||
|
@ -844,7 +839,7 @@ int32_t udfcRunUvTask(SClientUdfTask *task, int8_t uvTaskType) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t setupUdf(SUdfInfo *udfInfo, UdfHandle *handle) {
|
int32_t setupUdf(SUdfInfo *udfInfo, UdfHandle *handle) {
|
||||||
debugPrint(stdout, "%s\n", "client setup udf");
|
debugPrint("%s", "client setup udf");
|
||||||
SClientUdfTask *task = malloc(sizeof(SClientUdfTask));
|
SClientUdfTask *task = malloc(sizeof(SClientUdfTask));
|
||||||
task->errCode = 0;
|
task->errCode = 0;
|
||||||
task->session = malloc(sizeof(SUdfUvSession));
|
task->session = malloc(sizeof(SUdfUvSession));
|
||||||
|
@ -875,7 +870,7 @@ int32_t setupUdf(SUdfInfo *udfInfo, UdfHandle *handle) {
|
||||||
|
|
||||||
int32_t callUdf(UdfHandle handle, int8_t step, char *state, int32_t stateSize, SUdfDataBlock input, char **newState,
|
int32_t callUdf(UdfHandle handle, int8_t step, char *state, int32_t stateSize, SUdfDataBlock input, char **newState,
|
||||||
int32_t *newStateSize, SUdfDataBlock *output) {
|
int32_t *newStateSize, SUdfDataBlock *output) {
|
||||||
debugPrint(stdout, "%s\n", "client call udf");
|
debugPrint("%s", "client call udf");
|
||||||
|
|
||||||
SClientUdfTask *task = malloc(sizeof(SClientUdfTask));
|
SClientUdfTask *task = malloc(sizeof(SClientUdfTask));
|
||||||
task->errCode = 0;
|
task->errCode = 0;
|
||||||
|
@ -904,7 +899,7 @@ int32_t callUdf(UdfHandle handle, int8_t step, char *state, int32_t stateSize, S
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t teardownUdf(UdfHandle handle) {
|
int32_t teardownUdf(UdfHandle handle) {
|
||||||
debugPrint(stdout, "%s\n", "client teardown udf");
|
debugPrint("%s", "client teardown udf");
|
||||||
|
|
||||||
SClientUdfTask *task = malloc(sizeof(SClientUdfTask));
|
SClientUdfTask *task = malloc(sizeof(SClientUdfTask));
|
||||||
task->errCode = 0;
|
task->errCode = 0;
|
||||||
|
|
|
@ -15,16 +15,11 @@
|
||||||
|
|
||||||
#include "uv.h"
|
#include "uv.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
#include "tlog.h"
|
||||||
|
|
||||||
#include "tudf.h"
|
#include "tudf.h"
|
||||||
#include "tudfInt.h"
|
#include "tudfInt.h"
|
||||||
|
|
||||||
//TODO replaces them with qDebug
|
|
||||||
#define DEBUG
|
|
||||||
#ifdef DEBUG
|
|
||||||
#define debugPrint(...) fprintf(__VA_ARGS__)
|
|
||||||
#else
|
|
||||||
#define debugPrint(...) /**/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static uv_loop_t *loop;
|
static uv_loop_t *loop;
|
||||||
|
|
||||||
|
@ -66,14 +61,14 @@ void udfdProcessRequest(uv_work_t *req) {
|
||||||
|
|
||||||
switch (request->type) {
|
switch (request->type) {
|
||||||
case UDF_TASK_SETUP: {
|
case UDF_TASK_SETUP: {
|
||||||
debugPrint(stdout, "%s\n", "process setup request");
|
debugPrint("%s", "process setup request");
|
||||||
SUdf *udf = malloc(sizeof(SUdf));
|
SUdf *udf = malloc(sizeof(SUdf));
|
||||||
udf->refCount = 0;
|
udf->refCount = 0;
|
||||||
SUdfSetupRequest *setup = request->subReq;
|
SUdfSetupRequest *setup = request->subReq;
|
||||||
strcpy(udf->name, setup->udfName);
|
strcpy(udf->name, setup->udfName);
|
||||||
int err = uv_dlopen(setup->path, &udf->lib);
|
int err = uv_dlopen(setup->path, &udf->lib);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
debugPrint(stderr, "can not load library %s. error: %s", setup->path, uv_strerror(err));
|
debugPrint("can not load library %s. error: %s", setup->path, uv_strerror(err));
|
||||||
//TODO set error
|
//TODO set error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +104,7 @@ void udfdProcessRequest(uv_work_t *req) {
|
||||||
}
|
}
|
||||||
|
|
||||||
case UDF_TASK_CALL: {
|
case UDF_TASK_CALL: {
|
||||||
debugPrint(stdout, "%s\n", "process call request");
|
debugPrint("%s", "process call request");
|
||||||
SUdfCallRequest *call = request->subReq;
|
SUdfCallRequest *call = request->subReq;
|
||||||
SUdfHandle *handle = (SUdfHandle *) (call->udfHandle);
|
SUdfHandle *handle = (SUdfHandle *) (call->udfHandle);
|
||||||
SUdf *udf = handle->udf;
|
SUdf *udf = handle->udf;
|
||||||
|
@ -146,7 +141,7 @@ void udfdProcessRequest(uv_work_t *req) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case UDF_TASK_TEARDOWN: {
|
case UDF_TASK_TEARDOWN: {
|
||||||
debugPrint(stdout, "%s\n", "process teardown request");
|
debugPrint("%s", "process teardown request");
|
||||||
|
|
||||||
SUdfTeardownRequest *teardown = request->subReq;
|
SUdfTeardownRequest *teardown = request->subReq;
|
||||||
SUdfHandle *handle = (SUdfHandle *) (teardown->udfHandle);
|
SUdfHandle *handle = (SUdfHandle *) (teardown->udfHandle);
|
||||||
|
@ -186,12 +181,12 @@ void udfdProcessRequest(uv_work_t *req) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void udfdOnWrite(uv_write_t *req, int status) {
|
void udfdOnWrite(uv_write_t *req, int status) {
|
||||||
debugPrint(stdout, "%s\n", "after writing to pipe");
|
debugPrint("%s", "after writing to pipe");
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
debugPrint(stderr, "Write error %s\n", uv_err_name(status));
|
debugPrint("Write error %s", uv_err_name(status));
|
||||||
}
|
}
|
||||||
SUvUdfWork *work = (SUvUdfWork *) req->data;
|
SUvUdfWork *work = (SUvUdfWork *) req->data;
|
||||||
debugPrint(stdout, "\tlength: %zu\n", work->output.len);
|
debugPrint("\tlength: %zu", work->output.len);
|
||||||
free(work->output.base);
|
free(work->output.base);
|
||||||
free(work);
|
free(work);
|
||||||
free(req);
|
free(req);
|
||||||
|
@ -199,7 +194,7 @@ void udfdOnWrite(uv_write_t *req, int status) {
|
||||||
|
|
||||||
|
|
||||||
void udfdSendResponse(uv_work_t *work, int status) {
|
void udfdSendResponse(uv_work_t *work, int status) {
|
||||||
debugPrint(stdout, "%s\n", "send response");
|
debugPrint("%s", "send response");
|
||||||
SUvUdfWork *udfWork = (SUvUdfWork *) (work->data);
|
SUvUdfWork *udfWork = (SUvUdfWork *) (work->data);
|
||||||
|
|
||||||
uv_write_t *write_req = malloc(sizeof(uv_write_t));
|
uv_write_t *write_req = malloc(sizeof(uv_write_t));
|
||||||
|
@ -210,7 +205,7 @@ void udfdSendResponse(uv_work_t *work, int status) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void udfdAllocBuffer(uv_handle_t *handle, size_t suggestedSize, uv_buf_t *buf) {
|
void udfdAllocBuffer(uv_handle_t *handle, size_t suggestedSize, uv_buf_t *buf) {
|
||||||
debugPrint(stdout, "%s\n", "allocate buffer for read");
|
debugPrint("%s", "allocate buffer for read");
|
||||||
SUdfdUvConn *ctx = handle->data;
|
SUdfdUvConn *ctx = handle->data;
|
||||||
int32_t msgHeadSize = sizeof(int32_t) + sizeof(int64_t);
|
int32_t msgHeadSize = sizeof(int32_t) + sizeof(int64_t);
|
||||||
if (ctx->inputCap == 0) {
|
if (ctx->inputCap == 0) {
|
||||||
|
@ -240,7 +235,7 @@ void udfdAllocBuffer(uv_handle_t *handle, size_t suggestedSize, uv_buf_t *buf) {
|
||||||
buf->len = 0;
|
buf->len = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
debugPrint(stdout, "\tinput buf cap - len - total : %d - %d - %d\n", ctx->inputCap, ctx->inputLen, ctx->inputTotal);
|
debugPrint("\tinput buf cap - len - total : %d - %d - %d", ctx->inputCap, ctx->inputLen, ctx->inputTotal);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +274,7 @@ void udfdUvHandleError(SUdfdUvConn *conn) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void udfdPipeRead(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
|
void udfdPipeRead(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
|
||||||
debugPrint(stdout, "%s, nread: %zd\n", "read from pipe", nread);
|
debugPrint("%s, nread: %zd", "read from pipe", nread);
|
||||||
|
|
||||||
if (nread == 0) return;
|
if (nread == 0) return;
|
||||||
|
|
||||||
|
@ -296,7 +291,7 @@ void udfdPipeRead(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nread < 0) {
|
if (nread < 0) {
|
||||||
debugPrint(stderr, "Read error %s\n", uv_err_name(nread));
|
debugPrint("Read error %s", uv_err_name(nread));
|
||||||
if (nread == UV_EOF) {
|
if (nread == UV_EOF) {
|
||||||
//TODO check more when close
|
//TODO check more when close
|
||||||
} else {
|
} else {
|
||||||
|
@ -306,7 +301,7 @@ void udfdPipeRead(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void udfdOnNewConnection(uv_stream_t *server, int status) {
|
void udfdOnNewConnection(uv_stream_t *server, int status) {
|
||||||
debugPrint(stdout, "%s\n", "on new connection");
|
debugPrint("%s", "on new connection");
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
// TODO
|
// TODO
|
||||||
return;
|
return;
|
||||||
|
@ -335,7 +330,7 @@ void removeListeningPipe(int sig) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
debugPrint(stderr, "libuv version: %x\n", UV_VERSION_HEX);
|
debugPrint("libuv version: %x", UV_VERSION_HEX);
|
||||||
|
|
||||||
loop = uv_default_loop();
|
loop = uv_default_loop();
|
||||||
uv_fs_t req;
|
uv_fs_t req;
|
||||||
|
@ -348,12 +343,12 @@ int main() {
|
||||||
|
|
||||||
int r;
|
int r;
|
||||||
if ((r = uv_pipe_bind(&server, "udf.sock"))) {
|
if ((r = uv_pipe_bind(&server, "udf.sock"))) {
|
||||||
debugPrint(stderr, "Bind error %s\n", uv_err_name(r));
|
debugPrint("Bind error %s\n", uv_err_name(r));
|
||||||
removeListeningPipe(0);
|
removeListeningPipe(0);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if ((r = uv_listen((uv_stream_t *) &server, 128, udfdOnNewConnection))) {
|
if ((r = uv_listen((uv_stream_t *) &server, 128, udfdOnNewConnection))) {
|
||||||
debugPrint(stderr, "Listen error %s\n", uv_err_name(r));
|
debugPrint("Listen error %s", uv_err_name(r));
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
uv_run(loop, UV_RUN_DEFAULT);
|
uv_run(loop, UV_RUN_DEFAULT);
|
||||||
|
|
Loading…
Reference in New Issue