[Spread-cvs] commit: r292 - trunk/libspread

jschultz at spread.org jschultz at spread.org
Tue Feb 14 20:28:26 EST 2006


Author: jschultz
Date: 2006-02-14 20:28:26 -0500 (Tue, 14 Feb 2006)
New Revision: 292

Modified:
   trunk/libspread/fl.c
   trunk/libspread/fl_p.h
Log:
Changes to make Flush build correctly with or without multithreaded support.  If _REETRANT is not defined it assumes single threaded build and all the thread calls are macro replaced with nothing.  Otherwise, the normal StdUtil fcns are called.



Modified: trunk/libspread/fl.c
===================================================================
--- trunk/libspread/fl.c	2006-02-13 21:08:43 UTC (rev 291)
+++ trunk/libspread/fl.c	2006-02-15 01:28:26 UTC (rev 292)
@@ -45,9 +45,12 @@
 #include <fl_p.h>
 #include <stdutil/stdutil.h>
 
+#ifdef _REENTRANT
+static FL_MUTEX glob_conns_lock;
+#endif
+
 /* glob_conns is a look up table that maps mailboxes to fl_conn*s */
-static stdmutex glob_conns_lock;
-static stdhash  glob_conns      = STDHASH_STATIC_CONSTRUCT(sizeof(mailbox), sizeof(fl_conn*), NULL, NULL, 0);
+static stdhash  glob_conns = STDHASH_STATIC_CONSTRUCT(sizeof(mailbox), sizeof(fl_conn*), NULL, NULL, 0);
 
 /********************************* public flush layer interface ********************************/
 
@@ -88,7 +91,8 @@
 
   if (first_time) {
     first_time = STDFALSE;
-    ret = stdmutex_construct(&glob_conns_lock, STDMUTEX_FAST);
+    FL_MUTEX_construct(&glob_conns_lock, STDMUTEX_FAST);
+    ret = 0;
   }
 
   return ret;
@@ -119,13 +123,13 @@
     if ((conn = (fl_conn*) calloc(1, sizeof(fl_conn))) == 0)
       stderr_abort("(%s, %d): calloc(1, %u)\n", __FILE__, __LINE__, sizeof(fl_conn));
     
-    stdmutex_construct(&conn->reserve_lock, STDMUTEX_FAST);
+    FL_MUTEX_construct(&conn->reserve_lock, STDMUTEX_FAST);
     conn->reservations  = 0;
     conn->disconnecting = 0;
-    stdcond_construct(&conn->destroy_cond);
+    FL_COND_construct(&conn->destroy_cond);
     
-    stdmutex_construct(&conn->recv_lock, STDMUTEX_FAST);
-    stdmutex_construct(&conn->conn_lock, STDMUTEX_FAST);
+    FL_MUTEX_construct(&conn->recv_lock, STDMUTEX_FAST);
+    FL_MUTEX_construct(&conn->conn_lock, STDMUTEX_FAST);
     
     conn->mbox       = *mbox;
     conn->priority   = priority;
@@ -139,9 +143,9 @@
     stddll_construct(&conn->mess_queue, sizeof(gc_buff_mess*));             /* <gc_buff_mess*> */
     conn->bytes_queued = 0;
     
-    stdmutex_grab(&glob_conns_lock);                                         /* LOCK CONNS TAB */
+    FL_MUTEX_grab(&glob_conns_lock);                                         /* LOCK CONNS TAB */
     stdhash_insert(&glob_conns, 0, mbox, &conn);                   /* add mbox -> conn mapping */
-    stdmutex_drop(&glob_conns_lock);                                     /* UNLOCK CONNS TAB */
+    FL_MUTEX_drop(&glob_conns_lock);                                     /* UNLOCK CONNS TAB */
   }
 
   DEBUG(std_stkfprintf(stderr, -1, "FL_connect: ret %d\n", ret));
@@ -161,32 +165,32 @@
   int ret;
 
   DEBUG(std_stkfprintf(stderr, 1, "FL_disconnect: mbox %d\n", mbox));
