XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
bma.c
浏览该文件的文档.
1
13#include <xwos/standard.h>
14#include <string.h>
15#include <xwos/lib/xwlog.h>
16#include <xwos/lib/bclst.h>
17#include <xwos/lib/xwbop.h>
19#include <xwos/mm/common.h>
20#include <xwos/mm/bma.h>
21
22/* #define XWMM_BMA_LOG */
23#if defined(XWMM_BMA_LOG)
24# define xwmm_bmalogf(lv, fmt, ...) xwlogf(lv, "BMA", fmt, ##__VA_ARGS__)
25#else
26# define xwmm_bmalogf(lv, fmt, ...)
27#endif
28
29static __xwos_code
30struct xwmm_bma_bcb * xwmm_bma_mem_to_bcb(struct xwmm_bma * bma, void * mem);
31
32static __xwos_code
33void * xwmm_bma_bcb_to_mem(struct xwmm_bma * bma, struct xwmm_bma_bcb * bcb);
34
35static __xwos_code
36struct xwmm_bma_bcb * xwmm_bma_find_buddy(struct xwmm_bma * bma,
37 struct xwmm_bma_bcb * bcb);
38
39static __xwos_code
40void xwmm_bma_orderlist_add(struct xwmm_bma * bma,
41 struct xwmm_bma_orderlist * ol,
42 xwu8_t odr,
43 struct xwmm_bma_bcb * bcb);
44
45static __xwos_code
47 struct xwmm_bma_orderlist * ol,
48 xwu8_t odr,
49 struct xwmm_bma_bcb * bcb);
50
51static __xwos_code
53 struct xwmm_bma_orderlist * ol);
54
55static __xwos_code
56void xwmm_bma_divide_block(struct xwmm_bma * bma, struct xwmm_bma_bcb * bcb,
57 xwsq_t target_odr, struct xwmm_bma_orderlist * curr_ol);
58
59static __xwos_code
60void xwmm_bma_combine(struct xwmm_bma * bma, struct xwmm_bma_bcb * bcb);
61
63xwer_t xwmm_bma_init(struct xwmm_bma * bma, const char * name,
64 xwptr_t origin, xwsz_t size,
65 xwsz_t blksize, xwsz_t blkodr)
66{
67 xwer_t rc;
68 xwsz_t num;
69 xwsz_t i;
70
71 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
72
73 num = 1U << blkodr;
74 if (size != (num * blksize)) {
75 rc = -ESIZE;
76 xwmm_bmalogf(ERR, "Size of memory(0x%lX, 0x%lX) is error!\n",
77 origin, size);
78 goto err_size;
79 }
80 bma->name = name;
81 bma->zone.origin = origin;
82 bma->zone.size = blksize * num;
83 bma->blksize = blksize;
84 bma->blkodr = blkodr;
85 xwos_splk_init(&bma->lock);
86 bma->orderlists = (struct xwmm_bma_orderlist *)&bma[(xwsz_t)1];
87 bma->bcbs = (struct xwmm_bma_bcb *)&bma->orderlists[(xwsz_t)1 + blkodr];
88 xwmm_bmalogf(DEBUG,
89 "memory:(0x%lX,0x%lX),orderlists:0x%lX,bcbs:0x%lX,"
90 "blocksize:0x%lX, blockorder:0x%lX\n",
91 origin, size, (xwptr_t)bma->orderlists, (xwptr_t)bma->bcbs,
92 bma->blksize, bma->blkodr);
93
94 for (i = 0; i < num; i++) {
96 }
97 bma->bcbs[0].order = (xwu8_t)blkodr | XWMM_BMA_INUSED;
98
99 for (i = 0; i <= blkodr; i++) {
101 }
102 xwmm_bma_orderlist_add(bma, &bma->orderlists[blkodr], blkodr, &bma->bcbs[0]);
103 return XWOK;
104
105err_size:
106 return rc;
107}
108
115static __xwos_code
116struct xwmm_bma_bcb * xwmm_bma_mem_to_bcb(struct xwmm_bma * bma, void * mem)
117{
118 struct xwmm_bma_bcb * bcb;
119 xwptr_t ofs;
120 xwptr_t idx;
121
122 ofs = (xwptr_t)mem - bma->zone.origin;
123 idx = ofs / (xwptr_t)bma->blksize;
124 if (ofs == (idx * bma->blksize)) {
125 bcb = &bma->bcbs[idx];
126 } else {
127 bcb = err_ptr(-EINVAL);
128 }
129 return bcb;
130}
131
138static __xwos_code
139void * xwmm_bma_bcb_to_mem(struct xwmm_bma * bma, struct xwmm_bma_bcb * bcb)
140{
141 xwptr_t idx;
142 xwptr_t mem;
143
144 idx = ((xwptr_t)bcb - (xwptr_t)bma->bcbs) / sizeof(struct xwmm_bma_bcb);
145 mem = (idx * bma->blksize) + bma->zone.origin;
146 return (void *)mem;
147}
148
155static __xwos_code
157 struct xwmm_bma_bcb * bcb)
158{
159 xwsq_t seq;
160 xwsq_t odr;
161
162 seq = ((xwptr_t)bcb - (xwptr_t)bma->bcbs) / sizeof(struct xwmm_bma_bcb);
163 odr = (xwsq_t)bcb->order & XWMM_BMA_ORDER_MASK;
164 seq ^= (1U << odr);
165 return &bma->bcbs[seq];
166}
167
175static __xwos_code
177 struct xwmm_bma_orderlist * ol,
178 xwu8_t odr,
179 struct xwmm_bma_bcb * bcb)
180{
181 struct xwlib_bclst_node * n;
182
183 /* 即将加入的块不在阶链表中,是本地数据。*/
184 if ((XWMM_BMA_INUSED | odr) == bcb->order) {
185 n = xwmm_bma_bcb_to_mem(bma, bcb);
186 xwmm_bmalogf(DEBUG,
187 "[OL:0x%lX][+] bcb(idx:0x%lX,odr:0x%X),mem(0x%lX)\n",
188 (xwptr_t)ol,
189 (((xwptr_t)bcb - (xwptr_t)xwmm_bma->bcbs) /
190 sizeof(struct xwmm_bma_bcb)),
191 bcb->order, (xwptr_t)n);
193 xwlib_bclst_add_head(&ol->head, n);
194 /* 当块被加入到阶链表中,就变成共享数据。*/
196 }
197}
198
209static __xwos_code
211 struct xwmm_bma_orderlist * ol,
212 xwu8_t odr,
213 struct xwmm_bma_bcb * bcb)
214{
215 struct xwlib_bclst_node * n;
216 xwer_t rc;
217
218 XWOS_UNUSED(ol);
219 n = xwmm_bma_bcb_to_mem(bma, bcb);
220 xwmm_bmalogf(DEBUG,
221 "[OL:0x%lX][-] bcb(idx:0x%lX,odr:0x%X),mem(0x%lX)\n",
222 (xwptr_t)ol,
223 (((xwptr_t)bcb - (xwptr_t)xwmm_bma->bcbs) /
224 sizeof(struct xwmm_bma_bcb)),
225 bcb->order, (xwptr_t)n);
226 /* 即将被删除的块在阶链表中,是共享数据。*/
227 if (odr != bcb->order) {
228 rc = -ESRCH;
229 } else {
231 bcb->order |= XWMM_BMA_INUSED;
232 rc = XWOK;
233 }
234 return rc;
235}
236
244static __xwos_code
246 struct xwmm_bma_orderlist * ol)
247{
248 struct xwlib_bclst_node * n;
249 struct xwmm_bma_bcb * bcb;
250
251 if (xwlib_bclst_tst_empty(&ol->head)) {
252 bcb = err_ptr(-ENOENT);
253 } else {
254 n = ol->head.next;
256 bcb = xwmm_bma_mem_to_bcb(bma, n);
257 xwmm_bmalogf(DEBUG,
258 "[OL:0x%lX][C] bcb(idx:0x%lX,odr:0x%X)\n",
259 (xwptr_t)ol,
260 (((xwptr_t)bcb - (xwptr_t)xwmm_bma->bcbs) /
261 sizeof(struct xwmm_bma_bcb)),
262 bcb->order);
263 /* 即将被选择的块在阶链表中,是共享数据。*/
264 bcb->order |= XWMM_BMA_INUSED;
265 }
266 return bcb;
267}
268
276static __xwos_code
277void xwmm_bma_divide_block(struct xwmm_bma * bma, struct xwmm_bma_bcb * bcb,
278 xwsq_t target_odr, struct xwmm_bma_orderlist * curr_ol)
279{
280 xwsq_t blk_odr;
281 xwsq_t blk_idx;
282 xwsq_t blk_ofs;
283 struct xwmm_bma_bcb * buddy;
284
285 blk_odr = (xwsq_t)bcb->order & XWMM_BMA_ORDER_MASK;
286 blk_idx = ((xwptr_t)bcb - (xwptr_t)bma->bcbs) / sizeof(struct xwmm_bma_bcb);
287
288 while (blk_odr > target_odr) {
289 curr_ol--;
290 blk_odr--;
291 blk_ofs = 1U << blk_odr;
292 buddy = &bma->bcbs[blk_idx + blk_ofs];
293 /* 加入阶链表之前, `buddy` 是本地数据。*/
295 buddy->order = (xwu8_t)blk_odr | XWMM_BMA_INUSED;
296 xwmm_bma_orderlist_add(bma, curr_ol, blk_odr, buddy);
297 /* `bcb` 是本地数据。*/
298 bcb->order = (xwu8_t)blk_odr | XWMM_BMA_INUSED;
299 xwmm_bmalogf(DEBUG,
300 "[ALLOC][D] bcb(idx:0x%lX,odr:0x%X),"
301 "buddy(idx:0x%lX,odr:0x%X)\n",
302 (((xwptr_t)bcb - (xwptr_t)xwmm_bma->bcbs) /
303 sizeof(struct xwmm_bma_bcb)),
304 bcb->order,
305 (((xwptr_t)buddy - (xwptr_t)xwmm_bma->bcbs) /
306 sizeof(struct xwmm_bma_bcb)),
307 buddy->order);
308 }
309}
310
312xwer_t xwmm_bma_alloc(struct xwmm_bma * bma, xwsq_t order, void ** membuf)
313{
314 xwer_t rc;
315 xwreg_t flag;
316 xwsq_t o;
317 struct xwmm_bma_orderlist * ol;
318 struct xwmm_bma_bcb * bcb;
319
320 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
321 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
322 XWOS_VALIDATE((order <= (xwsq_t)XWMM_BMA_MAX_ORDER), "out-of-range", -ERANGE);
323
324 ol = NULL;
325 bcb = err_ptr(-ENOENT);
326 xwos_splk_lock_cpuirqsv(&bma->lock, &flag);
327 for (o = order; o <= bma->blkodr; o++) {
328 ol = &bma->orderlists[o];
329 bcb = xwmm_bma_orderlist_choose(bma, ol);
330 if (!is_err(bcb)) {
331 break;
332 }
333 }
334 if (is_err(bcb)) { // cppcheck-suppress [misra-c2012-14.4]
335 xwos_splk_unlock_cpuirqrs(&bma->lock, flag);
336 rc = -ENOMEM;
337 *membuf = NULL;
338 } else {
339 xwmm_bmalogf(DEBUG,
340 "[ALLOC] bcb(idx:0x%lX,odr:0x%X)\n",
341 (((xwptr_t)bcb - (xwptr_t)xwmm_bma->bcbs) /
342 sizeof(struct xwmm_bma_bcb)),
343 bcb->order);
344 xwmm_bma_divide_block(bma, bcb, order, ol);
345 xwos_splk_unlock_cpuirqrs(&bma->lock, flag);
346 rc = XWOK;
347 *membuf = xwmm_bma_bcb_to_mem(bma, bcb);
348 }
349 return rc;
350}
351
358static __xwos_code
359void xwmm_bma_combine(struct xwmm_bma * bma, struct xwmm_bma_bcb * bcb)
360{
361 struct xwmm_bma_bcb * buddy;
362 xwsq_t curr_odr;
363 xwsq_t target_odr;
364 xwer_t rc;
365
366 curr_odr = (bcb->order & XWMM_BMA_ORDER_MASK);
367 target_odr = curr_odr + (xwsq_t)1;
368 while (target_odr <= bma->blkodr) {
369 buddy = xwmm_bma_find_buddy(bma, bcb);
370 xwmm_bmalogf(DEBUG,
371 "[FREE][M] bcb(idx:0x%lX,odr:0x%X),"
372 "buddy(idx:0x%lX,odr:0x%X)\n",
373 (((xwptr_t)bcb - (xwptr_t)xwmm_bma->bcbs) /
374 sizeof(struct xwmm_bma_bcb)),
375 bcb->order,
376 (((xwptr_t)buddy - (xwptr_t)xwmm_bma->bcbs) /
377 sizeof(struct xwmm_bma_bcb)),
378 buddy->order);
381 &bma->orderlists[curr_odr],
382 curr_odr,
383 buddy);
384 if (rc < 0) {
385 break;
386 }
387 /* 此时 `buddy->order` 以及 `bcb->order` 都是本地数据。 */
388 if (buddy > bcb) {
390 bcb->order = (xwu8_t)target_odr | XWMM_BMA_INUSED;
391 } else {
393 buddy->order = (xwu8_t)target_odr | XWMM_BMA_INUSED;
394 bcb = buddy;
395 }
396 curr_odr = target_odr;
397 target_odr++;
398 }
399 xwmm_bma_orderlist_add(bma, &bma->orderlists[curr_odr], curr_odr, bcb);
400}
401
403xwer_t xwmm_bma_free(struct xwmm_bma * bma, void * mem)
404{
405 struct xwmm_bma_bcb * bcb;
406 xwptr_t unaligned;
407 xwreg_t flag;
408 xwer_t rc;
409
410 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
411
412 if (NULL == mem) {
413 rc = XWOK;
414 goto do_nothing;
415 }
416 if ((((xwptr_t)mem < bma->zone.origin) ||
417 ((xwptr_t)mem >= (bma->zone.origin + bma->zone.size)))) {
418 rc = -ERANGE;
419 goto err_range;
420 }
421 unaligned = ((xwptr_t)mem - bma->zone.origin) % (xwptr_t)bma->blksize;
422 mem = (void *)((xwptr_t)mem - unaligned);
423 bcb = xwmm_bma_mem_to_bcb(bma, mem);
424 if (is_err(bcb)) { // cppcheck-suppress [misra-c2012-14.4]
425 rc = ptr_err(bcb);
426 goto err_invalmem;
427 }
428 xwmm_bmalogf(DEBUG,
429 "[FREE] mem:0x%lX,bcb(idx:0x%lX,odr:0x%X)\n",
430 (xwptr_t)mem,
431 (((xwptr_t)bcb - (xwptr_t)xwmm_bma->bcbs) /
432 sizeof(struct xwmm_bma_bcb)),
433 bcb->order);
434 if (0 == (XWMM_BMA_INUSED & bcb->order)) {
435 rc = -EINVAL;
436 goto err_invalmem;
437 }
438 xwos_splk_lock_cpuirqsv(&bma->lock, &flag);
439 xwmm_bma_combine(bma, bcb);
440 xwos_splk_unlock_cpuirqrs(&bma->lock, flag);
441 return XWOK;
442
443err_invalmem:
444err_range:
445do_nothing:
446 return rc;
447}
448
450xwer_t xwmm_bma_malloc(struct xwmm_bma * bma, xwsz_t size, void ** membuf)
451{
452 xwer_t rc;
453 xwsz_t nrblk;
454 xwssq_t p2;
455
456 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
457 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
458
459 if ((xwsz_t)0 == size) {
460 rc = XWOK;
461 *membuf = NULL;
462 } else {
463 nrblk = XWBOP_DIV_ROUND_UP(size, bma->blksize);
464 p2 = xwbop_fls(xwsz_t, nrblk);
465 while ((p2 < 0) || ((bma->blksize << (xwsz_t)p2) < size)) {
466 p2++;
467 }
468 rc = xwmm_bma_alloc(bma, (xwsq_t)p2, membuf);
469 }
470 return rc;
471}
472
474xwer_t xwmm_bma_realloc(struct xwmm_bma * bma, xwsz_t size, void ** membuf)
475{
476 struct xwmm_bma_bcb * bcb;
477 xwptr_t unaligned;
478 xwsz_t oldsize;
479 xwer_t rc;
480 void * oldm;
481 void * newm;
482
483 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
484 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
485
486 oldm = *membuf;
487 if (NULL == oldm) {
488 rc = xwmm_bma_malloc(bma, size, membuf);
489 } else if ((xwsz_t)0 == size) {
490 rc = xwmm_bma_free(bma, oldm);
491 if (XWOK == rc) {
492 *membuf = NULL;
493 }
494 } else {
495 if ((((xwptr_t)oldm < bma->zone.origin) ||
496 ((xwptr_t)oldm >= (bma->zone.origin + bma->zone.size)))) {
497 *membuf = NULL;
498 rc = -ERANGE;
499 } else {
500 unaligned = (((xwptr_t)oldm - bma->zone.origin) %
501 (xwptr_t)bma->blksize);
502 oldm = (void *)((xwptr_t)oldm - unaligned);
503 bcb = xwmm_bma_mem_to_bcb(bma, oldm);
504 oldsize = bcb->order & XWMM_BMA_ORDER_MASK;
505 oldsize = (1U << oldsize);
506 if (size <= oldsize) {
507 rc = XWOK;
508 } else {
509 rc = xwmm_bma_malloc(bma, size, &newm);
510 if (XWOK == rc) {
511 // cppcheck-suppress [misra-c2012-17.7]
512 memcpy(newm, oldm, size);
513 *membuf = newm;
514 xwmm_bma_free(bma, oldm);
515 } else {
516 *membuf = NULL;
517 }
518 }
519 }
520 }
521 return rc;
522}
523
525xwer_t xwmm_bma_memalign(struct xwmm_bma * bma, xwsz_t alignment, xwsz_t size,
526 void ** membuf)
527{
528 xwssq_t p2;
529 xwer_t rc;
530
531 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
532 XWOS_VALIDATE((membuf), "nullptr", -EFAULT);
533
534 if (alignment < XWMM_ALIGNMENT) {
535 alignment = XWMM_ALIGNMENT;
536 }
537 p2 = xwbop_fls(xwsz_t, alignment);
538 while (((xwsz_t)1 << (xwsz_t)p2) < alignment) {
539 p2++;
540 }
541 alignment = (xwsz_t)1 << (xwsz_t)p2;
542 if ((xwsz_t)0 == size) {
543 rc = XWOK;
544 *membuf = NULL;
545 } else {
546 if (size <= alignment) {
547 size = alignment;
548 } else {
549 p2 = xwbop_fls(xwsz_t, size);
550 while (((xwsz_t)1 << (xwsz_t)p2) < size) {
551 p2++;
552 }
553 size = ((xwsz_t)1 << (xwsz_t)p2);
554 }
555 /* 因BMA的特点,申请到的内存地址一定对齐到size,
556 只要size是alignment的整数倍,也一定对齐到alignment。 */
557 rc = xwmm_bma_malloc(bma, size, membuf);
558 }
559 return rc;
560}
561
562xwer_t xwmm_bma_malloc_usable_size(struct xwmm_bma * bma, void * mem, xwsz_t * size)
563{
564 struct xwmm_bma_bcb * bcb;
565 xwptr_t unaligned;
566 xwsz_t realsize;
567 xwer_t rc;
568
569 XWOS_VALIDATE((bma), "nullptr", -EFAULT);
570 XWOS_VALIDATE((size), "nullptr", -EFAULT);
571
572 if ((((xwptr_t)mem < bma->zone.origin) ||
573 ((xwptr_t)mem >= (bma->zone.origin + bma->zone.size)))) {
574 rc = -ERANGE;
575 } else {
576 rc = XWOK;
577 unaligned = (((xwptr_t)mem - bma->zone.origin) % (xwptr_t)bma->blksize);
578 mem = (void *)((xwptr_t)mem - unaligned);
579 bcb = xwmm_bma_mem_to_bcb(bma, mem);
580 realsize = bcb->order & XWMM_BMA_ORDER_MASK;
581 realsize = (1U << realsize);
582 *size = realsize;
583 }
584 return rc;
585}
XWOS通用库:双循环链表
static struct xwmm_bma_bcb * xwmm_bma_mem_to_bcb(struct xwmm_bma *bma, void *mem)
从内存块首地址获得其控制块的指针
Definition bma.c:116
static void xwmm_bma_combine(struct xwmm_bma *bma, struct xwmm_bma_bcb *bcb)
合并内存块
Definition bma.c:359
static void xwmm_bma_orderlist_add(struct xwmm_bma *bma, struct xwmm_bma_orderlist *ol, xwu8_t odr, struct xwmm_bma_bcb *bcb)
将一块内存加入到阶链表
Definition bma.c:176
static struct xwmm_bma_bcb * xwmm_bma_orderlist_choose(struct xwmm_bma *bma, struct xwmm_bma_orderlist *ol)
从阶链表中选择一块内存,并返回其块控制块
Definition bma.c:245
#define xwmm_bmalogf(lv, fmt,...)
Definition bma.c:26
static struct xwmm_bma_bcb * xwmm_bma_find_buddy(struct xwmm_bma *bma, struct xwmm_bma_bcb *bcb)
寻找内存块的伙伴
Definition bma.c:156
static void * xwmm_bma_bcb_to_mem(struct xwmm_bma *bma, struct xwmm_bma_bcb *bcb)
从内存块的控制块指针获得内存块的首地址
Definition bma.c:139
static xwer_t xwmm_bma_orderlist_remove(struct xwmm_bma *bma, struct xwmm_bma_orderlist *ol, xwu8_t odr, struct xwmm_bma_bcb *bcb)
从阶链表中删除一块内存
Definition bma.c:210
static void xwmm_bma_divide_block(struct xwmm_bma *bma, struct xwmm_bma_bcb *bcb, xwsq_t target_odr, struct xwmm_bma_orderlist *curr_ol)
将大内存块分割成小块
Definition bma.c:277
XWOS内存管理:伙伴算法内存块分配器
xwer_t xwmm_bma_realloc(struct xwmm_bma *bma, xwsz_t size, void **membuf)
XWMM API:调整内存大小
Definition bma.c:474
#define XWMM_BMA_ORDER_MASK
Definition bma.h:46
xwer_t xwmm_bma_init(struct xwmm_bma *bma, const char *name, xwptr_t origin, xwsz_t size, xwsz_t blksize, xwsz_t blkodr)
XWMM API:初始化伙伴算法内存块分配器
Definition bma.c:63
xwer_t xwmm_bma_free(struct xwmm_bma *bma, void *mem)
XWMM API:释放内存块
Definition bma.c:403
xwer_t xwmm_bma_memalign(struct xwmm_bma *bma, xwsz_t alignment, xwsz_t size, void **membuf)
XWMM API:申请对齐的内存
Definition bma.c:525
xwer_t xwmm_bma_malloc(struct xwmm_bma *bma, xwsz_t size, void **membuf)
XWMM API:申请指定大小的连续内存
Definition bma.c:450
#define XWMM_BMA_INUSED
Definition bma.h:47
#define XWMM_BMA_COMBINED
Definition bma.h:45
xwer_t xwmm_bma_malloc_usable_size(struct xwmm_bma *bma, void *mem, xwsz_t *size)
XWMM API:返回该块内存实际可用字节数
Definition bma.c:562
#define XWMM_BMA_MAX_ORDER
Definition bma.h:44
xwer_t xwmm_bma_alloc(struct xwmm_bma *bma, xwsq_t order, void **membuf)
XWMM API:申请一块连续的内存
Definition bma.c:312
#define XWMM_ALIGNMENT
Definition common.h:29
static void xwlib_bclst_init_head(struct xwlib_bclst_node *h)
初始化一个链表头。
Definition bclst.h:229
static void xwlib_bclst_init_node(struct xwlib_bclst_node *n)
初始化一个链表节点。
Definition bclst.h:240
static bool xwlib_bclst_tst_empty(const struct xwlib_bclst_node *h)
测试链表是否为空。
Definition bclst.h:253
static void xwlib_bclst_add_head(struct xwlib_bclst_node *head, struct xwlib_bclst_node *newn)
将一个节点加入链表头部(链表头的后面)
Definition bclst.h:345
static void xwlib_bclst_del_init(struct xwlib_bclst_node *node)
删除一个节点,并重新初始化它
Definition bclst.h:391
#define __xwos_code
Definition compiler.h:171
#define __xwos_api
Definition compiler.h:175
#define ENOENT
No such file or directory
Definition errno.h:32
#define EINVAL
Invalid argument
Definition errno.h:52
#define EFAULT
Bad address
Definition errno.h:44
#define ESRCH
No such process
Definition errno.h:33
#define ENOMEM
Not enough space
Definition errno.h:42
#define XWOK
No error
Definition errno.h:182
#define ERANGE
Result too large
Definition errno.h:64
#define ESIZE
Size error
Definition errno.h:199
static __xwcc_inline void *__xwcc_must_check err_ptr(xwer_t err)
将错误码转换为指针
Definition error.h:42
static __xwcc_inline bool __xwcc_must_check is_err(const void *ptr)
测试指针的值是否为错误码
Definition error.h:65
static __xwcc_inline xwer_t __xwcc_must_check ptr_err(const void *ptr)
将指针的值转换为错误码
Definition error.h:53
signed long xwer_t
Definition type.h:554
#define NULL
Definition type.h:28
unsigned long xwsz_t
Definition type.h:339
uint8_t xwu8_t
Definition type.h:194
unsigned long xwsq_t
Definition type.h:445
signed long xwssq_t
Definition type.h:461
unsigned long xwptr_t
Definition type.h:375
xwptr_t xwreg_t
Definition type.h:409
#define XWBOP_DIV_ROUND_UP(n, d)
Definition xwbop.h:31
#define xwbop_fls(type, data)
在数据中从最高位起查找第一个被置1的位
Definition xwbop.h:169
static void xwos_splk_unlock_cpuirqrs(struct xwos_splk *spl, xwreg_t cpuirq)
XWOS API:解锁自旋锁,并恢复本地CPU的中断标志
Definition spinlock.h:220
static void xwos_splk_init(struct xwos_splk *spl)
XWOS API:初始化自旋锁
Definition spinlock.h:85
static void xwos_splk_lock_cpuirqsv(struct xwos_splk *spl, xwreg_t *cpuirq)
XWOS API:上锁自旋锁,保存本地CPU的中断标志并关闭
Definition spinlock.h:188
#define XWOS_VALIDATE(exp, errstr,...)
检查函数参数是否有效
Definition standard.h:78
#define XWOS_BUG_ON(x)
Definition standard.h:57
#define XWOS_UNUSED(x)
Definition standard.h:66
操作系统抽象层:自旋锁
双循环链表的节点
Definition bclst.h:27
struct xwlib_bclst_node * next
Definition bclst.h:28
块控制块
Definition bma.h:72
xwu8_t order
Definition bma.h:73
阶链表
Definition bma.h:65
struct xwlib_bclst_node head
Definition bma.h:66
伙伴算法内存块分配器
Definition bma.h:82
struct xwmm_zone zone
Definition bma.h:83
struct xwos_splk lock
Definition bma.h:87
struct xwmm_bma_orderlist * orderlists
Definition bma.h:88
const char * name
Definition bma.h:84
struct xwmm_bma_bcb * bcbs
Definition bma.h:89
xwsq_t blkodr
Definition bma.h:86
xwsz_t blksize
Definition bma.h:85
xwptr_t origin
Definition common.h:41
xwsz_t size
Definition common.h:42
XWOS通用库:位操作
XWOS通用库:日志
XWOS内存管理:通用定义
XWOS的标准头文件