static inline void *_rt_shm_alloc(unsigned long name, int size, int suprt) { void *adr; // suprt = USE_GFP_ATOMIC; // to force some testing if (!(adr = rt_get_adr_cnt(name)) && size > 0 && suprt >= 0 && RT_SHM_OP_PERM()) { size = ((size - 1) & PAGE_MASK) + PAGE_SIZE; if ((adr = suprt ? rkmalloc(&size, SUPRT[suprt]) : rvmalloc(size))) { if (!rt_register(name, adr, suprt ? -size : size, 0)) { if (suprt) { rkfree(adr, size); } else { rvfree(adr, size); } return 0; } memset(ALIGN2PAGE(adr), 0, size); } } return ALIGN2PAGE(adr); }
static inline int _rt_shm_free(unsigned long name, int size) { void *adr; if (size && (adr = rt_get_adr(name))) { if (RT_SHM_OP_PERM()) { if (!rt_drg_on_name_cnt(name) && name != GLOBAL_HEAP_ID) { if (size < 0) { rkfree(adr, -size); } else { rvfree(adr, size); } } } return abs(size); } return 0; }