| 
					
				 | 
			
			
				@@ -1524,73 +1524,16 @@ tor_gmtime_r(const time_t *timep, struct tm *result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#if defined(USE_WIN32_THREADS) && 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** A generic lock structure for multithreaded builds. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-struct tor_mutex_t { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  HANDLE handle; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_mutex_t * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_mutex_new(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_mutex_t *m; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  m = tor_malloc_zero(sizeof(tor_mutex_t)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  m->handle = CreateMutex(NULL, FALSE, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_assert(m->handle != NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return m; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_mutex_free(tor_mutex_t *m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  CloseHandle(m->handle); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_free(m); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_mutex_acquire(tor_mutex_t *m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  DWORD r; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  r = WaitForSingleObject(m->handle, INFINITE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  switch (r) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    case WAIT_ABANDONED: /* holding thread exited. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    case WAIT_OBJECT_0: /* we got the mutex normally. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    case WAIT_TIMEOUT: /* Should never happen. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tor_assert(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    case WAIT_FAILED: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      log_warn(LD_GENERAL, "Failed to acquire mutex: %d",(int) GetLastError()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#if defined(USE_WIN32_THREADS) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_mutex_release(tor_mutex_t *m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  BOOL r; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  r = ReleaseMutex(m->handle); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!r) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    log_warn(LD_GENERAL, "Failed to release mutex: %d", (int) GetLastError()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-unsigned long 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_get_thread_id(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+tor_mutex_init(tor_mutex_t *m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return (unsigned long)GetCurrentThreadId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#elif defined(USE_WIN32_THREADS) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** A generic lock structure for multithreaded builds. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-struct tor_mutex_t { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  CRITICAL_SECTION mutex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_mutex_t * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_mutex_new(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   InitializeCriticalSection(&m->mutex); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return m; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_mutex_free(tor_mutex_t *m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+tor_mutex_uninit(tor_mutex_t *m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   DeleteCriticalSection(&m->mutex); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_free(m); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 tor_mutex_acquire(tor_mutex_t *m) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1609,18 +1552,12 @@ tor_get_thread_id(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return (unsigned long)GetCurrentThreadId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #elif defined(USE_PTHREADS) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** A generic lock structure for multithreaded builds. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-struct tor_mutex_t { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  pthread_mutex_t mutex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static pthread_mutexattr_t attr_reentrant; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static int threads_initialized = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** Allocate and return new lock. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_mutex_t * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_mutex_new(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+tor_mutex_init(tor_mutex_t *mutex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_mutex_t *mutex = tor_malloc_zero(sizeof(tor_mutex_t)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (PREDICT_UNLIKELY(!threads_initialized)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tor_threads_init(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   err = pthread_mutex_init(&mutex->mutex, &attr_reentrant); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1628,7 +1565,6 @@ tor_mutex_new(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     log_err(LD_GENERAL, "Error %d creating a mutex.", err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tor_fragile_assert(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return mutex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** Wait until <b>m</b> is free, then acquire it. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1654,9 +1590,8 @@ tor_mutex_release(tor_mutex_t *m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tor_fragile_assert(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** Free all storage held by the lock <b>m</b>. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tor_mutex_free(tor_mutex_t *m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+tor_mutex_uninit(tor_mutex_t *m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tor_assert(m); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1665,7 +1600,6 @@ tor_mutex_free(tor_mutex_t *m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     log_err(LD_GENERAL, "Error %d destroying a mutex.", err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tor_fragile_assert(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_free(m); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** Return an integer representing this thread. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 unsigned long 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1678,11 +1612,22 @@ tor_get_thread_id(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   r.thr = pthread_self(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return r.id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** A generic lock structure for multithreaded builds. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-struct tor_mutex_t { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  int _unused; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef TOR_IS_MULTITHREADED 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+tor_mutex_t * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+tor_mutex_new(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tor_mutex_init(m); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return m; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+tor_mutex_free(tor_mutex_t *m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tor_mutex_uninit(m); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tor_free(m); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* Conditions. */ 
			 |