diff options
| author | Graydon Hoare <graydon@mozilla.com> | 2010-06-23 21:03:09 -0700 |
|---|---|---|
| committer | Graydon Hoare <graydon@mozilla.com> | 2010-06-23 21:03:09 -0700 |
| commit | d6b7c96c3eb29b9244ece0c046d3f372ff432d04 (patch) | |
| tree | b425187e232966063ffc2f0d14c04a55d8f004ef /src/rt/sync/spin_lock.cpp | |
| parent | c01efc669f09508b55eced32d3c88702578a7c3e (diff) | |
| download | rust-d6b7c96c3eb29b9244ece0c046d3f372ff432d04.tar.gz rust-d6b7c96c3eb29b9244ece0c046d3f372ff432d04.zip | |
Populate tree.
Diffstat (limited to 'src/rt/sync/spin_lock.cpp')
| -rw-r--r-- | src/rt/sync/spin_lock.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/rt/sync/spin_lock.cpp b/src/rt/sync/spin_lock.cpp new file mode 100644 index 00000000000..11a5cb201af --- /dev/null +++ b/src/rt/sync/spin_lock.cpp @@ -0,0 +1,47 @@ +/* + * Your average spin lock. + */ + +#include "globals.h" + +// #define TRACE + +spin_lock::spin_lock() { + unlock(); +} + +spin_lock::~spin_lock() { +} + +static inline unsigned xchg32(void *ptr, unsigned x) { + __asm__ __volatile__("xchgl %0,%1" + :"=r" ((unsigned) x) + :"m" (*(volatile unsigned *)ptr), "0" (x) + :"memory"); + return x; +} + +void spin_lock::lock() { + while (true) { + if (!xchg32(&ticket, 1)) { + return; + } + while (ticket) { + pause(); + } + } +#ifdef TRACE + printf(" lock: %d", ticket); +#endif +} + +void spin_lock::unlock() { + ticket = 0; +#ifdef TRACE + printf("unlock:"); +#endif +} + +void spin_lock::pause() { + asm volatile("pause\n" : : : "memory"); +} |
