XWOS API  3.0
XWOS API参考手册
载入中...
搜索中...
未找到
位图原子操作
位图原子操作 的协作图:

宏定义

#define xwbmpaop_define(name, bits)   atomic_xwbmp_t name[BITS_TO_XWBMP_T(bits)]
 XWOS BOPLIB:声明原子位图
 

函数

bool xwbmpaop_t1i (atomic_xwbmp_t *bmp, xwsq_t idx)
 XWOS AOPLIB:测试位图中的某位是否被置1
 
void xwbmpaop_s1i (atomic_xwbmp_t *bmp, xwsq_t idx)
 XWOS AOPLIB:将位图中某位置1
 
void xwbmpaop_c0i (atomic_xwbmp_t *bmp, xwsq_t idx)
 XWOS AOPLIB:将位图中某位清0
 
void xwbmpaop_x1i (atomic_xwbmp_t *bmp, xwsq_t idx)
 XWOS AOPLIB:将位图中某位翻转
 
xwer_t xwbmpaop_t0i_then_s1i (atomic_xwbmp_t *bmp, xwsq_t idx)
 XWOS AOPLIB:测试位图中某位是否为0,如果是,就将它置1
 
xwer_t xwbmpaop_t1i_then_c0i (atomic_xwbmp_t *bmp, xwsq_t idx)
 XWOS AOPLIB:测试位图中某位是否为1,如果是,就将它清0
 
xwssq_t xwbmpaop_fls_then_c0i (atomic_xwbmp_t *bmp, xwsz_t num)
 XWOS AOPLIB:从最高位起查找位图中第一个为1的位并将它清0
 
xwssq_t xwbmpaop_flz_then_s1i (atomic_xwbmp_t *bmp, xwsz_t num)
 XWOS AOPLIB:从最高位起查找位图中第一个为0的位并将它置1
 
xwssq_t xwbmpaop_ffs_then_c0i (atomic_xwbmp_t *bmp, xwsz_t num)
 XWOS AOPLIB:从最低位起查找位图中第一个为1的位并将它清0
 
xwssq_t xwbmpaop_ffz_then_s1i (atomic_xwbmp_t *bmp, xwsz_t num)
 XWOS AOPLIB:从最低位起查找位图中第一个为0的位并将它置1
 
static void xwbmpaop_s1all (atomic_xwbmp_t *bmp, xwsq_t num)
 XWOS AOPLIB:将位图所有位置1
 
static void xwbmpaop_c0all (atomic_xwbmp_t *bmp, xwsq_t num)
 XWOS AOPLIB:将位图所有位清0
 

详细描述

宏定义说明

◆ xwbmpaop_define

#define xwbmpaop_define (   name,
  bits 
)    atomic_xwbmp_t name[BITS_TO_XWBMP_T(bits)]

XWOS BOPLIB:声明原子位图

参数
[in]name符号名
[in]bits位图中的位数

在文件 xwbmpaop.h34 行定义.

函数说明

◆ xwbmpaop_c0all()

static void xwbmpaop_c0all ( atomic_xwbmp_t bmp,
xwsq_t  num 
)
inlinestatic

XWOS AOPLIB:将位图所有位清0

参数
[in]bmp位图的起始地址指针
[in]num位图中总的位数
注解
  • 内存序:acq_rel

在文件 xwbmpaop.h173 行定义.

174{
175 xwsz_t n = BITS_TO_XWBMP_T(num);
176 xwsz_t i;
177
178 for (i = 0; i < n; i++) {
179 xwaop_c0m(xwbmp_t, &bmp[i], ~((xwbmp_t)0), NULL, NULL);
180 }
181}
#define NULL
Definition type.h:28
unsigned long xwsz_t
Definition type.h:97
xwu32_t xwbmp_t
Definition type.h:201
#define xwaop_c0m(type, a, m, nv, ov)
对原子变量进行原子操作:读取-位清0操作-回写
Definition xwaop.h:1192
#define BITS_TO_XWBMP_T(n)
Definition xwbop.h:35

