86
86
pthread_mutex_t mutex;
89
struct ipc_path_data {
90
mar_req_setup_t req_setup;
91
mar_res_setup_t res_setup;
92
char control_map_path[PATH_MAX];
93
char request_map_path[PATH_MAX];
94
char response_map_path[PATH_MAX];
95
char dispatch_map_path[PATH_MAX];
89
98
void ipc_hdb_destructor (void *context);
91
100
DECLARE_HDB_DATABASE(ipc_hdb,ipc_hdb_destructor);
230
#if defined(COROSYNC_SOLARIS) || defined(COROSYNC_BSD) || defined(COROSYNC_DARWIN)
231
/* On many OS poll never return POLLHUP or POLLERR.
232
* EOF is detected when recvmsg return 0.
240
* EOF is also detected when recvmsg return 0.
234
242
if (result == 0) {
235
243
res = CS_ERR_LIBRARY;
240
247
processed += result;
241
248
if (processed != len) {
584
599
union semun semun;
587
mar_req_setup_t req_setup;
588
mar_res_setup_t res_setup;
589
char control_map_path[PATH_MAX];
590
char request_map_path[PATH_MAX];
591
char response_map_path[PATH_MAX];
592
char dispatch_map_path[PATH_MAX];
602
struct ipc_path_data *path_data;
594
604
res = hdb_error_to_cs (hdb_handle_create (&ipc_hdb,
595
605
sizeof (struct ipc_instance), handle));
616
624
socket_nosigpipe (request_fd);
627
path_data = malloc (sizeof(*path_data));
628
if (path_data == NULL) {
631
memset(path_data, 0, sizeof(*path_data));
633
path_data->res_setup.error = CS_ERR_LIBRARY;
619
635
memset (&address, 0, sizeof (struct sockaddr_un));
620
636
address.sun_family = AF_UNIX;
621
637
#if defined(COROSYNC_BSD) || defined(COROSYNC_DARWIN)
667
683
sys_res = circular_memory_map (
684
path_data->dispatch_map_path,
669
685
"dispatch_buffer-XXXXXX",
670
686
(void *)&ipc_instance->dispatch_buffer,
721
737
* Initialize IPC setup message
723
req_setup.service = service;
724
strcpy (req_setup.control_file, control_map_path);
725
strcpy (req_setup.request_file, request_map_path);
726
strcpy (req_setup.response_file, response_map_path);
727
strcpy (req_setup.dispatch_file, dispatch_map_path);
728
req_setup.control_size = 8192;
729
req_setup.request_size = request_size;
730
req_setup.response_size = response_size;
731
req_setup.dispatch_size = dispatch_size;
739
path_data->req_setup.service = service;
740
strcpy (path_data->req_setup.control_file, path_data->control_map_path);
741
strcpy (path_data->req_setup.request_file, path_data->request_map_path);
742
strcpy (path_data->req_setup.response_file, path_data->response_map_path);
743
strcpy (path_data->req_setup.dispatch_file, path_data->dispatch_map_path);
744
path_data->req_setup.control_size = 8192;
745
path_data->req_setup.request_size = request_size;
746
path_data->req_setup.response_size = response_size;
747
path_data->req_setup.dispatch_size = dispatch_size;
733
749
#if _POSIX_THREAD_PROCESS_SHARED < 1
734
req_setup.semkey = semkey;
750
path_data->req_setup.semkey = semkey;
737
res = socket_send (request_fd, &req_setup, sizeof (mar_req_setup_t));
753
res = socket_send (request_fd, &path_data->req_setup, sizeof (mar_req_setup_t));
738
754
if (res != CS_OK) {
741
res = socket_recv (request_fd, &res_setup, sizeof (mar_res_setup_t));
757
res = socket_recv (request_fd, &path_data->res_setup, sizeof (mar_res_setup_t));
742
758
if (res != CS_OK) {
746
762
ipc_instance->fd = request_fd;
748
if (res_setup.error == CS_ERR_TRY_AGAIN) {
749
res = res_setup.error;
764
if (path_data->res_setup.error == CS_ERR_TRY_AGAIN) {
765
res = path_data->res_setup.error;
760
776
hdb_handle_put (&ipc_hdb, *handle);
762
return (res_setup.error);
778
res = path_data->res_setup.error;
765
783
#if _POSIX_THREAD_PROCESS_SHARED < 1
880
if (shared_mem_dispatch_bytes_left (ipc_instance) > (ipc_instance->dispatch_size/2)) {
882
* Notify coroipcs to flush any pending dispatch messages
884
res = ipc_sem_post (ipc_instance->control_buffer, SEMAPHORE_REQUEST_OR_FLUSH_OR_EXIT);
886
error = CS_ERR_LIBRARY;
863
893
ufds.fd = ipc_instance->fd;
885
915
error = socket_recv (ipc_instance->fd, &buf, 1);
916
#if defined(COROSYNC_SOLARIS) || defined(COROSYNC_BSD) || defined(COROSYNC_DARWIN)
917
/* On many OS poll() never returns POLLHUP or POLLERR.
918
* EOF is detected when recvmsg() return 0.
920
if ( error == CS_ERR_LIBRARY )
886
923
assert (error == CS_OK);
888
if (shared_mem_dispatch_bytes_left (ipc_instance) > 500000) {
925
if (shared_mem_dispatch_bytes_left (ipc_instance) > (ipc_instance->dispatch_size/2)) {
890
927
* Notify coroipcs to flush any pending dispatch messages
941
978
read_idx = ipc_instance->control_buffer->read;
942
979
header = (coroipc_response_header_t *) &addr[read_idx];
943
980
ipc_instance->control_buffer->read =
944
(read_idx + header->size) % ipc_instance->dispatch_size;
981
((read_idx + header->size + 7) & 0xFFFFFFF8) %
982
ipc_instance->dispatch_size;
946
985
* Put from dispatch get and also from this call's get