-  stdmutex_grab(&glob_conns_lock);                                           /* LOCK CONNS TAB */
+  FL_MUTEX_grab(&glob_conns_lock);                                           /* LOCK CONNS TAB */
   if (!stdhash_is_end(&glob_conns, stdhash_find(&glob_conns, &hit, &mbox))) {              /* mbox found */
     conn = *(fl_conn**) stdhash_it_val(&hit);
     stdhash_erase(&glob_conns, &hit);                                 /* remove mbox -> fl_conn* mapping */
-    stdmutex_drop(&glob_conns_lock);                                     /* UNLOCK CONNS TAB */
+    FL_MUTEX_drop(&glob_conns_lock);                                     /* UNLOCK CONNS TAB */
     /* now threads cannot come behind us and make_reservations() on this fl_conn */
     
-    stdmutex_grab(&conn->reserve_lock);                                   /* LOCK RESERVE_LOCK */
+    FL_MUTEX_grab(&conn->reserve_lock);                                   /* LOCK RESERVE_LOCK */
     conn->disconnecting = 1;                                 /* set disconnection indicator */
     ret = SP_disconnect(mbox);                                /* unblock any blocked receivers */
     
     if (conn->reservations != 0) {                          /* WAIT if connection still in use */
       DEBUG(std_stkfprintf(stderr, 0, "Waiting for mbox(%d, %p) to no longer be in use: "
 			   "%d reservations!\n", mbox, conn, conn->reservations));
-      stdcond_wait(&conn->destroy_cond, &conn->reserve_lock);
+      FL_COND_wait(&conn->destroy_cond, &conn->reserve_lock);
     }
     assert(conn->reservations == 0);                         /* should be no more reservations */
 
     /* now, no other threads are using the connection -> safe to reclaim */
     DEBUG(std_stkfprintf(stderr, 0, "Mbox(%d, %p) no longer in use: reclaiming!\n", mbox, conn));
-    stdmutex_drop(&conn->reserve_lock);                               /* UNLOCK RESERVE_LOCK */
+    FL_MUTEX_drop(&conn->reserve_lock);                               /* UNLOCK RESERVE_LOCK */
     
-    stdmutex_destruct(&conn->reserve_lock);  /* recursively destroy fl_conn and sub-structures */
-    stdcond_destruct(&conn->destroy_cond);
-    stdmutex_destruct(&conn->recv_lock);
-    stdmutex_destruct(&conn->conn_lock);
+    FL_MUTEX_destruct(&conn->reserve_lock);  /* recursively destroy fl_conn and sub-structures */
+    FL_COND_destruct(&conn->destroy_cond);
+    FL_MUTEX_destruct(&conn->recv_lock);
+    FL_MUTEX_destruct(&conn->conn_lock);
     
     for (stdhash_begin(&conn->groups, &hit); !stdhash_is_end(&conn->groups, &hit); stdhash_it_next(&hit))
       free_fl_group(*(fl_group**) stdhash_it_val(&hit));
@@ -198,7 +202,7 @@
     
     free(conn);
   } else {
-    stdmutex_drop(&glob_conns_lock);                                     /* UNLOCK CONNS TAB */
+    FL_MUTEX_drop(&glob_conns_lock);                                     /* UNLOCK CONNS TAB */
     DEBUG(std_stkfprintf(stderr, 0, "FL ILLEGAL_SESSION(%d)\n", mbox));
     ret = ILLEGAL_SESSION; 
   }
@@ -738,28 +742,31 @@
   stdit hit;
   fl_conn *conn;
 
-  stdmutex_grab(&glob_conns_lock);                                 /* LOCK CONNS TAB */
+  FL_MUTEX_grab(&glob_conns_lock);                                 /* LOCK CONNS TAB */
 
-  if (stdhash_is_end(&glob_conns, stdhash_find(&glob_conns, &hit, &mbox)))     /* no such mbox */
-    return stdmutex_drop(&glob_conns_lock), (fl_conn*) 0;      /* UNLOCK CONNS TAB */
+  if (stdhash_is_end(&glob_conns, stdhash_find(&glob_conns, &hit, &mbox))) {    /* no such mbox */
+    FL_MUTEX_drop(&glob_conns_lock);
+    return (fl_conn*) 0;                                                        /* UNLOCK CONNS TAB */
+  }
 
   conn = *(fl_conn**) stdhash_it_val(&hit);
