summaryrefslogtreecommitdiffstats
path: root/kdecore/malloc/x86.h
diff options
context:
space:
mode:
Diffstat (limited to 'kdecore/malloc/x86.h')
-rw-r--r--kdecore/malloc/x86.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/kdecore/malloc/x86.h b/kdecore/malloc/x86.h
new file mode 100644
index 000000000..b21517374
--- /dev/null
+++ b/kdecore/malloc/x86.h
@@ -0,0 +1,41 @@
+#include <sched.h>
+#include <time.h>
+
+typedef struct {
+ volatile unsigned int lock;
+ int pad0_;
+} mutex_t;
+
+#define MUTEX_INITIALIZER { 0, 0 }
+
+static __inline__ int lock(mutex_t *m) {
+ int cnt = 0, r;
+ struct timespec tm;
+
+ for(;;) {
+ __asm__ __volatile__
+ ("xchgl %0, %1"
+ : "=r"(r), "=m"(m->lock)
+ : "0"(1), "m"(m->lock)
+ : "memory");
+ if(!r)
+ return 0;
+#ifdef _POSIX_PRIORITY_SCHEDULING
+ if(cnt < 50) {
+ sched_yield();
+ cnt++;
+ } else
+#endif
+ {
+ tm.tv_sec = 0;
+ tm.tv_nsec = 2000001;
+ nanosleep(&tm, NULL);
+ cnt = 0;
+ }
+ }
+}
+
+static __inline__ int unlock(mutex_t *m) {
+ __asm __volatile ("movl $0,%0" : "=m" (m->lock));
+ return 0;
+}