thread_data.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2012 Red Hat, Inc.
  3. * All rights reserved.
  4. *
  5. * License: GPL (version 3 or any later version).
  6. * See LICENSE for details.
  7. * END COPYRIGHT BLOCK **/
  8. /*
  9. * Thread Local Storage Functions
  10. */
  11. #include <slapi-plugin.h>
  12. #include <prthread.h>
  13. void td_dn_destructor(void *priv);
  14. /*
  15. * Thread Local Storage Indexes
  16. */
  17. static PRUintn td_requestor_dn; /* TD_REQUESTOR_DN */
  18. static PRUintn td_plugin_list; /* SLAPI_TD_PLUGIN_LIST_LOCK - integer set to 1 or zero */
  19. /*
  20. * Index types defined in slapi-plugin.h
  21. *
  22. * #define SLAPI_TD_REQUESTOR_DN 1
  23. * ...
  24. * ...
  25. */
  26. /*
  27. * The Process:
  28. *
  29. * [1] Create new index type macro in slapi-plugin.h
  30. * [2] Create new static "PRUintn" index
  31. * [3] Update these functions with the new index:
  32. * slapi_td_init()
  33. * slapi_td_set_val()
  34. * slapi_td_get_val()
  35. * [4] Create wrapper functions if so desired, and update slapi_plugin.h
  36. * [5] Create destructor (if necessary)
  37. */
  38. int
  39. slapi_td_init(int indexType)
  40. {
  41. switch(indexType){
  42. case SLAPI_TD_REQUESTOR_DN:
  43. if(PR_NewThreadPrivateIndex(&td_requestor_dn, td_dn_destructor) == PR_FAILURE){
  44. return PR_FAILURE;
  45. }
  46. break;
  47. case SLAPI_TD_PLUGIN_LIST_LOCK:
  48. if(PR_NewThreadPrivateIndex(&td_plugin_list, NULL) == PR_FAILURE){
  49. return PR_FAILURE;
  50. }
  51. break;
  52. default:
  53. return PR_FAILURE;
  54. }
  55. return PR_SUCCESS;
  56. }
  57. /*
  58. * Caller needs to cast value to (void *)
  59. */
  60. int
  61. slapi_td_set_val(int indexType, void *value)
  62. {
  63. switch(indexType){
  64. case SLAPI_TD_REQUESTOR_DN:
  65. if(td_requestor_dn){
  66. if(PR_SetThreadPrivate(td_requestor_dn, value) == PR_FAILURE){
  67. return PR_FAILURE;
  68. }
  69. } else {
  70. return PR_FAILURE;
  71. }
  72. break;
  73. case SLAPI_TD_PLUGIN_LIST_LOCK:
  74. if(td_plugin_list){
  75. if(PR_SetThreadPrivate(td_plugin_list, value) == PR_FAILURE){
  76. return PR_FAILURE;
  77. }
  78. } else {
  79. return PR_FAILURE;
  80. }
  81. break;
  82. default:
  83. return PR_FAILURE;
  84. }
  85. return PR_SUCCESS;
  86. }
  87. /*
  88. * Caller needs to cast value to (void **)
  89. */
  90. void
  91. slapi_td_get_val(int indexType, void **value)
  92. {
  93. switch(indexType){
  94. case SLAPI_TD_REQUESTOR_DN:
  95. if(td_requestor_dn){
  96. *value = PR_GetThreadPrivate(td_requestor_dn);
  97. } else {
  98. *value = NULL;
  99. }
  100. break;
  101. case SLAPI_TD_PLUGIN_LIST_LOCK:
  102. if(td_plugin_list){
  103. *value = PR_GetThreadPrivate(td_plugin_list);
  104. } else {
  105. *value = 0;
  106. }
  107. break;
  108. default:
  109. *value = NULL;
  110. return;
  111. }
  112. }
  113. /*
  114. * Wrapper Functions
  115. */
  116. /* plugin list locking */
  117. int
  118. slapi_td_plugin_lock_init()
  119. {
  120. if(slapi_td_init(SLAPI_TD_PLUGIN_LIST_LOCK) == PR_FAILURE){
  121. return PR_FAILURE;
  122. }
  123. return PR_SUCCESS;
  124. }
  125. int
  126. slapi_td_set_plugin_locked()
  127. {
  128. int val = 12345;
  129. if(slapi_td_set_val(SLAPI_TD_PLUGIN_LIST_LOCK, (void *)&val) == PR_FAILURE){
  130. return PR_FAILURE;
  131. }
  132. return PR_SUCCESS;
  133. }
  134. int
  135. slapi_td_set_plugin_unlocked()
  136. {
  137. if(slapi_td_set_val(SLAPI_TD_PLUGIN_LIST_LOCK, NULL) == PR_FAILURE){
  138. return PR_FAILURE;
  139. }
  140. return PR_SUCCESS;
  141. }
  142. int
  143. slapi_td_get_plugin_locked()
  144. {
  145. int *value = 0;
  146. slapi_td_get_val(SLAPI_TD_PLUGIN_LIST_LOCK, (void **)&value);
  147. if(value){
  148. return 1;
  149. } else{
  150. return 0;
  151. }
  152. }
  153. /* requestor dn */
  154. int
  155. slapi_td_dn_init()
  156. {
  157. if(slapi_td_init(SLAPI_TD_REQUESTOR_DN) == PR_FAILURE){
  158. return PR_FAILURE;
  159. }
  160. return PR_SUCCESS;
  161. }
  162. int
  163. slapi_td_set_dn(char *value)
  164. {
  165. if(slapi_td_set_val(SLAPI_TD_REQUESTOR_DN, (void *)value) == PR_FAILURE){
  166. return PR_FAILURE;
  167. }
  168. return PR_SUCCESS;
  169. }
  170. void
  171. slapi_td_get_dn(char **value)
  172. {
  173. slapi_td_get_val(SLAPI_TD_REQUESTOR_DN, (void **)value);
  174. }
  175. /*
  176. * Destructor Functions
  177. */
  178. void
  179. td_dn_destructor(void *priv)
  180. {
  181. slapi_ch_free((void **)&priv);
  182. }