mirror of
https://git.proxmox.com/git/mirror_corosync
synced 2025-08-04 19:21:48 +00:00
Serialize access to service engines.
git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1868 fd59a12c-fef9-0310-b244-a6a79926bd2f
This commit is contained in:
parent
9e9fe9d3e5
commit
4711f1e236
19
exec/ipc.c
19
exec/ipc.c
@ -104,6 +104,10 @@ LOGSYS_DECLARE_SUBSYS ("IPC", LOG_INFO);
|
||||
|
||||
static unsigned int g_gid_valid = 0;
|
||||
|
||||
static void (*ipc_serialize_lock_fn) (void);
|
||||
|
||||
static void (*ipc_serialize_unlock_fn) (void);
|
||||
|
||||
DECLARE_LIST_INIT (conn_info_list_head);
|
||||
|
||||
struct outq_item {
|
||||
@ -224,12 +228,14 @@ static inline int conn_info_destroy (struct conn_info *conn_info)
|
||||
return (0);
|
||||
}
|
||||
|
||||
ipc_serialize_lock_fn();
|
||||
/*
|
||||
* Retry library exit function if busy
|
||||
*/
|
||||
if (conn_info->state == CONN_STATE_THREAD_DESTROYED) {
|
||||
res = ais_service[conn_info->service]->lib_exit_fn (conn_info);
|
||||
if (res == -1) {
|
||||
ipc_serialize_unlock_fn();
|
||||
return (0);
|
||||
} else {
|
||||
conn_info->state = CONN_STATE_LIB_EXIT_CALLED;
|
||||
@ -239,6 +245,7 @@ static inline int conn_info_destroy (struct conn_info *conn_info)
|
||||
pthread_mutex_lock (&conn_info->mutex);
|
||||
if (conn_info->refcount > 0) {
|
||||
pthread_mutex_unlock (&conn_info->mutex);
|
||||
ipc_serialize_unlock_fn();
|
||||
return (0);
|
||||
}
|
||||
list_del (&conn_info->list);
|
||||
@ -259,6 +266,7 @@ static inline int conn_info_destroy (struct conn_info *conn_info)
|
||||
}
|
||||
close (conn_info->fd);
|
||||
free (conn_info);
|
||||
ipc_serialize_unlock_fn();
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@ -315,7 +323,9 @@ retry_semop:
|
||||
(sync_in_process() == 0)));
|
||||
|
||||
if (send_ok) {
|
||||
ipc_serialize_lock_fn();
|
||||
ais_service[conn_info->service]->lib_engine[header->id].lib_handler_fn (conn_info, header);
|
||||
ipc_serialize_unlock_fn();
|
||||
} else {
|
||||
/*
|
||||
* Overload, tell library to retry
|
||||
@ -772,12 +782,19 @@ void message_source_set (
|
||||
source->conn = conn;
|
||||
}
|
||||
|
||||
void cs_ipc_init (unsigned int gid_valid)
|
||||
void cs_ipc_init (
|
||||
unsigned int gid_valid,
|
||||
void (*serialize_lock_fn) (void),
|
||||
void (*serialize_unlock_fn) (void))
|
||||
{
|
||||
int libais_server_fd;
|
||||
struct sockaddr_un un_addr;
|
||||
int res;
|
||||
|
||||
ipc_serialize_lock_fn = serialize_lock_fn;
|
||||
|
||||
ipc_serialize_unlock_fn = serialize_unlock_fn;
|
||||
|
||||
/*
|
||||
* Create socket for libais clients, name socket, listen for connections
|
||||
*/
|
||||
|
@ -40,7 +40,10 @@ extern void message_source_set (mar_message_source_t *source, void *conn);
|
||||
extern int message_source_is_local (mar_message_source_t *source);
|
||||
|
||||
extern void cs_ipc_init (
|
||||
unsigned int gid_valid);
|
||||
unsigned int gid_valid,
|
||||
void (*serialize_lock_fn) (void),
|
||||
void (*serialize_unlock_fn) (void)
|
||||
);
|
||||
|
||||
extern void *cs_conn_private_data_get (void *conn);
|
||||
|
||||
|
@ -679,7 +679,9 @@ int main (int argc, char **argv)
|
||||
|
||||
corosync_mempool_init ();
|
||||
|
||||
cs_ipc_init (main_config.gid);
|
||||
cs_ipc_init (main_config.gid,
|
||||
serialize_mutex_lock,
|
||||
serialize_mutex_unlock);
|
||||
|
||||
/*
|
||||
* Start main processing loop
|
||||
|
Loading…
Reference in New Issue
Block a user