◆ xwbmpaop_c0i()

void xwbmpaop_c0i ( atomic_xwbmp_t bmp,
xwsq_t  idx 
)

XWOS AOPLIB:将位图中某位清0

参数
[in]bmp位图的起始地址指针
[in]idx被清0的位的序号
注解
  • 内存序:acq_rel

在文件 xwbmpaop.c41 行定义.

42{
43 xwsq_t i = XWBOP_BMP(idx);
44 xwbmp_t m = XWBOP_BMP_MASK(idx);
45
46 xwaop_c0m(xwbmp_t, &bmp[i], m, NULL, NULL);
47}
unsigned long xwsq_t
Definition type.h:145
#define XWBOP_BMP(n)
Definition xwbop.h:29
#define XWBOP_BMP_MASK(n)
Definition xwbop.h:28

◆ xwbmpaop_ffs_then_c0i()

xwssq_t xwbmpaop_ffs_then_c0i ( atomic_xwbmp_t bmp,
xwsz_t  num 
)

XWOS AOPLIB:从最低位起查找位图中第一个为1的位并将它清0

参数
[in]bmp位图的起始地址指针
[in]num位图中总的位数
返回
错误码
返回值
>=0位的序号
-ENODATA没有任何一个位为1
注解
  • 内存序:测试成功,acq_rel;测试失败,consume;

<No error

在文件 xwbmpaop.c184 行定义.

185{
186 xwsz_t total = BITS_TO_XWBMP_T(num);
187 xwsq_t i;
188 xwbmp_t msk;
189 xwbmp_t o;
190 xwbmp_t n;
191 xwbmp_t m;
192 xwssq_t pos;
193
194 do {
195 i = 0;
196 pos = -ENODATA;
197 do {
198 if (i == (total - (xwsz_t)1)) {
199 msk = ((xwbmp_t)XWBOP_BIT(num % BITS_PER_XWBMP_T) -
200 (xwbmp_t)1);
201 if ((xwbmp_t)0 == msk) {
202 msk = (xwbmp_t)(~(xwbmp_t)0);
203 }
204 } else {
205 msk = (xwbmp_t)(~(xwbmp_t)0);
206 }
207 o = xwaop_load(xwbmp_t, &bmp[i], xwaop_mo_consume);
208 o &= msk;
209 if ((xwbmp_t)0 != o) {
210 pos = xwbop_ffs(xwbmp_t, o);
211 break;
212 }
213 i++;
214 } while (i < total);
215 if (pos < 0) {
216 pos = -ENODATA;
217 break;
218 } else {
219 m = ((xwbmp_t)1 << (xwbmp_t)pos);
220 n = o & (xwbmp_t)(~m);
221 pos += (xwssq_t)i * (xwssq_t)BITS_PER_XWBMP_T;
222 }
223 } while (XWOK != xwaop_teq_then_write(xwbmp_t, &bmp[i], o, n, NULL));
224 return pos;
225}
#define ENODATA
No data (for no delay io)
Definition errno.h:86
#define XWOK
No error
Definition errno.h:182
#define BITS_PER_XWBMP_T
Definition type.h:729
signed long xwssq_t
Definition type.h:153
@ xwaop_mo_consume
Definition type.h:257
#define xwaop_teq_then_write(type, a, t, v, ov)
对原子变量进行原子操作:读取-测试“相等”-写
Definition xwaop.h:115
#define xwaop_load(type, a, memorder)
对原子变量进行原子操作:加载
Definition xwaop.h:47
#define XWBOP_BIT(n)
Definition xwbop.h:27
#define xwbop_ffs(type, data)
XWOS BOPLIB:在数据中从最低位起查找第一个被置1的位
Definition xwbop.h:201

◆ xwbmpaop_ffz_then_s1i()

xwssq_t xwbmpaop_ffz_then_s1i ( atomic_xwbmp_t bmp,
xwsz_t  num 
)

