rx-rw-locking-20081024
[openafs.git] / src / rx / rx_internal.h
1 /*
2  * Copyright (c) 2008, Your File System, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without 
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice, 
9  *    this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright 
11  *    notice, this list of conditions and the following disclaimer in the 
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the company nor the names of its contributors may 
14  *    be used to endorse or promote products derived from this software 
15  * without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
18  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
19  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
20  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #ifndef _RX_INTERNAL_H_
31 #define _RX_INTERNAL_H_
32
33 #ifdef AFS_NT40_ENV
34 #ifndef _WIN64
35 #ifndef __cplusplus
36 #include <intrin.h>
37 #pragma intrinsic(_InterlockedOr)
38 #pragma intrinsic(_InterlockedAnd)
39 #define rx_MutexOr(object, operand, mutex) _InterlockedOr(&object, operand)
40 #define rx_MutexAnd(object, operand, mutex) _InterlockedAnd(&object, operand)
41 #endif
42 #else
43 #define rx_MutexOr(object, operand, mutex) InterlockedOr(&object, operand)
44 #define rx_MutexAnd(object, operand, mutex) InterlockedAnd(&object, operand)
45 #endif
46 #define rx_MutexIncrement(object, mutex) InterlockedIncrement(&object)
47 #define rx_MutexXor(object, operand, mutex) InterlockedXor(&object, operand)
48 #define rx_MutexAdd(object, addend, mutex) InterlockedExchangeAdd(&object, addend)
49 #define rx_MutexDecrement(object, mutex) InterlockedDecrement(&object)
50 #define rx_MutexAdd1Increment2(object1, addend, object2, mutex) \
51     do { \
52         MUTEX_ENTER(&mutex); \
53         object1 += addend; \
54         InterlockedIncrement(&object2); \
55         MUTEX_EXIT(&mutex); \
56     } while (0)
57 #define rx_MutexAdd1Decrement2(object1, addend, object2, mutex) \
58     do { \
59         MUTEX_ENTER(&mutex); \
60         object1 += addend; \
61         InterlockedDecrement(&object2); \
62         MUTEX_EXIT(&mutex); \
63     } while (0)
64 #else
65 #define rx_MutexIncrement(object, mutex) \
66     do { \
67         MUTEX_ENTER(&mutex); \
68         object++; \
69         MUTEX_EXIT(&mutex); \
70     } while(0)
71 #define rx_MutexOr(object, operand, mutex) \
72     do { \
73         MUTEX_ENTER(&mutex); \
74         object |= operand; \
75         MUTEX_EXIT(&mutex); \
76     } while(0)
77 #define rx_MutexAnd(object, operand, mutex) \
78     do { \
79         MUTEX_ENTER(&mutex); \
80         object &= operand; \
81         MUTEX_EXIT(&mutex); \
82     } while(0)
83 #define rx_MutexXor(object, operand, mutex) \
84     do { \
85         MUTEX_ENTER(&mutex); \
86         object ^= operand; \
87         MUTEX_EXIT(&mutex); \
88     } while(0)
89 #define rx_MutexAdd(object, addend, mutex) \
90     do { \
91         MUTEX_ENTER(&mutex); \
92         object += addend; \
93         MUTEX_EXIT(&mutex); \
94     } while(0)
95 #define rx_MutexAdd1Increment2(object1, addend, object2, mutex) \
96     do { \
97         MUTEX_ENTER(&mutex); \
98         object1 += addend; \
99         object2++; \
100         MUTEX_EXIT(&mutex); \
101     } while(0)
102 #define rx_MutexAdd1Decrement2(object1, addend, object2, mutex) \
103     do { \
104         MUTEX_ENTER(&mutex); \
105         object1 += addend; \
106         object2--; \
107         MUTEX_EXIT(&mutex); \
108     } while(0)
109 #define rx_MutexDecrement(object, mutex) \
110     do { \
111         MUTEX_ENTER(&mutex); \
112         object--; \
113         MUTEX_EXIT(&mutex); \
114     } while(0)
115 #endif 
116
117 #endif /* _RX_INTERNAL_H */