|
|
@@ -177,7 +177,7 @@ static int response_init_send_response (
|
|
|
void *message)
|
|
|
{
|
|
|
SaAisErrorT error = SA_AIS_ERR_ACCESS;
|
|
|
- size_t cinfo = (size_t)conn_info;
|
|
|
+ uintptr_t cinfo = (uintptr_t)conn_info;
|
|
|
mar_req_lib_response_init_t *req_lib_response_init = (mar_req_lib_response_init_t *)message;
|
|
|
mar_res_lib_response_init_t res_lib_response_init;
|
|
|
|
|
|
@@ -207,7 +207,7 @@ static int dispatch_init_send_response (
|
|
|
void *message)
|
|
|
{
|
|
|
SaAisErrorT error = SA_AIS_ERR_ACCESS;
|
|
|
- size_t cinfo;
|
|
|
+ uintptr_t cinfo;
|
|
|
mar_req_lib_dispatch_init_t *req_lib_dispatch_init = (mar_req_lib_dispatch_init_t *)message;
|
|
|
mar_res_lib_dispatch_init_t res_lib_dispatch_init;
|
|
|
struct conn_info *msg_conn_info;
|
|
|
@@ -219,10 +219,19 @@ static int dispatch_init_send_response (
|
|
|
else
|
|
|
error = SA_AIS_OK;
|
|
|
|
|
|
- cinfo = (size_t)req_lib_dispatch_init->conn_info;
|
|
|
+ cinfo = (uintptr_t)req_lib_dispatch_init->conn_info;
|
|
|
conn_info->conn_info_partner = (struct conn_info *)cinfo;
|
|
|
+
|
|
|
+ /* temporary fix for memory leak
|
|
|
+ */
|
|
|
+ pthread_mutex_destroy (conn_info->conn_info_partner->shared_mutex);
|
|
|
+ free (conn_info->conn_info_partner->shared_mutex);
|
|
|
+
|
|
|
conn_info->conn_info_partner->shared_mutex = conn_info->shared_mutex;
|
|
|
|
|
|
+ list_add (&conn_info_list_head, &conn_info->list);
|
|
|
+ list_add (&conn_info_list_head, &conn_info->conn_info_partner->list);
|
|
|
+
|
|
|
msg_conn_info = (struct conn_info *)cinfo;
|
|
|
msg_conn_info->conn_info_partner = conn_info;
|
|
|
|
|
|
@@ -317,16 +326,22 @@ static inline unsigned int conn_info_create (int fd) {
|
|
|
pthread_mutex_init (&conn_info->flow_control_mutex, NULL);
|
|
|
pthread_mutex_init (conn_info->shared_mutex, NULL);
|
|
|
|
|
|
+ list_init (&conn_info->list);
|
|
|
conn_info->state = CONN_STATE_ACTIVE;
|
|
|
conn_info->fd = fd;
|
|
|
conn_info->events = POLLIN|POLLNVAL;
|
|
|
conn_info->service = SOCKET_SERVICE_INIT;
|
|
|
|
|
|
- list_init (&conn_info->list);
|
|
|
- list_add (&conn_info_list_head, &conn_info->list);
|
|
|
-
|
|
|
pthread_attr_init (&conn_info->thread_attr);
|
|
|
+/*
|
|
|
+ * IA64 needs more stack space then other arches
|
|
|
+ */
|
|
|
+#if defined(__ia64__)
|
|
|
+ pthread_attr_setstacksize (&conn_info->thread_attr, 400000);
|
|
|
+#else
|
|
|
pthread_attr_setstacksize (&conn_info->thread_attr, 200000);
|
|
|
+#endif
|
|
|
+
|
|
|
pthread_attr_setdetachstate (&conn_info->thread_attr, PTHREAD_CREATE_DETACHED);
|
|
|
res = pthread_create (&conn_info->thread, &conn_info->thread_attr,
|
|
|
prioritized_poll_thread, conn_info);
|
|
|
@@ -351,6 +366,10 @@ static void conn_info_destroy (struct conn_info *conn_info)
|
|
|
if (conn_info->conn_info_partner) {
|
|
|
conn_info->conn_info_partner->conn_info_partner = NULL;
|
|
|
}
|
|
|
+
|
|
|
+ pthread_attr_destroy (&conn_info->thread_attr);
|
|
|
+ pthread_mutex_destroy (&conn_info->mutex);
|
|
|
+
|
|
|
list_del (&conn_info->list);
|
|
|
free (conn_info);
|
|
|
}
|
|
|
@@ -449,6 +468,7 @@ static void *prioritized_poll_thread (void *conn)
|
|
|
pthread_mutex_t *rel_mutex;
|
|
|
unsigned int service;
|
|
|
struct conn_info *cinfo_partner;
|
|
|
+ void *private_data;
|
|
|
|
|
|
sched_param.sched_priority = 1;
|
|
|
res = pthread_setschedparam (conn_info->thread, SCHED_RR, &sched_param);
|
|
|
@@ -466,6 +486,7 @@ retry_poll:
|
|
|
switch (conn_info->state) {
|
|
|
case CONN_STATE_SECURITY:
|
|
|
conn_info_mutex_unlock (conn_info, service);
|
|
|
+ pthread_mutex_destroy (conn_info->shared_mutex);
|
|
|
free (conn_info->shared_mutex);
|
|
|
conn_info_destroy (conn);
|
|
|
pthread_exit (0);
|
|
|
@@ -482,6 +503,7 @@ retry_poll:
|
|
|
|
|
|
case CONN_STATE_DISCONNECTED:
|
|
|
rel_mutex = conn_info->shared_mutex;
|
|
|
+ private_data = conn_info->private_data;
|
|
|
cinfo_partner = conn_info->conn_info_partner;
|
|
|
conn_info_destroy (conn);
|
|
|
if (service == SOCKET_SERVICE_INIT) {
|
|
|
@@ -490,7 +512,9 @@ retry_poll:
|
|
|
pthread_mutex_unlock (rel_mutex);
|
|
|
}
|
|
|
if (cinfo_partner == NULL) {
|
|
|
+ pthread_mutex_destroy (rel_mutex);
|
|
|
free (rel_mutex);
|
|
|
+ free (private_data);
|
|
|
}
|
|
|
pthread_exit (0);
|
|
|
/*
|