smpprim.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*  $Id: smpprim.h,v 1.5 1996/08/29 09:48:49 davem Exp $
  2.  *  smpprim.h:  SMP locking primitives on the Sparc
  3.  *
  4.  *  God knows we won't be actually using this code for some time
  5.  *  but I thought I'd write it since I knew how.
  6.  *
  7.  *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  8.  */
  9. #ifndef __SPARC_SMPPRIM_H
  10. #define __SPARC_SMPPRIM_H
  11. /* Test and set the unsigned byte at ADDR to 1.  Returns the previous
  12.  * value.  On the Sparc we use the ldstub instruction since it is
  13.  * atomic.
  14.  */
  15. extern __inline__ __volatile__ char test_and_set(void *addr)
  16. {
  17. char state = 0;
  18. __asm__ __volatile__("ldstub [%0], %1         ! test_and_setnt"
  19.      "=r" (addr), "=r" (state) :
  20.      "0" (addr), "1" (state) : "memory");
  21. return state;
  22. }
  23. /* Initialize a spin-lock. */
  24. extern __inline__ __volatile__ smp_initlock(void *spinlock)
  25. {
  26. /* Unset the lock. */
  27. *((unsigned char *) spinlock) = 0;
  28. return;
  29. }
  30. /* This routine spins until it acquires the lock at ADDR. */
  31. extern __inline__ __volatile__ smp_lock(void *addr)
  32. {
  33. while(test_and_set(addr) == 0xff)
  34. ;
  35. /* We now have the lock */
  36. return;
  37. }
  38. /* This routine releases the lock at ADDR. */
  39. extern __inline__ __volatile__ smp_unlock(void *addr)
  40. {
  41. *((unsigned char *) addr) = 0;
  42. }
  43. #endif /* !(__SPARC_SMPPRIM_H) */