|
|
@ -492,14 +492,32 @@ out: |
|
|
|
return pid; |
|
|
|
return pid; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Send a single message to a process instance when there will be no response,
|
|
|
|
struct proc_message { |
|
|
|
* closing the socket immediately. */ |
|
|
|
proc_instance_t *pi; |
|
|
|
void _send_proc(proc_instance_t *pi, const char *msg, const char *file, const char *func, const int line) |
|
|
|
char *msg; |
|
|
|
|
|
|
|
const char *file; |
|
|
|
|
|
|
|
const char *func; |
|
|
|
|
|
|
|
int line; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Send all one way messages asynchronously so we can wait till the receiving
|
|
|
|
|
|
|
|
* end closes the socket to ensure all messages are received but no deadlocks |
|
|
|
|
|
|
|
* can occur with 2 processes waiting for each other's socket closure. */ |
|
|
|
|
|
|
|
void *async_send_proc(void *arg) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
struct proc_message *pm = (struct proc_message *)arg; |
|
|
|
|
|
|
|
proc_instance_t *pi = pm->pi; |
|
|
|
|
|
|
|
char *msg = pm->msg; |
|
|
|
|
|
|
|
const char *file = pm->file; |
|
|
|
|
|
|
|
const char *func = pm->func; |
|
|
|
|
|
|
|
int line = pm->line; |
|
|
|
|
|
|
|
|
|
|
|
char *path = pi->us.path; |
|
|
|
char *path = pi->us.path; |
|
|
|
bool ret = false; |
|
|
|
bool ret = false; |
|
|
|
int sockd; |
|
|
|
int sockd; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pthread_detach(pthread_self()); |
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(!path || !strlen(path))) { |
|
|
|
if (unlikely(!path || !strlen(path))) { |
|
|
|
LOGERR("Attempted to send message %s to null path in send_proc", msg ? msg : ""); |
|
|
|
LOGERR("Attempted to send message %s to null path in send_proc", msg ? msg : ""); |
|
|
|
goto out; |
|
|
|
goto out; |
|
|
@ -533,6 +551,24 @@ out: |
|
|
|
LOGERR("Failure in send_proc from %s %s:%d", file, func, line); |
|
|
|
LOGERR("Failure in send_proc from %s %s:%d", file, func, line); |
|
|
|
childsighandler(15); |
|
|
|
childsighandler(15); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
free(msg); |
|
|
|
|
|
|
|
free(pm); |
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Send a single message to a process instance when there will be no response,
|
|
|
|
|
|
|
|
* closing the socket immediately. */ |
|
|
|
|
|
|
|
void _send_proc(proc_instance_t *pi, const char *msg, const char *file, const char *func, const int line) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
struct proc_message *pm = ckalloc(sizeof(struct proc_message)); |
|
|
|
|
|
|
|
pthread_t pth; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pm->pi = pi; |
|
|
|
|
|
|
|
pm->msg = strdup(msg); |
|
|
|
|
|
|
|
pm->file = file; |
|
|
|
|
|
|
|
pm->func = func; |
|
|
|
|
|
|
|
pm->line = line; |
|
|
|
|
|
|
|
create_pthread(&pth, async_send_proc, pm); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Send a single message to a process instance and retrieve the response, then
|
|
|
|
/* Send a single message to a process instance and retrieve the response, then
|
|
|
|