00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __loaded__lock_h__
00021 #define __loaded__lock_h__
00022 using namespace std;
00023 #line 1 "lock.h++"
00024 #include <string>
00025 #include <pthread.h>
00026 #include <stdlib.h>
00027 #include <assert.h>
00028 #include <vector>
00029 #include <queue>
00030 #include <time.h>
00031 #include "cmpxchg.h"
00032 using namespace std;
00033
00046 class Lock
00047 {
00048 public:
00052 volatile void * locked;
00053 string who;
00054 bool deleted;
00055 Lock() : locked(NULL)
00056 {
00057 deleted=false;
00058 };
00059
00063 bool try_lock(string w);
00073 void wait_lock(string w);
00077 void unlock();
00078 virtual ~Lock()
00079 {
00080 deleted=true;
00081 }
00082 };
00083
00093 class AutoLock
00094 {
00095 Lock& lock;
00096 public:
00100 AutoLock(Lock&lock, string l): lock(lock)
00101 {
00102 lock.wait_lock(l);
00103 }
00107 AutoLock(Lock*lock, string l): lock(*lock)
00108 {
00109 lock->wait_lock(l);
00110 };
00114 ~AutoLock()
00115 {
00116 lock.unlock();
00117 }
00118 };
00119
00120 #define DamnPreprocessor(a) #a
00121 #define Synchronized_(a,b,c) AutoLock tmp_auto_locker(a,#a "_at_" b DamnPreprocessor(c))
00122 #define Synchronized(a) Synchronized_(a,__FILE__, __LINE__)
00123
00124 #endif // __loaded__lock_h__