spinlock.C
上传用户:shtangtang
上传日期:2007-01-04
资源大小:167k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. //
  2. // struct spinlock
  3. //
  4. // this structure is a primitive semaphore.  It simple controls
  5. // the situation of a single integer... with an on/off value.
  6. #include <thread_spinlock.h>
  7. extern "C" {
  8. #       include <sched.h>
  9. };
  10. //
  11. // testandset
  12. //
  13. // test if the spinlock is clear, and set it in one atomic
  14. // instruction.  Ensuring it is owned by only one process.
  15. int spinlock::testandset()
  16. {
  17.   int ret;
  18.   __asm__ __volatile__("xchgl %0, %1"
  19.         : "=r"(ret), "=m"(s_spinlock)
  20.         : "0"(1), "m"(s_spinlock));
  21.   return ret;
  22. }
  23. //
  24. // acquire
  25. //
  26. // continue to try and set the spinlock, until successfull.  Yielding
  27. // to other processes in the scheduling while waiting.
  28. void spinlock::acquire()
  29. {
  30.   while (testandset()) 
  31.     __sched_yield();
  32. }
  33. //
  34. // release
  35. //
  36. // release the spinlock, by setting it to 0.
  37. void spinlock::release()
  38. {
  39. #ifndef RELEASE
  40.   s_spinlock = 0;
  41. #else
  42.   RELEASE(&s_spinlock);
  43. #endif
  44. }