-  stdmutex_grab(&conn->reserve_lock);                           /* LOCK RESERVE_LOCK */
-  stdmutex_drop(&glob_conns_lock);                             /* UNLOCK CONNS TAB */
+  FL_MUTEX_grab(&conn->reserve_lock);                           /* LOCK RESERVE_LOCK */
+  FL_MUTEX_drop(&glob_conns_lock);                             /* UNLOCK CONNS TAB */
   if (!conn->disconnecting)                                /* check if disconnecting */
     ++conn->reservations;                               /* increment reservation cnt */
-  stdmutex_drop(&conn->reserve_lock);                       /* UNLOCK RESERVE_LOCK */
+  FL_MUTEX_drop(&conn->reserve_lock);                       /* UNLOCK RESERVE_LOCK */
 
   return !conn->disconnecting ? conn : 0;
 }
 
 /* Relinquish a reservation this thread owns on a connection. */
 static void cancel_reservation(fl_conn *conn) {
-  stdmutex_grab(&conn->reserve_lock);                           /* LOCK RESERVE_LOCK */
+  FL_MUTEX_grab(&conn->reserve_lock);                           /* LOCK RESERVE_LOCK */
   assert(conn->reservations != 0);
-  if (--conn->reservations == 0 && conn->disconnecting) /* decrement reservation cnt */
-    stdcond_wake_all(&conn->destroy_cond);               /* signal disconnector thread */
-  stdmutex_drop(&conn->reserve_lock);                       /* UNLOCK RESERVE_LOCK */
+  if (--conn->reservations == 0 && conn->disconnecting) { /* decrement reservation cnt */
+    FL_COND_wake_all(&conn->destroy_cond);               /* signal disconnector thread */
+  }
+  FL_MUTEX_drop(&conn->reserve_lock);                       /* UNLOCK RESERVE_LOCK */
 }
 
 /* Acquire a connection's conn lock. The caller must have an
@@ -774,9 +781,11 @@
    prevent self-deadlocks.  
 */
 static int acquire_conn_lock(fl_conn *conn) {
-  stdmutex_grab(&conn->conn_lock);                                 /* LOCK CONN_LOCK */
-  if (conn->disconnecting)                                  /* conn is disconnecting */
-    return stdmutex_drop(&conn->conn_lock), 0;
+  FL_MUTEX_grab(&conn->conn_lock);                                 /* LOCK CONN_LOCK */
+  if (conn->disconnecting) {                                /* conn is disconnecting */
+    FL_MUTEX_drop(&conn->conn_lock);
+    return 0;
+  }
 
   return 1;
 }
@@ -787,7 +796,7 @@
    any intervening calls to release_conn_lock on release.  
 */
 static void release_conn_lock(fl_conn *release) {
-  stdmutex_drop(&release->conn_lock);                            /* UNLOCK CONN_LOCK */
+  FL_MUTEX_drop(&release->conn_lock);                            /* UNLOCK CONN_LOCK */
 }
 
 /* Acquire a connection's recv lock. The caller must have an
@@ -804,9 +813,11 @@
    ENTER THE BODY OF FL_scat_recv!!  
 */
 static int acquire_recv_lock(fl_conn *conn) {
-  stdmutex_grab(&conn->recv_lock);           /* LOCK RECV_LOCK */
-  if (conn->disconnecting)                   /* conn is disconnecting */
-    return stdmutex_drop(&conn->recv_lock), 0;
+  FL_MUTEX_grab(&conn->recv_lock);           /* LOCK RECV_LOCK */
+  if (conn->disconnecting) {                 /* conn is disconnecting */
+    FL_MUTEX_drop(&conn->recv_lock);
+    return 0;
+  }
 
   return 1;
 }
