[llvm-commits] CVS: llvm/lib/System/Mutex.cpp

Reid Spencer reid at x10sys.com
Tue Jul 12 08:37:55 PDT 2005



Changes in directory llvm/lib/System:

Mutex.cpp added (r1.1)
---
Log message:

For PR540: http://llvm.cs.uiuc.edu/PR540 :
Add a Mutex class for thread synchronization in a platform-independent way.
The current implementation only supports pthreads. Win32 use of Critical
Sections will be added later. The design permits other threading models to
be used if (and only if) pthreads is not available.


---
Diffs of the changes:  (+141 -0)

 Mutex.cpp |  141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 141 insertions(+)


Index: llvm/lib/System/Mutex.cpp
diff -c /dev/null llvm/lib/System/Mutex.cpp:1.1
*** /dev/null	Tue Jul 12 10:37:53 2005
--- llvm/lib/System/Mutex.cpp	Tue Jul 12 10:37:43 2005
***************
*** 0 ****
--- 1,141 ----
+ //===- Mutex.cpp - Mutual Exclusion Lock ------------------------*- C++ -*-===//
+ //
+ //                     The LLVM Compiler Infrastructure
+ //
+ // This file was developed by Reid Spencer and is distributed under the
+ // University of Illinois Open Source License. See LICENSE.TXT for details.
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This file implements the llvm::sys::Mutex class.
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ #include "llvm/System/Mutex.h"
+ #include "llvm/Config/config.h"
+ 
+ namespace llvm {
+ using namespace sys;
+ 
+ //===----------------------------------------------------------------------===//
+ //=== WARNING: Implementation here must contain only TRULY operating system
+ //===          independent code.
+ //===----------------------------------------------------------------------===//
+ 
+ #if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_MUTEX_LOCK)
+ #include <cassert>
+ #include <pthread.h>
+ #include <stdlib.h>
+ 
+ // This variable is useful for situations where the pthread library has been
+ // compiled with weak linkage for its interface symbols. This allows the 
+ // threading support to be turned off by simply not linking against -lpthread.
+ // In that situation, the value of pthread_mutex_init will be 0 and 
+ // consequently pthread_enabled will be false. In such situations, all the
+ // pthread operations become no-ops and the functions all return false. If
+ // pthread_mutex_init does have an address, then mutex support is enabled.
+ // Note: all LLVM tools will link against -lpthread if its available since it
+ //       is configured into the LIBS variable.
+ // Note: this line of code generates a warning if pthread_mutex_init is not
+ //       declared with weak linkage. Its safe to ignore the warning.
+ static const bool pthread_enabled = static_cast<bool>(pthread_mutex_init);
+ 
+ // Construct a Mutex using pthread calls
+ Mutex::Mutex( bool recursive)
+   : data_(0)
+ {
+   if (pthread_enabled)
+   {
+     // Declare the pthread_mutex data structures
+     pthread_mutex_t* mutex = 
+       static_cast<pthread_mutex_t*>(malloc(sizeof(pthread_mutex_t)));
+     pthread_mutexattr_t attr;
+ 
+     // Initialize the mutex attributes
+     int errorcode = pthread_mutexattr_init(&attr);
+     assert(errorcode == 0);
+ 
+     // Initialize the mutex as a recursive mutex, if requested, or normal
+     // otherwise.
+     int kind = ( recursive  ? PTHREAD_MUTEX_RECURSIVE : PTHREAD_MUTEX_NORMAL );
+     errorcode = pthread_mutexattr_settype(&attr, kind);
+     assert(errorcode == 0);
+ 
+     // Make it a process local mutex
+     errorcode = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_PRIVATE);
+ 
+     // Initialize the mutex
+     errorcode = pthread_mutex_init(mutex, &attr);
+     assert(errorcode == 0);
+ 
+     // Destroy the attributes
+     errorcode = pthread_mutexattr_destroy(&attr);
+     assert(errorcode == 0);
+ 
+     // Assign the data member
+     data_ = mutex;
+   }
+ }
+ 
+ // Destruct a Mutex
+ Mutex::~Mutex()
+ {
+   if (pthread_enabled)
+   {
+     pthread_mutex_t* mutex = reinterpret_cast<pthread_mutex_t*>(data_);
+     assert(mutex != 0);
+     int errorcode = pthread_mutex_destroy(mutex);
+     assert(mutex != 0);
+   }
+ }
+ 
+ bool 
+ Mutex::acquire()
+ {
+   if (pthread_enabled) 
+   {
+     pthread_mutex_t* mutex = reinterpret_cast<pthread_mutex_t*>(data_);
+     assert(mutex != 0);
+ 
+     int errorcode = pthread_mutex_lock(mutex);
+     return errorcode == 0;
+   }
+   return false;
+ }
+ 
+ bool 
+ Mutex::release()
+ {
+   if (pthread_enabled)
+   {
+     pthread_mutex_t* mutex = reinterpret_cast<pthread_mutex_t*>(data_);
+     assert(mutex != 0);
+ 
+     int errorcode = pthread_mutex_unlock(mutex);
+     return errorcode == 0;
+   }
+   return false;
+ }
+ 
+ bool 
+ Mutex::tryacquire()
+ {
+   if (pthread_enabled)
+   {
+     pthread_mutex_t* mutex = reinterpret_cast<pthread_mutex_t*>(data_);
+     assert(mutex != 0);
+ 
+     int errorcode = pthread_mutex_trylock(mutex);
+     return errorcode == 0;
+   }
+   return false;
+ }
+ 
+ }
+ #elif defined(LLVM_ON_UNIX)
+ #include "Unix/Mutex.inc"
+ #elif defined( LLVM_ON_WIN32)
+ #include "Win32/Mutex.inc"
+ #else
+ #warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in System/Mutex.cpp
+ #endif






More information about the llvm-commits mailing list