XWOS AOPLIB:从最低位起查找位图中第一个为0的位并将它置1

参数
[in]bmp位图的起始地址指针
[in]num位图中总的位数
返回
错误码
返回值
>=0位的序号
-ENODATA没有任何一个位为0
注解
  • 内存序:测试成功,acq_rel;测试失败,consume;

<No error

在文件 xwbmpaop.c228 行定义.

229{
230 xwsz_t total = BITS_TO_XWBMP_T(num);
231 xwsq_t i;
232 xwbmp_t msk;
233 xwbmp_t tmp;
234 xwbmp_t o;
235 xwbmp_t n;
236 xwbmp_t m;
237 xwssq_t pos;
238
239 do {
240 i = 0;
241 pos = -ENODATA;
242 do {
243 if (i == (total - (xwsz_t)1)) {
244 msk = ((xwbmp_t)XWBOP_BIT(num % BITS_PER_XWBMP_T) -
245 (xwbmp_t)1);
246 if ((xwbmp_t)0 == msk) {
247 msk = (xwbmp_t)(~(xwbmp_t)0);
248 }
249 } else {
250 msk = (xwbmp_t)(~(xwbmp_t)0);
251 }
252 o = xwaop_load(xwbmp_t, &bmp[i], xwaop_mo_consume);
253 tmp = (xwbmp_t)(~o) & msk;
254 if ((xwbmp_t)0 != tmp) {
255 pos = xwbop_ffs(xwbmp_t, tmp);
256 break;
257 }
258 i++;
259 } while (i < total);
260 if (pos < 0) {
261 pos = -ENODATA;
262 break;
263 } else {
264 m = ((xwbmp_t)1 << (xwbmp_t)pos);
265 n = o | m;
266 pos += (xwssq_t)i * (xwssq_t)BITS_PER_XWBMP_T;
267 }
268 } while (XWOK != xwaop_teq_then_write(xwbmp_t, &bmp[i], o, n, NULL));
269 return pos;
270}

◆ xwbmpaop_fls_then_c0i()

xwssq_t xwbmpaop_fls_then_c0i ( atomic_xwbmp_t bmp,
xwsz_t  num 
)

XWOS AOPLIB:从最高位起查找位图中第一个为1的位并将它清0

参数
[in]bmp位图的起始地址指针
[in]num位图中总的位数
返回
错误码
返回值
>=0位的序号
-ENODATA没有任何一个位为1
注解
  • 内存序:测试成功,acq_rel;测试失败,consume;

<No error

在文件 xwbmpaop.c103 行定义.

104{
105 xwsz_t total = BITS_TO_XWBMP_T(num);
106 xwsq_t i;
107 xwbmp_t msk;
108 xwbmp_t o;
109 xwbmp_t n;
110 xwbmp_t m;
111 xwssq_t pos;
112
113 do {
114 i = total;
115 pos = -ENODATA;
116 msk = ((xwbmp_t)XWBOP_BIT(num % BITS_PER_XWBMP_T) - (xwbmp_t)1);
117 if ((xwbmp_t)0 == msk) {
118 msk = (xwbmp_t)(~(xwbmp_t)0);
119 }
120 do {
121 i--;
122 o = xwaop_load(xwbmp_t, &bmp[i], xwaop_mo_consume);
123 o &= msk;
124 if ((xwbmp_t)0 != o) {
125 pos = xwbop_fls(xwbmp_t, o);
126 break;
127 }
128 msk = (xwbmp_t)(~(xwbmp_t)0);
129 } while (i > (xwsq_t)0);
130 if (pos < 0) {
131 pos = -ENODATA;
132 break;
133 } else {
134 m = ((xwbmp_t)1 << (xwbmp_t)pos);
135 n = o & (xwbmp_t)(~m);
136 pos += (xwssq_t)i * (xwssq_t)BITS_PER_XWBMP_T;
137 }
138 } while (XWOK != xwaop_teq_then_write(xwbmp_t, &bmp[i], o, n, NULL));
139 return pos;
140}
#define xwbop_fls(type, data)
XWOS BOPLIB:在数据中从最高位起查找第一个被置1的位
Definition xwbop.h:213

