atomic_ops.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * $Id$
  3. *
  4. * Copyright (C) 2006 iptelorg GmbH
  5. *
  6. * Permission to use, copy, modify, and distribute this software for any
  7. * purpose with or without fee is hereby granted, provided that the above
  8. * copyright notice and this permission notice appear in all copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  11. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  12. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  13. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  14. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  15. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  16. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. /*
  19. * atomic operations init
  20. */
  21. /*
  22. * History:
  23. * --------
  24. * 2006-03-08 created by andrei
  25. * 2007-05-11 added lock_set support (andrei)
  26. */
  27. /*!
  28. * \file
  29. * \brief SIP-router core ::
  30. * \ingroup core
  31. * Module: \ref core
  32. */
  33. #include "atomic_ops_init.h"
  34. #include "atomic_ops.h"
  35. #if defined ATOMIC_OPS_USE_LOCK || defined ATOMIC_OPS_USE_LOCK_SET || \
  36. defined MEMBAR_USES_LOCK
  37. #include "locking.h"
  38. #endif
  39. #ifdef MEMBAR_USES_LOCK
  40. gen_lock_t* __membar_lock=0; /* init in atomic_ops.c */
  41. #endif
  42. #ifdef ATOMIC_OPS_USE_LOCK_SET
  43. gen_lock_set_t* _atomic_lock_set=0;
  44. #elif defined ATOMIC_OPS_USE_LOCK
  45. gen_lock_t* _atomic_lock=0;
  46. #endif
  47. /* returns 0 on success, -1 on error */
  48. int init_atomic_ops()
  49. {
  50. #ifdef MEMBAR_USES_LOCK
  51. if ((__membar_lock=lock_alloc())==0){
  52. goto error;
  53. }
  54. if (lock_init(__membar_lock)==0){
  55. lock_dealloc(__membar_lock);
  56. __membar_lock=0;
  57. goto error;
  58. }
  59. _membar_lock; /* start with the lock "taken" so that we can safely use
  60. unlock/lock sequences on it later */
  61. #endif
  62. #ifdef ATOMIC_OPS_USE_LOCK_SET
  63. if ((_atomic_lock_set=lock_set_alloc(_ATOMIC_LS_SIZE))==0){
  64. goto error;
  65. }
  66. if (lock_set_init(_atomic_lock_set)==0){
  67. lock_set_dealloc(_atomic_lock_set);
  68. _atomic_lock_set=0;
  69. goto error;
  70. }
  71. #elif defined ATOMIC_OPS_USE_LOCK
  72. if ((_atomic_lock=lock_alloc())==0){
  73. goto error;
  74. }
  75. if (lock_init(_atomic_lock)==0){
  76. lock_dealloc(_atomic_lock);
  77. _atomic_lock=0;
  78. goto error;
  79. }
  80. #endif /* ATOMIC_OPS_USE_LOCK_SET/ATOMIC_OPS_USE_LOCK */
  81. return 0;
  82. #if defined MEMBAR_USES_LOCK || defined ATOMIC_OPS_USE_LOCK || \
  83. defined ATOMIC_OPS_USE_LOCK_SET
  84. error:
  85. destroy_atomic_ops();
  86. return -1;
  87. #endif
  88. }
  89. void destroy_atomic_ops()
  90. {
  91. #ifdef MEMBAR_USES_LOCK
  92. if (__membar_lock!=0){
  93. lock_destroy(__membar_lock);
  94. lock_dealloc(__membar_lock);
  95. __membar_lock=0;
  96. }
  97. #endif
  98. #ifdef ATOMIC_OPS_USE_LOCK_SET
  99. if (_atomic_lock_set!=0){
  100. lock_set_destroy(_atomic_lock_set);
  101. lock_set_dealloc(_atomic_lock_set);
  102. _atomic_lock_set=0;
  103. }
  104. #elif defined ATOMIC_OPS_USE_LOCK
  105. if (_atomic_lock!=0){
  106. lock_destroy(_atomic_lock);
  107. lock_dealloc(_atomic_lock);
  108. _atomic_lock=0;
  109. }
  110. #endif /* ATOMIC_OPS_USE_LOCK_SET / ATOMIC_OPS_USE_LOCK*/
  111. }