From 7619572ed1cc6221e7223d50b40e50992e130f7b Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Tue, 26 May 2009 18:26:27 +0200 Subject: [PATCH 1/1] Added mutex to protect request send from multiple threads On TCP, requests sent from multiple threads could be theoretically intermixed. --- src/peer.c | 1 + src/peer.h | 3 ++- src/request.c | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/peer.c b/src/peer.c index 63c97f7..ea04c0c 100644 --- a/src/peer.c +++ b/src/peer.c @@ -79,6 +79,7 @@ forb_peer_new(void) memset(peer, 0, sizeof(*peer)); fosa_cond_init(&peer->cond); forb_ref_init(&peer->ref); + fosa_mutex_init(&peer->send_lock, 0); } return peer; } diff --git a/src/peer.h b/src/peer.h index 540f6af..57e06f5 100644 --- a/src/peer.h +++ b/src/peer.h @@ -62,7 +62,7 @@ #include "refcnt.h" #include #include - +#include /** * State of a peer. * @@ -91,6 +91,7 @@ typedef struct forb_peer { forb_ref_t ref; /**< Reference count */ enum forb_peer_state state; fosa_cond_t cond; /**< Condition variable for waiting after the peer is discovered. Used together with forb_t::peer_mutex. */ + fosa_mutex_t send_lock; } forb_peer_t; diff --git a/src/request.c b/src/request.c index 08a8c2e..53de5e2 100644 --- a/src/request.c +++ b/src/request.c @@ -217,7 +217,9 @@ forb_request_send(forb_request_t *req, CORBA_Environment *env) } len = FORB_CDR_data_size(&req->cdr_request); + fosa_mutex_lock(&peer->send_lock); size = forb_proto_send(peer, &req->cdr_request); + fosa_mutex_unlock(&peer->send_lock); if (size <= 0 || size != len) { env->major = FORB_EX_COMM_FAILURE; /* Request is deleted when the stub calls forb_request_destroy() */ -- 2.39.2