◆ xwbmpaop_flz_then_s1i()

xwssq_t xwbmpaop_flz_then_s1i ( atomic_xwbmp_t bmp,
xwsz_t  num 
)

XWOS AOPLIB:从最高位起查找位图中第一个为0的位并将它置1

参数
[in]bmp位图的起始地址指针
[in]num位图中总的位数
返回
错误码
返回值
>=0位的序号
-ENODATA没有任何一个位为0
注解
  • 内存序:测试成功,acq_rel;测试失败,consume;

<No error

在文件 xwbmpaop.c143 行定义.

144{
145 xwsz_t total = BITS_TO_XWBMP_T(num);
146 xwsq_t i;
147 xwbmp_t msk;
148 xwbmp_t tmp;
149 xwbmp_t o;
150 xwbmp_t n;
151 xwbmp_t m;
152 xwssq_t pos;
153
154 do {
155 i = total;
156 pos = -ENODATA;
157 msk = ((xwbmp_t)XWBOP_BIT(num % BITS_PER_XWBMP_T) - (xwbmp_t)1);
158 if ((xwbmp_t)0 == msk) {
159 msk = (xwbmp_t)(~(xwbmp_t)0);
160 }
161 do {
162 i--;
163 o = xwaop_load(xwbmp_t, &bmp[i], xwaop_mo_consume);
164 tmp = (xwbmp_t)(~o) & msk;
165 if ((xwbmp_t)0 != tmp) {
166 pos = xwbop_fls(xwbmp_t, tmp);
167 break;
168 }
169 msk = (xwbmp_t)(~(xwbmp_t)0);
170 } while (i > (xwsq_t)0);
171 if (pos < 0) {
172 pos = -ENODATA;
173 break;
174 } else {
175 m = ((xwbmp_t)1 << (xwbmp_t)pos);
176 n = o | m;
177 pos += (xwssq_t)i * (xwssq_t)BITS_PER_XWBMP_T;
178 }
179 } while (XWOK != xwaop_teq_then_write(xwbmp_t, &bmp[i], o, n, NULL));
180 return pos;
181}

◆ xwbmpaop_s1all()

static void xwbmpaop_s1all ( atomic_xwbmp_t bmp,
xwsq_t  num 
)
inlinestatic

XWOS AOPLIB:将位图所有位置1

参数
[in]bmp位图的起始地址指针
[in]num位图中总的位数
注解
  • 内存序:acq_rel

在文件 xwbmpaop.h155 行定义.

156{
157 xwsz_t n = BITS_TO_XWBMP_T(num);
158 xwsz_t i;
159
160 for (i = 0; i < n; i++) {
161 xwaop_s1m(xwbmp_t, &bmp[i], ~((xwbmp_t)0), NULL, NULL);
162 }
163}
#define xwaop_s1m(type, a, m, nv, ov)
对原子变量进行原子操作:读取-位置1操作-回写
Definition xwaop.h:1178

◆ xwbmpaop_s1i()

void xwbmpaop_s1i ( atomic_xwbmp_t bmp,
xwsq_t  idx 
)

XWOS AOPLIB:将位图中某位置1

参数
[in]bmp位图的起始地址指针
[in]idx被置1的位的序号
注解
  • 内存序:acq_rel

在文件 xwbmpaop.c32 行定义.

33{
34 xwsq_t i = XWBOP_BMP(idx);
35 xwbmp_t m = XWBOP_BMP_MASK(idx);
36
37 xwaop_s1m(xwbmp_t, &bmp[i], m, NULL, NULL);
38}

◆ xwbmpaop_t0i_then_s1i()

xwer_t xwbmpaop_t0i_then_s1i ( atomic_xwbmp_t bmp,
xwsq_t  idx 
)

XWOS AOPLIB:测试位图中某位是否为0,如果是,就将它置1

