version 1.21.2.4, 2013/11/15 09:04:10
|
version 1.22.6.1, 2014/01/28 13:56:25
|
Line 66 static sched_task_func_t cbProto[SOCK_RAW + 1][4] = {
|
Line 66 static sched_task_func_t cbProto[SOCK_RAW + 1][4] = {
|
{ NULL, NULL, NULL, NULL } /* SOCK_RAW */ |
{ NULL, NULL, NULL, NULL } /* SOCK_RAW */ |
}; |
}; |
|
|
|
/* Global Signal Argument when kqueue support disabled */ |
|
|
|
static volatile uintptr_t _glSigArg = 0; |
|
|
|
|
void |
void |
rpc_freeCli(rpc_cli_t * __restrict c) |
rpc_freeCli(rpc_cli_t * __restrict c) |
{ |
{ |
Line 223 txPacket(sched_task_t *task)
|
Line 227 txPacket(sched_task_t *task)
|
if (ret) |
if (ret) |
LOGERR; |
LOGERR; |
else |
else |
rpc_SetErr(ETIMEDOUT, "Timeout reached! Server not respond"); | rpc_SetErr(ETIMEDOUT, "Timeout reached! Client not respond"); |
/* close connection */ |
/* close connection */ |
schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], |
schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], |
TASK_ARG(task), 0, NULL, 0); |
TASK_ARG(task), 0, NULL, 0); |
Line 346 rxPacket(sched_task_t *task)
|
Line 350 rxPacket(sched_task_t *task)
|
if (rlen) |
if (rlen) |
LOGERR; |
LOGERR; |
else |
else |
rpc_SetErr(ETIMEDOUT, "Timeout reached! Server not respond"); | rpc_SetErr(ETIMEDOUT, "Timeout reached! Client not respond"); |
schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], |
schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], |
TASK_ARG(task), 0, NULL, 0); |
TASK_ARG(task), 0, NULL, 0); |
return NULL; |
return NULL; |
Line 502 txUDPPacket(sched_task_t *task)
|
Line 506 txUDPPacket(sched_task_t *task)
|
if (ret) |
if (ret) |
LOGERR; |
LOGERR; |
else |
else |
rpc_SetErr(ETIMEDOUT, "Timeout reached! Server not respond"); | rpc_SetErr(ETIMEDOUT, "Timeout reached! Client not respond"); |
/* close connection */ |
/* close connection */ |
schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], |
schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], |
TASK_ARG(task), 0, NULL, 0); |
TASK_ARG(task), 0, NULL, 0); |
Line 510 txUDPPacket(sched_task_t *task)
|
Line 514 txUDPPacket(sched_task_t *task)
|
} |
} |
ret = sendto(TASK_FD(task), buf, MIN(wlen, s->srv_netbuf), MSG_NOSIGNAL, |
ret = sendto(TASK_FD(task), buf, MIN(wlen, s->srv_netbuf), MSG_NOSIGNAL, |
&c->cli_sa.sa, c->cli_sa.sa.sa_len); |
&c->cli_sa.sa, c->cli_sa.sa.sa_len); |
printf("wl=%d l=%d\n", wlen, ret); |
|
if (ret == -1) { |
if (ret == -1) { |
/* close connection */ |
/* close connection */ |
schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], |
schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], |
Line 576 rxUDPPacket(sched_task_t *task)
|
Line 579 rxUDPPacket(sched_task_t *task)
|
if (rlen) |
if (rlen) |
LOGERR; |
LOGERR; |
else |
else |
rpc_SetErr(ETIMEDOUT, "Timeout reached! Server not respond"); | rpc_SetErr(ETIMEDOUT, "Timeout reached! Client not respond"); |
schedEvent(TASK_ROOT(task), cbProto[srv->srv_proto][CB_CLOSECLIENT], |
schedEvent(TASK_ROOT(task), cbProto[srv->srv_proto][CB_CLOSECLIENT], |
c, 0, NULL, 0); |
c, 0, NULL, 0); |
return NULL; |
return NULL; |
Line 761 end:
|
Line 764 end:
|
static void * |
static void * |
flushBLOB(sched_task_t *task) |
flushBLOB(sched_task_t *task) |
{ |
{ |
rpc_srv_t *srv = TASK_ARG(task); | uintptr_t sigArg = atomic_load_acq_ptr(&_glSigArg); |
| rpc_srv_t *srv = sigArg ? (void*) sigArg : TASK_ARG(task); |
rpc_blob_t *b, *tmp; |
rpc_blob_t *b, *tmp; |
|
|
TAILQ_FOREACH_SAFE(b, &srv->srv_blob.blobs, blob_node, tmp) { |
TAILQ_FOREACH_SAFE(b, &srv->srv_blob.blobs, blob_node, tmp) { |
Line 771 flushBLOB(sched_task_t *task)
|
Line 775 flushBLOB(sched_task_t *task)
|
e_free(b); |
e_free(b); |
} |
} |
|
|
schedSignalSelf(task); | if (!schedSignalSelf(task)) { |
| /* disabled kqueue support in libaitsched */ |
| struct sigaction sa; |
| |
| memset(&sa, 0, sizeof sa); |
| sigemptyset(&sa.sa_mask); |
| sa.sa_handler = (void (*)(int)) flushBLOB; |
| sa.sa_flags = SA_RESTART | SA_RESETHAND; |
| sigaction(SIGFBLOB, &sa, NULL); |
| } |
| |
return NULL; |
return NULL; |
} |
} |
|
|
Line 985 rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv)
|
Line 999 rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv)
|
return -1; |
return -1; |
} |
} |
|
|
schedSignal(srv->srv_blob.root, flushBLOB, srv, SIGFBLOB, NULL, 0); | if (!schedSignal(srv->srv_blob.root, flushBLOB, srv, SIGFBLOB, NULL, 0)) { |
| /* disabled kqueue support in libaitsched */ |
| struct sigaction sa; |
| |
| atomic_store_rel_ptr(&_glSigArg, (uintptr_t) srv); |
| |
| memset(&sa, 0, sizeof sa); |
| sigemptyset(&sa.sa_mask); |
| sa.sa_handler = (void (*)(int)) flushBLOB; |
| sa.sa_flags = SA_RESTART | SA_RESETHAND; |
| sigaction(SIGFBLOB, &sa, NULL); |
| } |
| |
if (!schedRead(srv->srv_blob.root, acceptBLOBClients, srv, |
if (!schedRead(srv->srv_blob.root, acceptBLOBClients, srv, |
srv->srv_blob.server.cli_sock, NULL, 0)) { |
srv->srv_blob.server.cli_sock, NULL, 0)) { |
rpc_SetErr(sched_GetErrno(), "%s", sched_GetError()); |
rpc_SetErr(sched_GetErrno(), "%s", sched_GetError()); |