C++DB is the database layer that was designed to work with C++CMS. This customized version is used within Ye Ol' Pi Shack.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

166 lines
3.9 KiB

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (C) 2010-2011 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com>
  4. //
  5. // Distributed under:
  6. //
  7. // the Boost Software License, Version 1.0.
  8. // (See accompanying file LICENSE_1_0.txt or copy at
  9. // http://www.boost.org/LICENSE_1_0.txt)
  10. //
  11. // or (at your opinion) under:
  12. //
  13. // The MIT License
  14. // (See accompanying file MIT.txt or a copy at
  15. // http://www.opensource.org/licenses/mit-license.php)
  16. //
  17. ///////////////////////////////////////////////////////////////////////////////
  18. #define CPPDB_SOURCE
  19. #include <cppdb/atomic_counter.h>
  20. #include <string.h>
  21. #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) || defined(__CYGWIN__)
  22. # include <windows.h>
  23. # define cppdb_atomic_set(p,v) ((p)->l=v)
  24. long static cppdb_atomic_add_and_fetch_impl(volatile long *v,long d)
  25. {
  26. long old,prev;
  27. do{
  28. old = *v;
  29. prev = InterlockedCompareExchange(v,old+d,old);
  30. }
  31. while(prev != old);
  32. return old+d;
  33. }
  34. # define cppdb_atomic_add_and_fetch(p,d) cppdb_atomic_add_and_fetch_impl(&(p)->l,d)
  35. #elif defined(CPPDB_HAVE_FREEBSD_ATOMIC)
  36. # include <sys/types.h>
  37. # include <machine/atomic.h>
  38. # define cppdb_atomic_set(p,v) ((p)->ui=v)
  39. # define cppdb_atomic_add_and_fetch(p,d) (atomic_fetchadd_int(&(p)->ui,d) + d)
  40. #elif defined(CPPDB_HAVE_SOLARIS_ATOMIC)
  41. # include <atomic.h>
  42. # define cppdb_atomic_set(p,v) ((p)->ui=v)
  43. # define cppdb_atomic_add_and_fetch(p,d) (atomic_add_int_nv(&(p)->ui,d))
  44. #elif defined(CPPDB_HAVE_MAC_OS_X_ATOMIC)
  45. # include <libkern/OSAtomic.h>
  46. # define cppdb_atomic_set(p,v) ((p)->i=v)
  47. # define cppdb_atomic_add_and_fetch(p,d) (OSAtomicAdd32(d,&(p)->i))
  48. #elif defined CPPDB_HAS_GCC_SYNC
  49. # define cppdb_atomic_set(p,v) ((p)->l=v)
  50. # define cppdb_atomic_add_and_fetch(p,d) ( __sync_add_and_fetch(&(p)->i,d) )
  51. # elif defined(CPPDB_HAVE_GCC_BITS_EXCHANGE_AND_ADD)
  52. # include <bits/atomicity.h>
  53. using __gnu_cxx::__exchange_and_add;
  54. # define cppdb_atomic_set(p,v) ((p)->i=v)
  55. # define cppdb_atomic_add_and_fetch(p,d) ( __exchange_and_add(&(p)->i,d)+d )
  56. #elif defined(CPPDB_HAVE_GCC_EXT_EXCHANGE_AND_ADD)
  57. # include <ext/atomicity.h>
  58. using __gnu_cxx::__exchange_and_add;
  59. # define cppdb_atomic_set(p,v) ((p)->i=v)
  60. # define cppdb_atomic_add_and_fetch(p,d) ( __exchange_and_add(&(p)->i,d)+d )
  61. #else // Failing back to pthreads
  62. # include <pthread.h>
  63. # define CPPDB_PTHREAD_ATOMIC
  64. #endif
  65. namespace cppdb {
  66. #if !defined(CPPDB_PTHREAD_ATOMIC)
  67. atomic_counter::atomic_counter(long value)
  68. {
  69. memset(&value_,0,sizeof(value_));
  70. mutex_ = 0;
  71. cppdb_atomic_set(&value_,value);
  72. }
  73. atomic_counter::~atomic_counter()
  74. {
  75. }
  76. long atomic_counter::inc()
  77. {
  78. return cppdb_atomic_add_and_fetch( &value_, 1 );
  79. }
  80. long atomic_counter::dec()
  81. {
  82. return cppdb_atomic_add_and_fetch( &value_, -1 );
  83. }
  84. long atomic_counter::get() const
  85. {
  86. return cppdb_atomic_add_and_fetch( &value_, 0 );
  87. }
  88. #else
  89. #define MUTEX (reinterpret_cast<pthread_mutex_t *>(mutex_))
  90. atomic_counter::atomic_counter(long value)
  91. {
  92. mutex_ = new pthread_mutex_t;
  93. pthread_mutex_init(MUTEX,0);
  94. value_.l=value;
  95. }
  96. atomic_counter::~atomic_counter()
  97. {
  98. pthread_mutex_destroy(MUTEX);
  99. delete MUTEX;
  100. mutex_ = 0;
  101. }
  102. long atomic_counter::inc()
  103. {
  104. pthread_mutex_lock(MUTEX);
  105. long result= ++value_.l;
  106. pthread_mutex_unlock(MUTEX);
  107. return result;
  108. }
  109. long atomic_counter::dec()
  110. {
  111. pthread_mutex_lock(MUTEX);
  112. long result= --value_.l;
  113. pthread_mutex_unlock(MUTEX);
  114. return result;
  115. }
  116. long atomic_counter::get() const
  117. {
  118. pthread_mutex_lock(MUTEX);
  119. long result= value_.l;
  120. pthread_mutex_unlock(MUTEX);
  121. return result;
  122. }
  123. #endif
  124. } // cppdb