home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / asm-generic / futex.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  1.2 KB  |  57 lines

  1. #ifndef _ASM_GENERIC_FUTEX_H
  2. #define _ASM_GENERIC_FUTEX_H
  3.  
  4. #include <linux/futex.h>
  5. #include <linux/uaccess.h>
  6. #include <asm/errno.h>
  7.  
  8. static inline int
  9. futex_atomic_op_inuser (int encoded_op, int __user *uaddr)
  10. {
  11.     int op = (encoded_op >> 28) & 7;
  12.     int cmp = (encoded_op >> 24) & 15;
  13.     int oparg = (encoded_op << 8) >> 20;
  14.     int cmparg = (encoded_op << 20) >> 20;
  15.     int oldval = 0, ret;
  16.     if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
  17.         oparg = 1 << oparg;
  18.  
  19.     if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int)))
  20.         return -EFAULT;
  21.  
  22.     pagefault_disable();
  23.  
  24.     switch (op) {
  25.     case FUTEX_OP_SET:
  26.     case FUTEX_OP_ADD:
  27.     case FUTEX_OP_OR:
  28.     case FUTEX_OP_ANDN:
  29.     case FUTEX_OP_XOR:
  30.     default:
  31.         ret = -ENOSYS;
  32.     }
  33.  
  34.     pagefault_enable();
  35.  
  36.     if (!ret) {
  37.         switch (cmp) {
  38.         case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break;
  39.         case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break;
  40.         case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break;
  41.         case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break;
  42.         case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break;
  43.         case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break;
  44.         default: ret = -ENOSYS;
  45.         }
  46.     }
  47.     return ret;
  48. }
  49.  
  50. static inline int
  51. futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
  52. {
  53.     return -ENOSYS;
  54. }
  55.  
  56. #endif
  57.