]> granicus.if.org Git - libevent/commitdiff
Add some more utility macros to evthread-internal.h
authorNick Mathewson <nickm@torproject.org>
Sun, 5 Apr 2009 02:43:55 +0000 (02:43 +0000)
committerNick Mathewson <nickm@torproject.org>
Sun, 5 Apr 2009 02:43:55 +0000 (02:43 +0000)
svn:r1132

evthread-internal.h

index b53558437037f2e4b258440ade0eec9be4e6b322..1b803b1d9b80b756b75b09cec42c3afc6f0ba744 100644 (file)
@@ -58,7 +58,47 @@ extern void (*_evthread_lock_free_fn)(void *);
        do {                                                    \
                if (lockvar && _evthread_lock_free_fn)          \
                        _evthread_lock_free_fn(lockvar);        \
-       } while (0);
+       } while (0)
+
+#define EVLOCK_LOCK(lock,mode)                                 \
+       do {                                                            \
+               if (lock)                                               \
+                       _evthread_locking_fn(EVTHREAD_LOCK|mode, lock); \
+       } while (0)
+#define EVLOCK_UNLOCK(lock,mode)                                       \
+       do {                                                            \
+               if (lock)                                               \
+                       _evthread_locking_fn(EVTHREAD_UNLOCK|mode, lock); \
+       } while (0)
+#define _EVLOCK_SORTLOCKS(lockvar1, lockvar2)                          \
+       do {                                                            \
+               if (lockvar1 && lockvar2 && lockvar1 > lockvar2) {      \
+                       void *tmp = lockvar1;                           \
+                       lockvar1 = lockvar2;                            \
+                       lockvar2 = tmp;                                 \
+               }                                                       \
+       } while (0)
+
+#define EVLOCK_LOCK2(lock1,lock2,mode1,mode2)                          \
+       do {                                                            \
+               void *_lock1_tmplock = (lock1);                         \
+               void *_lock2_tmplock = (lock2);                         \
+               _EVLOCK_SORTLOCKS(_lock1_tmplock,_lock2_tmplock);       \
+               EVLOCK_LOCK(_lock1_tmplock,mode1);                      \
+                if (_lock2_tmplock != _lock1_tmplock)                   \
+                        EVLOCK_LOCK(_lock2_tmplock,mode2);              \
+       } while (0)
+
+#define EVLOCK_UNLOCK2(lock1,lock2,mode1,mode2)                                \
+       do {                                                            \
+               void *_lock1_tmplock = (lock1);                         \
+               void *_lock2_tmplock = (lock2);                         \
+               _EVLOCK_SORTLOCKS(_lock1_tmplock,_lock2_tmplock);       \
+                if (_lock2_tmplock != _lock1_tmplock)                   \
+                        EVLOCK_UNLOCK(_lock2_tmplock,mode2);            \
+               EVLOCK_UNLOCK(_lock1_tmplock,mode1);                    \
+       } while (0)
+
 
 #define EVBASE_ACQUIRE_LOCK(base, mode, lock) do {                     \
                if (EVBASE_USING_LOCKS(base))                           \