| 828 | } |
| 829 | |
| 830 | PB_API void *pb_poolalloc(pb_Pool *pool) { |
| 831 | void *obj = pool->freed; |
| 832 | if (obj == NULL) { |
| 833 | size_t objsize = pool->obj_size, offset; |
| 834 | void *newpage = malloc(PB_POOLSIZE); |
| 835 | if (newpage == NULL) return NULL; |
| 836 | offset = ((PB_POOLSIZE - sizeof(void*)) / objsize - 1) * objsize; |
| 837 | for (; offset > 0; offset -= objsize) { |
| 838 | void **entry = (void**)((char*)newpage + offset); |
| 839 | *entry = pool->freed, pool->freed = (void*)entry; |
| 840 | } |
| 841 | *(void**)((char*)newpage + PB_POOLSIZE - sizeof(void*)) = pool->pages; |
| 842 | pool->pages = newpage; |
| 843 | return newpage; |
| 844 | } |
| 845 | pool->freed = *(void**)obj; |
| 846 | return obj; |
| 847 | } |
| 848 | |
| 849 | PB_API void pb_poolfree(pb_Pool *pool, void *obj) |
| 850 | { *(void**)obj = pool->freed, pool->freed = obj; } |
no outgoing calls
no test coverage detected