Ticket #224: spinlock_debug.diff
| File spinlock_debug.diff, 2.2 kB (added by growler, 1 year ago) |
|---|
-
eaccelerator-0.9.5.1/x86_spinlocks.h
old new 32 32 33 33 #define spinlock_init(rw) do { (rw)->lock = 0x00000001; (rw)->pid=-1; (rw)->locked=0;} while(0) 34 34 35 #define spinlock_try_lock(rw) asm volatile("lock ; decl %0" :"=m" ((rw)->lock) : : "memory") 36 #define _spinlock_unlock(rw) asm volatile("lock ; incl %0" :"=m" ((rw)->lock) : : "memory") 35 #define _spinlock_atomic_decrement(rw) asm volatile("lock ; decl %0" :"=m" ((rw)->lock) : : "memory") 36 #define _spinlock_atomic_increment(rw) asm volatile("lock ; incl %0" :"=m" ((rw)->lock) : : "memory") 37 38 #define MAXSPINS 1000 39 #define MAXYIELDS 10000 37 40 38 41 static inline void yield() 39 42 { 40 struct timeval t; 41 42 t.tv_sec = 0; 43 t.tv_usec = 100; 44 select(0, NULL, NULL, NULL, &t); 43 #ifdef ZEND_WIN32 44 // Windows yields on a sleep(0) 45 sleep(0); 46 #else 47 // POSIX flavoured yielding 48 sched_yield(); 49 #endif 45 50 } 46 51 47 52 static inline void spinlock_unlock(spinlock_t* rw) { 48 53 if (rw->locked && (rw->pid == getpid())) { 49 54 rw->pid = 0; 50 55 rw->locked = 0; 51 _spinlock_ unlock(rw);56 _spinlock_atomic_increment(rw); 52 57 } 53 58 } 54 59 55 60 static inline void spinlock_lock(spinlock_t* rw) 56 61 { 62 int spins = MAXSPINS; 63 int yields = MAXYIELDS; 64 65 if (rw->locked && (rw->pid == getpid())) { 66 fprintf(stderr, "eA: ERROR I'm attempting to take a lock I already have. My pid %d\r\n", getpid()); 67 return; 68 } 69 57 70 while (1) { 58 spinlock_try_lock(rw);71 _spinlock_atomic_decrement(rw); 59 72 if (rw->lock == 0) { 73 if (rw->locked == 1) 74 fprintf(stderr, "eA: ERROR lock in inconsistant state. I've just taken it, but it's already marked as locked. I am %d, lock was held by %d\r\n", getpid(), rw->pid); 60 75 rw->pid = getpid(); 61 76 rw->locked = 1; 62 77 return; 63 78 } 64 _spinlock_unlock(rw); 65 yield(); 79 _spinlock_atomic_increment(rw); 80 81 --spins; 82 if (spins == 0) { 83 spins = MAXSPINS; 84 yields--; 85 if (yields == 0) { 86 yields = MAXYIELDS; 87 fprintf(stderr, "eA: WARNING I've been spinning for a while trying to get a lock. My pid %d, lock held by %d\r\n", getpid(), rw->pid); 88 fflush(stderr); 89 } 90 yield(); 91 } 66 92 } 67 93 } 68 94