nssrwlk.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. /*
  5. ** File: nsrwlock.h
  6. ** Description: API to basic reader-writer lock functions of NSS.
  7. ** These are re-entrant reader writer locks; that is,
  8. ** If I hold the write lock, I can ask for it and get it again.
  9. ** If I hold the write lock, I can also ask for and get a read lock.
  10. ** I can then release the locks in any order (read or write).
  11. ** I must release each lock type as many times as I acquired it.
  12. ** Otherwise, these are normal reader/writer locks.
  13. **
  14. ** For deadlock detection, locks should be ranked, and no lock may be aquired
  15. ** while I hold a lock of higher rank number.
  16. ** If you don't want that feature, always use NSS_RWLOCK_RANK_NONE.
  17. ** Lock name is for debugging, and is optional (may be NULL)
  18. **/
  19. #ifndef nssrwlk_h___
  20. #define nssrwlk_h___
  21. #include "utilrename.h"
  22. #include "prtypes.h"
  23. #include "nssrwlkt.h"
  24. #define NSS_RWLOCK_RANK_NONE 0
  25. /* SEC_BEGIN_PROTOS */
  26. PR_BEGIN_EXTERN_C
  27. /***********************************************************************
  28. ** FUNCTION: NSSRWLock_New
  29. ** DESCRIPTION:
  30. ** Returns a pointer to a newly created reader-writer lock object.
  31. ** INPUTS: Lock rank
  32. ** Lock name
  33. ** OUTPUTS: void
  34. ** RETURN: NSSRWLock*
  35. ** If the lock cannot be created because of resource constraints, NULL
  36. ** is returned.
  37. **
  38. ***********************************************************************/
  39. extern NSSRWLock *NSSRWLock_New(PRUint32 lock_rank, const char *lock_name);
  40. /***********************************************************************
  41. ** FUNCTION: NSSRWLock_AtomicCreate
  42. ** DESCRIPTION:
  43. ** Given the address of a NULL pointer to a NSSRWLock,
  44. ** atomically initializes that pointer to a newly created NSSRWLock.
  45. ** Returns the value placed into that pointer, or NULL.
  46. **
  47. ** INPUTS: address of NSRWLock pointer
  48. ** Lock rank
  49. ** Lock name
  50. ** OUTPUTS: NSSRWLock*
  51. ** RETURN: NSSRWLock*
  52. ** If the lock cannot be created because of resource constraints,
  53. ** the pointer will be left NULL.
  54. **
  55. ***********************************************************************/
  56. extern NSSRWLock *
  57. nssRWLock_AtomicCreate(NSSRWLock **prwlock,
  58. PRUint32 lock_rank,
  59. const char *lock_name);
  60. /***********************************************************************
  61. ** FUNCTION: NSSRWLock_Destroy
  62. ** DESCRIPTION:
  63. ** Destroys a given RW lock object.
  64. ** INPUTS: NSSRWLock *lock - Lock to be freed.
  65. ** OUTPUTS: void
  66. ** RETURN: None
  67. ***********************************************************************/
  68. extern void NSSRWLock_Destroy(NSSRWLock *lock);
  69. /***********************************************************************
  70. ** FUNCTION: NSSRWLock_LockRead
  71. ** DESCRIPTION:
  72. ** Apply a read lock (non-exclusive) on a RWLock
  73. ** INPUTS: NSSRWLock *lock - Lock to be read-locked.
  74. ** OUTPUTS: void
  75. ** RETURN: None
  76. ***********************************************************************/
  77. extern void NSSRWLock_LockRead(NSSRWLock *lock);
  78. /***********************************************************************
  79. ** FUNCTION: NSSRWLock_LockWrite
  80. ** DESCRIPTION:
  81. ** Apply a write lock (exclusive) on a RWLock
  82. ** INPUTS: NSSRWLock *lock - Lock to write-locked.
  83. ** OUTPUTS: void
  84. ** RETURN: None
  85. ***********************************************************************/
  86. extern void NSSRWLock_LockWrite(NSSRWLock *lock);
  87. /***********************************************************************
  88. ** FUNCTION: NSSRWLock_UnlockRead
  89. ** DESCRIPTION:
  90. ** Release a Read lock. Unlocking an unlocked lock has undefined results.
  91. ** INPUTS: NSSRWLock *lock - Lock to unlocked.
  92. ** OUTPUTS: void
  93. ** RETURN: void
  94. ***********************************************************************/
  95. extern void NSSRWLock_UnlockRead(NSSRWLock *lock);
  96. /***********************************************************************
  97. ** FUNCTION: NSSRWLock_UnlockWrite
  98. ** DESCRIPTION:
  99. ** Release a Write lock. Unlocking an unlocked lock has undefined results.
  100. ** INPUTS: NSSRWLock *lock - Lock to unlocked.
  101. ** OUTPUTS: void
  102. ** RETURN: void
  103. ***********************************************************************/
  104. extern void NSSRWLock_UnlockWrite(NSSRWLock *lock);
  105. /***********************************************************************
  106. ** FUNCTION: NSSRWLock_HaveWriteLock
  107. ** DESCRIPTION:
  108. ** Tells caller whether the current thread holds the write lock, or not.
  109. ** INPUTS: NSSRWLock *lock - Lock to test.
  110. ** OUTPUTS: void
  111. ** RETURN: PRBool PR_TRUE IFF the current thread holds the write lock.
  112. ***********************************************************************/
  113. extern PRBool NSSRWLock_HaveWriteLock(NSSRWLock *rwlock);
  114. /* SEC_END_PROTOS */
  115. PR_END_EXTERN_C
  116. #endif /* nsrwlock_h___ */