gloox 1.0.27
atomicrefcount.cpp
1/*
2 Copyright (c) 2007-2023 by Jakob Schröter <js@camaya.net>
3 This file is part of the gloox library. http://camaya.net/gloox
4
5 This software is distributed under a license. The full license
6 agreement can be found in the file LICENSE in this distribution.
7 This software may not be copied, modified, sold or distributed
8 other than expressed in the named license agreement.
9
10 This software is distributed without any warranty.
11*/
12
13
14#include "atomicrefcount.h"
15
16#include "config.h"
17
18#if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
19# include <windows.h>
20#elif defined( __APPLE__ )
21# include <libkern/OSAtomic.h>
22#elif defined( HAVE_GCC_ATOMIC_BUILTINS )
23 // Use intrinsic functions - no #include required.
24#else
25# include "mutexguard.h"
26#endif
27
28#ifdef _WIN32_WCE
29# include <winbase.h>
30#endif
31
32namespace gloox
33{
34
35 namespace util
36 {
38 : m_count( 0 )
39 {
40 }
41
43 {
44#if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
45 return (int) ::InterlockedIncrement( (volatile LONG*)&m_count );
46#elif defined( __APPLE__ )
47 return (int) OSAtomicIncrement32Barrier( (volatile int32_t*)&m_count );
48#elif defined( HAVE_GCC_ATOMIC_BUILTINS )
49 // Use the gcc intrinsic for atomic increment if supported.
50 return static_cast<int>( __sync_add_and_fetch( &m_count, 1 ) );
51#else
52 // Fallback to using a lock
53 MutexGuard m( m_lock );
54 return ++m_count;
55#endif
56 }
57
59 {
60#if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
61 return (int) ::InterlockedDecrement( (volatile LONG*)&m_count );
62#elif defined( __APPLE__ )
63 return (int) OSAtomicDecrement32Barrier( (volatile int32_t*)&m_count );
64#elif defined( HAVE_GCC_ATOMIC_BUILTINS )
65 // Use the gcc intrinsic for atomic decrement if supported.
66 return static_cast<int>( __sync_sub_and_fetch( &m_count, 1 ) );
67#else
68 // Fallback to using a lock
69 MutexGuard m( m_lock );
70 return --m_count;
71#endif
72 }
73
75 {
76#if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
77 ::InterlockedExchange( (volatile LONG*)&m_count, (volatile LONG)0 );
78#elif defined( __APPLE__ )
79 OSAtomicAnd32Barrier( (uint32_t)0, (volatile uint32_t*)&m_count );
80#elif defined( HAVE_GCC_ATOMIC_BUILTINS )
81 // Use the gcc intrinsic for atomic decrement if supported.
82 __sync_fetch_and_and( &m_count, 0 );
83#else
84 // Fallback to using a lock
85 MutexGuard m( m_lock );
86 m_count = 0;
87#endif
88 }
89
90 }
91
92}
93
A simple implementation of a mutex guard.
Definition mutexguard.h:32
The namespace for the gloox library.
Definition adhoc.cpp:28