参数
[in]bmp位图的起始地址指针
[in]idx被测试位的序号
返回
错误码
返回值
XWOK没有错误
-EACCES测试失败
注解
  • 内存序:测试成功,acq_rel;测试失败,consume;

<No error

<No error

在文件 xwbmpaop.c59 行定义.

60{
61 xwsq_t i = XWBOP_BMP(idx);
62 xwbmp_t m = XWBOP_BMP_MASK(idx);
63 xwbmp_t o;
64 xwbmp_t n;
65 xwer_t rc;
66
67 do {
68 o = xwaop_load(xwbmp_t, &bmp[i], xwaop_mo_consume);
69 if (!(o & m)) {
70 n = o | m;
71 rc = XWOK;
72 } else {
73 rc = -EACCES;
74 break;
75 }
76 } while (XWOK != xwaop_teq_then_write(xwbmp_t, &bmp[i], o, n, NULL));
77 return rc;
78}
#define EACCES
Permission denied
Definition errno.h:43
signed long xwer_t
Definition type.h:193

◆ xwbmpaop_t1i()

bool xwbmpaop_t1i ( atomic_xwbmp_t bmp,
xwsq_t  idx 
)

XWOS AOPLIB:测试位图中的某位是否被置1

参数
[in]bmp位图的起始地址指针
[in]idx被测试的位的序号
返回
布尔值
返回值
true置位
false复位
注解
  • 内存序:consume

在文件 xwbmpaop.c19 行定义.

20{
21 atomic_xwbmp_t * pos;
22 bool ret;
23 xwbmp_t value;
24
25 pos = &bmp[XWBOP_BMP(idx)];
26 value = xwaop_load(xwbmp_t, pos, xwaop_mo_consume);
27 ret = (bool)(!!(value & XWBOP_BMP_MASK(idx)));
28 return ret;
29}
__xwcc_atomic xwbmp_t atomic_xwbmp_t
Definition type.h:205

◆ xwbmpaop_t1i_then_c0i()

xwer_t xwbmpaop_t1i_then_c0i ( atomic_xwbmp_t bmp,
xwsq_t  idx 
)

XWOS AOPLIB:测试位图中某位是否为1,如果是,就将它清0

参数
[in]bmp位图的起始地址指针
[in]idx被测试位的序号
返回
错误码
返回值
XWOK没有错误
-EACCES测试失败
注解
  • 内存序:测试成功,acq_rel;测试失败,consume;

<No error

<No error

在文件 xwbmpaop.c81 行定义.

82{
83 xwsq_t i = XWBOP_BMP(idx);
84 xwbmp_t m = XWBOP_BMP_MASK(idx);
85 xwbmp_t o;
86 xwbmp_t n;
87 xwer_t rc;
88
89 do {
90 o = xwaop_load(xwbmp_t, &bmp[i], xwaop_mo_consume);
91 if ((xwbmp_t)0 != (o & m)) {
92 n = o & (xwbmp_t)(~m);
93 rc = XWOK;
94 } else {
95 rc = -EACCES;
96 break;
97 }
98 } while (XWOK != xwaop_teq_then_write(xwbmp_t, &bmp[i], o, n, NULL));
99 return rc;
100}

◆ xwbmpaop_x1i()

void xwbmpaop_x1i ( atomic_xwbmp_t bmp,
xwsq_t  idx 
)

XWOS AOPLIB:将位图中某位翻转

参数
[in]bmp位图的起始地址指针
[in]idx被翻转的位的序号
注解
  • 内存序:acq_rel

在文件 xwbmpaop.c50 行定义.

51{
52 xwsq_t i = XWBOP_BMP(idx);
53 xwbmp_t m = XWBOP_BMP_MASK(idx);
54
55 xwaop_x1m(xwbmp_t, &bmp[i], m, NULL, NULL);
56}
#define xwaop_x1m(type, a, m, nv, ov)
对原子变量进行原子操作:读取-位翻转操作-回写
Definition xwaop.h:1206