1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                 Glenn Fowler <gsf@research.att.com>                  *
18 *                  David Korn <dgk@research.att.com>                   *
19 *                   Phong Vo <kpv@research.att.com>                    *
20 *                                                                      *
21 ***********************************************************************/
22 #pragma prototyped
23 
24 #ifndef _ASO_H
25 #define _ASO_H	1
26 
27 #define ASO_VERSION	20111111L
28 
29 #include <ast_common.h>
30 
31 /*
32  * ast atomic scalar operations interface definitions
33  */
34 
35 /* asometh() types (ordered mutually exclusive flags) */
36 #define ASO_NEXT	(-1)
37 #define ASO_SIGNAL	1
38 #define ASO_THREAD	2
39 #define ASO_PROCESS	4
40 #define ASO_INTRINSIC	8
41 
42 /* asolock() operations */
43 #define ASO_UNLOCK	0	/* unlock if key matches  		*/
44 #define ASO_TRYLOCK	1	/* matched key means successful attempt	*/
45 #define ASO_LOCK	2	/* matched key first, then spin-lock	*/
46 #define ASO_SPINLOCK	3	/* no matching of key before locking	*/
47 
48 /* Asoerror_f types */
49 #define ASO_EMETHOD	0	/* method specific error		*/
50 #define ASO_EHUNG	1	/* asoloop() possibly hung		*/
51 
52 /* for internal use, but standardized for libs such as CDT and Vmalloc */
53 #define ASO_RELAX	((1<<2)-1) /* cycles between spin-loop yield */
54 #define ASOLOOP(k)	asoloop(++(k))
55 
56 #define ASODISC(d,e)	(memset(d,0,sizeof(*(d))),(d)->version=ASO_VERSION,(d)->errorf=(e))
57 
58 typedef int (*Asoerror_f)(int, const char*);
59 typedef void* (*Asoinit_f)(void*, const char*);
60 typedef ssize_t (*Asolock_f)(void*, ssize_t, void volatile*);
61 
62 typedef struct Asodisc_s
63 {
64 	uint32_t	version;
65 	unsigned int	hung;
66 	Asoerror_f	errorf;
67 } Asodisc_t;
68 
69 typedef struct Asometh_s
70 {
71 	const char*	name;
72 	int		type;
73 	Asoinit_f	initf;
74 	Asolock_f	lockf;
75 	const char*	details;
76 } Asometh_t;
77 
78 #if (_BLD_aso || _BLD_taso) && defined(__EXPORT__)
79 #define extern	extern __EXPORT__
80 #endif
81 #if !(_BLD_aso || _BLD_taso) && defined(__IMPORT__)
82 #define extern	extern __IMPORT__
83 #endif
84 
85 extern Asometh_t*		asometh(int, void*);
86 
87 #undef	extern
88 
89 #if _BLD_aso && defined(__EXPORT__)
90 #define extern	extern __EXPORT__
91 #endif
92 #if !_BLD_aso && defined(__IMPORT__)
93 #define extern	extern __IMPORT__
94 #endif
95 
96 extern Asometh_t*		_asometh(int, void*);
97 extern int			asoinit(const char*, Asometh_t*, Asodisc_t*);
98 extern int			asolock(unsigned int volatile*, unsigned int, int);
99 extern int			asoloop(uintmax_t);
100 extern int			asorelax(long);
101 
102 extern uint8_t			asocas8(uint8_t volatile*, int, int);
103 extern uint8_t			asoget8(uint8_t volatile*);
104 extern uint8_t			asoinc8(uint8_t volatile*);
105 extern uint8_t			asodec8(uint8_t volatile*);
106 
107 #define asocaschar(p,o,n)	asocas8(p,o,n)
108 #define asogetchar(p)		asoget8(p)
109 #define asoincchar(p)		asoinc8(p)
110 #define asodecchar(p)		asodec8(p)
111 
112 extern uint16_t			asocas16(uint16_t volatile*, uint16_t, uint16_t);
113 extern uint16_t			asoget16(uint16_t volatile*);
114 extern uint16_t			asoinc16(uint16_t volatile*);
115 extern uint16_t			asodec16(uint16_t volatile*);
116 
117 #define asocasshort(p,o,n)	asocas16(p,o,n)
118 #define asogetshort(p)		asoget16(p)
119 #define asoincshort(p)		asoinc16(p)
120 #define asodecshort(p)		asodec16(p)
121 
122 extern uint32_t			asocas32(uint32_t volatile*, uint32_t, uint32_t);
123 extern uint32_t			asoget32(uint32_t volatile*);
124 extern uint32_t			asoinc32(uint32_t volatile*);
125 extern uint32_t			asodec32(uint32_t volatile*);
126 
127 #if _ast_sizeof_int == 4
128 #define asocasint(p,o,n)	asocas32((uint32_t volatile*)p,o,n)
129 #define asogetint(p)		asoget32((uint32_t volatile*)p)
130 #define asoincint(p)		asoinc32((uint32_t volatile*)p)
131 #define asodecint(p)		asodec32((uint32_t volatile*)p)
132 #endif
133 
134 #if _ast_sizeof_long == 4
135 #define asocaslong(p,o,n)	asocas32((uint32_t volatile*)p,o,n)
136 #define asogetlong(p)		asoget32((uint32_t volatile*)p)
137 #define asoinclong(p)		asoinc32((uint32_t volatile*)p)
138 #define asodeclong(p)		asodec32((uint32_t volatile*)p)
139 #endif
140 
141 #if _ast_sizeof_size_t == 4
142 #define asocassize(p,o,n)	asocas32((uint32_t volatile*)p,o,n)
143 #define asogetsize(p)		asoget32((uint32_t volatile*)p)
144 #define asoincsize(p)		asoinc32((uint32_t volatile*)p)
145 #define asodecsize(p)		asodec32((uint32_t volatile*)p)
146 #endif
147 
148 #ifdef _ast_int8_t
149 
150 extern uint64_t			asocas64(uint64_t volatile*, uint64_t, uint64_t);
151 extern uint64_t			asoget64(uint64_t volatile*);
152 extern uint64_t			asoinc64(uint64_t volatile*);
153 extern uint64_t			asodec64(uint64_t volatile*);
154 
155 #if _ast_sizeof_int == 8
156 #define asocasint(p,o,n)	asocas64((uint64_t volatile*)p,o,n)
157 #define asogetint(p)		asoget64((uint64_t volatile*)p)
158 #define asoincint(p)		asoinc64((uint64_t volatile*)p)
159 #define asodecint(p)		asodec64((uint64_t volatile*)p)
160 #endif
161 
162 #if _ast_sizeof_long == 8
163 #define asocaslong(p,o,n)	asocas64((uint64_t volatile*)p,o,n)
164 #define asogetlong(p)		asoget64((uint64_t volatile*)p)
165 #define asoinclong(p)		asoinc64((uint64_t volatile*)p)
166 #define asodeclong(p)		asodec64((uint64_t volatile*)p)
167 #endif
168 
169 #if _ast_sizeof_size_t == 8
170 #define asocassize(p,o,n)	asocas64((uint64_t volatile*)p,o,n)
171 #define asogetsize(p)		asoget64((uint64_t volatile*)p)
172 #define asoincsize(p)		asoinc64((uint64_t volatile*)p)
173 #define asodecsize(p)		asodec64((uint64_t volatile*)p)
174 #endif
175 
176 #endif
177 
178 extern void*			asocasptr(void volatile*, void*, void*);
179 extern void*			asogetptr(void volatile*);
180 
181 #undef	extern
182 
183 #endif
184