@@ -817,7 +828,7 @@
    intervening calls to release_recv_lock on release.  
 */
 static void release_recv_lock(fl_conn *release) {
-  stdmutex_drop(&release->recv_lock);           /* UNLOCK RECV_LOCK */
+  FL_MUTEX_drop(&release->recv_lock);           /* UNLOCK RECV_LOCK */
 }
 
 static fl_group *add_group(fl_conn *conn, const char *group_name) {
@@ -1087,9 +1098,9 @@
   int grp_not_priv;                                           /* is grp not a private group ? */
   int ret, i;
 
-  int fix_scat = 0;                                      /* did I modify the user's scat? */
+  int fix_scat = 0;                                           /* did I modify the user's scat? */
   scatter *scat = (scatter*) user_scat;                           /* get rid of const warnings */
-  scat_element senders_elem;                   /* for copy of user's element I might overwrite */
+  scat_element senders_elem = { 0 };           /* for copy of user's element I might overwrite */
   char copy_buf[sizeof(group_id) + sizeof(int16) + MAX_GROUP_NAME];           /* append buffer */
   char *curr_ptr = copy_buf, *key;                             /* current pos in append buffer */
 

Modified: trunk/libspread/fl_p.h
===================================================================
--- trunk/libspread/fl_p.h	2006-02-13 21:08:43 UTC (rev 291)
+++ trunk/libspread/fl_p.h	2006-02-15 01:28:26 UTC (rev 292)
@@ -32,8 +32,6 @@
  *
  */
 
-
-
 #ifndef flush_p_h_2000_04_24_14_16_31_jschultz_at_cnds_jhu_edu
 #define flush_p_h_2000_04_24_14_16_31_jschultz_at_cnds_jhu_edu
 
@@ -42,13 +40,14 @@
    assume that all reasonable calls to stdutil fcns won't fail, and if
    they do (due to a system problem, such as malloc failing) they abort
    with an appropriate error message, line number, etc.
+
+   JLS 2006 - That's bad form for a library John. Oh well ... ;)
 */
 
 #include <fl.h>
 #include <scatp.h>
 #include <stdutil/stddefines.h>
 #include <stdutil/stderror.h>
-#include <stdutil/stdthread.h>
 #include <stdutil/stddll.h>
 #include <stdutil/stdhash.h>
 
@@ -56,6 +55,31 @@
 #define FL_MINOR_VERSION 0
 #define FL_PATCH_VERSION 0
 
+#ifdef _REENTRANT
+#  include <stdutil/stdthread.h>
+#  define FL_MUTEX                      stdmutex
+#  define FL_COND                       stdcond
+#  define FL_MUTEX_construct(mut, type) stdmutex_construct((mut), (type))
+#  define FL_MUTEX_destruct(mut)        stdmutex_destruct(mut)
+#  define FL_MUTEX_grab(mut)            stdmutex_grab(mut)
+#  define FL_MUTEX_drop(mut)            stdmutex_drop(mut)
+#  define FL_COND_construct(cond)       stdcond_construct(cond)
+#  define FL_COND_destruct(cond)        stdcond_destruct(cond)
+#  define FL_COND_wait(cond, mut)       stdcond_wait((cond), (mut))
+#  define FL_COND_wake_all(cond)        stdcond_wake_all(cond)
+#else
+#  define FL_MUTEX                      int
+#  define FL_COND                       int
+#  define FL_MUTEX_construct(mut, type)
+#  define FL_MUTEX_destruct(mut)
+#  define FL_MUTEX_grab(mut)
+#  define FL_MUTEX_drop(mut)
+#  define FL_COND_construct(cond)
+#  define FL_COND_destruct(cond)
+#  define FL_COND_wait(cond, mut)
+#  define FL_COND_wake_all(cond)
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -215,13 +239,13 @@
 
 /* This struct contains all of the connection level context for a connection */
 typedef struct {
-  stdmutex reserve_lock;  /* protects reservations, disconnecting; destroy_cond's mutex */
+  FL_MUTEX reserve_lock;  /* protects reservations, disconnecting; destroy_cond's mutex */
   size_t   reservations;                    /* count of reservations on this connection */
   int      disconnecting;                     /* is this connection being disconnected? */
-  stdcond  destroy_cond;   /* disconnector thread waits on this until reservations == 0 */
+  FL_COND  destroy_cond;   /* disconnector thread waits on this until reservations == 0 */
 
-  stdmutex recv_lock;             /* used to serialize calls to FL_recv on a connection */
-  stdmutex conn_lock;            /* lock for access to the connection's data, see below */
+  FL_MUTEX recv_lock;             /* used to serialize calls to FL_recv on a connection */
+  FL_MUTEX conn_lock;            /* lock for access to the connection's data, see below */
 
   /* acquiring conn_lock allows a thread to examine everything below here */
   mailbox mbox;           




More information about the Spread-cvs mailing list