/core/10.4/fusefs/fuse_locking.h

http://macfuse.googlecode.com/ · C++ Header · 82 lines · 57 code · 18 blank · 7 comment · 0 complexity · c06a7614d26d1cc66f43acd58a2f9e82 MD5 · raw file

  1. /*
  2. * Copyright (C) 2006 Google. All Rights Reserved.
  3. * Amit Singh <singh@>
  4. */
  5. #ifndef _FUSE_LOCKING_H_
  6. #define _FUSE_LOCKING_H_
  7. #include "fuse_node.h"
  8. #include <IOKit/IOLocks.h>
  9. enum fusefslocktype {
  10. FUSEFS_SHARED_LOCK = 1,
  11. FUSEFS_EXCLUSIVE_LOCK = 2,
  12. FUSEFS_FORCE_LOCK = 3
  13. };
  14. #define FUSEFS_SHARED_OWNER (void *)0xffffffff
  15. /* Locking */
  16. extern int fusefs_lock(fusenode_t, enum fusefslocktype);
  17. extern int fusefs_lockpair(fusenode_t, fusenode_t, enum fusefslocktype);
  18. extern int fusefs_lockfour(fusenode_t, fusenode_t, fusenode_t, fusenode_t,
  19. enum fusefslocktype);
  20. extern void fusefs_lock_truncate(fusenode_t, lck_rw_type_t);
  21. /* Unlocking */
  22. extern void fusefs_unlock(fusenode_t);
  23. extern void fusefs_unlockpair(fusenode_t, fusenode_t);
  24. extern void fusefs_unlockfour(fusenode_t, fusenode_t, fusenode_t, fusenode_t);
  25. extern void fusefs_unlock_truncate(fusenode_t);
  26. /* Wish the kernel exported lck_rw_done()... */
  27. extern void fusefs_lck_rw_done(lck_rw_t *);
  28. extern lck_attr_t *fuse_lock_attr;
  29. extern lck_grp_attr_t *fuse_group_attr;
  30. extern lck_grp_t *fuse_lock_group;
  31. extern lck_mtx_t *fuse_device_mutex;
  32. #ifdef FUSE_TRACE_LK
  33. #define fuse_lck_mtx_lock(m) \
  34. { \
  35. proc_t __FUNCTION__ ## p = current_proc(); \
  36. IOLog("0: lck_mtx_lock(%p): %s@%d by %d\n", (m), __FUNCTION__, \
  37. __LINE__, (__FUNCTION__ ## p) ? proc_pid(__FUNCTION__ ## p) : 0); \
  38. lck_mtx_lock((m)); \
  39. IOLog("1: lck_mtx_lock(%p): %s@%d by %d\n", (m), __FUNCTION__, \
  40. __LINE__, (__FUNCTION__ ## p) ? proc_pid(__FUNCTION__ ## p) : 0); \
  41. }
  42. #define fuse_lck_mtx_unlock(m) \
  43. { \
  44. proc_t __FUNCTION__ ## p = current_proc(); \
  45. IOLog("1: lck_mtx_unlock(%p): %s@%d by %d\n", (m), __FUNCTION__, \
  46. __LINE__, (__FUNCTION__ ## p) ? proc_pid(__FUNCTION__ ## p) : 0); \
  47. lck_mtx_unlock((m)); \
  48. IOLog("0: lck_mtx_unlock(%p): %s@%d by %d\n", (m), __FUNCTION__, \
  49. __LINE__, (__FUNCTION__ ## p) ? proc_pid(__FUNCTION__ ## p) : 0); \
  50. }
  51. #define fuse_lck_rw_lock_shared(l) lck_rw_lock_shared((l))
  52. #define fuse_lck_rw_lock_exclusive(l) lck_rw_lock_exclusive((l))
  53. #define fuse_lck_rw_unlock_shared(l) lck_rw_unlock_shared((l))
  54. #define fuse_lck_rw_unlock_exclusive(l) lck_rw_unlock_exclusive((l))
  55. #else /* !FUSE_TRACE_LK */
  56. #define fuse_lck_mtx_lock(m) lck_mtx_lock((m))
  57. #define fuse_lck_mtx_unlock(m) lck_mtx_unlock((m))
  58. #define fuse_lck_rw_lock_shared(l) lck_rw_lock_shared((l))
  59. #define fuse_lck_rw_lock_exclusive(l) lck_rw_lock_exclusive((l))
  60. #define fuse_lck_rw_unlock_shared(l) lck_rw_unlock_shared((l))
  61. #define fuse_lck_rw_unlock_exclusive(l) lck_rw_unlock_exclusive((l))
  62. #define fuse_lck_mtx_try_lock(l) IOLockTryLock((IOLock *)l)
  63. #endif /* FUSE_TRACE_LK */
  64. #endif /* _FUSE_LOCKING_H_ */