]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Add tor_cond_init/uninit
authorNick Mathewson <nickm@torproject.org>
Mon, 23 Sep 2013 05:15:30 +0000 (01:15 -0400)
committerNick Mathewson <nickm@torproject.org>
Wed, 14 Jan 2015 15:49:59 +0000 (10:49 -0500)
src/common/compat_pthreads.c
src/common/compat_threads.c
src/common/compat_threads.h
src/common/compat_winthreads.c

index 0e5d33a659158f042f486f0ebd4e0072ec5d1ad3..e58b3f7b5764b1ff2ee284471e1dd39661123c18 100644 (file)
@@ -148,28 +148,23 @@ tor_get_thread_id(void)
 
 /* Conditions. */
 
-/** Return a newly allocated condition, with nobody waiting on it. */
-tor_cond_t *
-tor_cond_new(void)
+int
+tor_cond_init(tor_cond_t *cond)
 {
-  tor_cond_t *cond = tor_malloc_zero(sizeof(tor_cond_t));
+  memset(cond, 0, sizeof(tor_cond_t));
   if (pthread_cond_init(&cond->cond, NULL)) {
-    tor_free(cond);
-    return NULL;
+    return -1;
   }
-  return cond;
+  return 0;
 }
 /** Release all resources held by <b>cond</b>. */
 void
-tor_cond_free(tor_cond_t *cond)
+tor_cond_uninit(tor_cond_t *cond)
 {
-  if (!cond)
-    return;
   if (pthread_cond_destroy(&cond->cond)) {
     log_warn(LD_GENERAL,"Error freeing condition: %s", strerror(errno));
     return;
   }
-  tor_free(cond);
 }
 /** Wait until one of the tor_cond_signal functions is called on <b>cond</b>.
  * All waiters on the condition must wait holding the same <b>mutex</b>.
index 84a8a21fe273059a042af3f9292ae50043b34c4c..e0cbf5c1d80ab5e81cc084005398d8ed8f2a1a3e 100644 (file)
@@ -24,6 +24,23 @@ tor_mutex_free(tor_mutex_t *m)
   tor_free(m);
 }
 
+tor_cond_t *
+tor_cond_new(void)
+{
+  tor_cond_t *cond = tor_malloc(sizeof(tor_cond_t));
+  if (tor_cond_init(cond)<0)
+    tor_free(cond);
+  return cond;
+}
+void
+tor_cond_free(tor_cond_t *c)
+{
+  if (!c)
+    return;
+  tor_cond_uninit(c);
+  tor_free(c);
+}
+
 /** Identity of the "main" thread */
 static unsigned long main_thread_id = -1;
 
index bbd782fd4517a0d8e6c4274d900a937b09f9a778..6d3ba3ae2109f695e7d896347bb9c2493b81c939 100644 (file)
@@ -74,6 +74,8 @@ typedef struct tor_cond_t {
 
 tor_cond_t *tor_cond_new(void);
 void tor_cond_free(tor_cond_t *cond);
+int tor_cond_init(tor_cond_t *cond);
+void tor_cond_uninit(tor_cond_t *cond);
 int tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex,
                   const struct timeval *tv);
 void tor_cond_signal_one(tor_cond_t *cond);
index 634dfbed30520d7e1e76ab41d51342b2e9e2fcd5..11f91c63dfb19b28f4d824cb4137b8e9c01fb669 100644 (file)
@@ -70,30 +70,25 @@ tor_get_thread_id(void)
   return (unsigned long)GetCurrentThreadId();
 }
 
-tor_cond_t *
-tor_cond_new(void)
+int
+tor_cond_init(tor_cond_t *cond)
 {
-  tor_cond_t *cond = tor_malloc(sizeof(tor_cond_t));
+  memset(cond, 0, sizeof(tor_cond_t));
   if (InitializeCriticalSectionAndSpinCount(&cond->lock, SPIN_COUNT)==0) {
-    tor_free(cond);
-    return NULL;
+    return -1;
   }
   if ((cond->event = CreateEvent(NULL,TRUE,FALSE,NULL)) == NULL) {
     DeleteCriticalSection(&cond->lock);
-    tor_free(cond);
-    return NULL;
+    return -1;
   }
   cond->n_waiting = cond->n_to_wake = cond->generation = 0;
-  return cond;
+  return 0;
 }
 void
-tor_cond_free(tor_cond_t *cond)
+tor_cond_uninit(tor_cond_t *cond)
 {
-  if (!cond)
-    return;
   DeleteCriticalSection(&cond->lock);
   CloseHandle(cond->event);
-  mm_free(cond);
 }
 
 static void