Apache Portable Runtime
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
apr_atomic.h
Go to the documentation of this file.
1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2  * contributor license agreements. See the NOTICE file distributed with
3  * this work for additional information regarding copyright ownership.
4  * The ASF licenses this file to You under the Apache License, Version 2.0
5  * (the "License"); you may not use this file except in compliance with
6  * the License. You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef APR_ATOMIC_H
18 #define APR_ATOMIC_H
19 
20 /**
21  * @file apr_atomic.h
22  * @brief APR Atomic Operations
23  */
24 
25 #include "apr.h"
26 #include "apr_pools.h"
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 /**
33  * @defgroup apr_atomic Atomic Operations
34  * @ingroup APR
35  * @{
36  */
37 
38 /**
39  * this function is required on some platforms to initialize the
40  * atomic operation's internal structures
41  * @param p pool
42  * @return APR_SUCCESS on successful completion
43  * @remark Programs do NOT need to call this directly. APR will call this
44  * automatically from apr_initialize.
45  * @internal
46  */
48 
49 /*
50  * Atomic operations on 32-bit values
51  * Note: Each of these functions internally implements a memory barrier
52  * on platforms that require it
53  */
54 
55 /**
56  * atomically read an apr_uint32_t from memory
57  * @param mem the pointer
58  */
59 APR_DECLARE(apr_uint32_t) apr_atomic_read32(volatile apr_uint32_t *mem);
60 
61 /**
62  * atomically set an apr_uint32_t in memory
63  * @param mem pointer to the object
64  * @param val value that the object will assume
65  */
66 APR_DECLARE(void) apr_atomic_set32(volatile apr_uint32_t *mem, apr_uint32_t val);
67 
68 /**
69  * atomically add 'val' to an apr_uint32_t
70  * @param mem pointer to the object
71  * @param val amount to add
72  * @return old value pointed to by mem
73  */
74 APR_DECLARE(apr_uint32_t) apr_atomic_add32(volatile apr_uint32_t *mem, apr_uint32_t val);
75 
76 /**
77  * atomically subtract 'val' from an apr_uint32_t
78  * @param mem pointer to the object
79  * @param val amount to subtract
80  */
81 APR_DECLARE(void) apr_atomic_sub32(volatile apr_uint32_t *mem, apr_uint32_t val);
82 
83 /**
84  * atomically increment an apr_uint32_t by 1
85  * @param mem pointer to the object
86  * @return old value pointed to by mem
87  */
88 APR_DECLARE(apr_uint32_t) apr_atomic_inc32(volatile apr_uint32_t *mem);
89 
90 /**
91  * atomically decrement an apr_uint32_t by 1
92  * @param mem pointer to the atomic value
93  * @return zero if the value becomes zero on decrement, otherwise non-zero
94  */
95 APR_DECLARE(int) apr_atomic_dec32(volatile apr_uint32_t *mem);
96 
97 /**
98  * compare an apr_uint32_t's value with 'cmp'.
99  * If they are the same swap the value with 'with'
100  * @param mem pointer to the value
101  * @param with what to swap it with
102  * @param cmp the value to compare it to
103  * @return the old value of *mem
104  */
105 APR_DECLARE(apr_uint32_t) apr_atomic_cas32(volatile apr_uint32_t *mem, apr_uint32_t with,
106  apr_uint32_t cmp);
107 
108 /**
109  * exchange an apr_uint32_t's value with 'val'.
110  * @param mem pointer to the value
111  * @param val what to swap it with
112  * @return the old value of *mem
113  */
114 APR_DECLARE(apr_uint32_t) apr_atomic_xchg32(volatile apr_uint32_t *mem, apr_uint32_t val);
115 
116 /**
117  * compare the pointer's value with cmp.
118  * If they are the same swap the value with 'with'
119  * @param mem pointer to the pointer
120  * @param with what to swap it with
121  * @param cmp the value to compare it to
122  * @return the old value of the pointer
123  */
124 APR_DECLARE(void*) apr_atomic_casptr(volatile void **mem, void *with, const void *cmp);
125 
126 /**
127  * exchange a pair of pointer values
128  * @param mem pointer to the pointer
129  * @param with what to swap it with
130  * @return the old value of the pointer
131  */
132 APR_DECLARE(void*) apr_atomic_xchgptr(volatile void **mem, void *with);
133 
134 /** @} */
135 
136 #ifdef __cplusplus
137 }
138 #endif
139 
140 #endif /* !APR_ATOMIC_H */