]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
Added mutex to protect request send from multiple threads
authorMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 26 May 2009 16:26:27 +0000 (18:26 +0200)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 26 May 2009 16:26:27 +0000 (18:26 +0200)
On TCP, requests sent from multiple threads could be theoretically
intermixed.

src/peer.c
src/peer.h
src/request.c

index 63c97f7c7319c69ed9e688ab1494017f3785f7e3..ea04c0c94ccb41f7f88aa8b3867b68aeacf350cf 100644 (file)
@@ -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;
 }
index 540f6af7cfb3db061989e1bf09dfaaba7a74d82b..57e06f57e60d817b519805d4179d60577a0f280e 100644 (file)
@@ -62,7 +62,7 @@
 #include "refcnt.h"
 #include <ul_gavl.h>
 #include <ul_list.h>
-
+#include <fosa_mutexes_and_condvars.h>
 /**
  * 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;
 
 
index 08a8c2eace801965d39050f93eb3a743cc38afd3..53de5e2e26d9facc905c9b6fa6c0fc36d27f9399 100644 (file)
@@ -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() */