]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/apr/include/apr_atomic.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / apr / include / apr_atomic.h
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  */
47 APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p);
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 */