suba 69 core/suba.c check_cell(const allocator *suba, cell* c, char *fn, int ln) suba 71 core/suba.c if (suba && (c > (cell*)suba) && (c < (cell*)((char*)suba + suba->size))) { suba 77 core/suba.c sprintf(buf, "%s bad cell - %x %x", fn, c, suba); suba 87 core/suba.c void suba_dump(allocator *suba) suba 89 core/suba.c cell *c = &suba->head; suba 90 core/suba.c printf("%x %d => ", c, suba->mincell); suba 99 core/suba.c int check_stats(allocator *suba) suba 101 core/suba.c if (!TakeSemaphore(suba->sem_id, SUBA_SEMAPHORE_TIMEOUT)) suba 105 core/suba.c cell* largest = &suba->head; suba 106 core/suba.c cell* c = check_cell(suba, &suba->head, "suba_getmeminfo", __LINE__); suba 112 core/suba.c c = check_cell(suba, c->next, "suba_getmeminfo", __LINE__); suba 115 core/suba.c if (suba->largest_block == NULL) suba 116 core/suba.c suba->largest_block = largest; suba 119 core/suba.c if (suba->largest_block->h.size != largest->h.size) suba 121 core/suba.c printf("Mismatch - largest %x %d %x %d\n", suba->largest_block, suba->largest_block->h.size, largest->h.size); suba 124 core/suba.c if (suba->free_size != free_size) suba 129 core/suba.c if (suba->free_block_count != count) suba 135 core/suba.c GiveSemaphore(suba->sem_id); suba 148 core/suba.c void suba_dump(allocator *suba) suba 152 core/suba.c cell *c = &suba->head; suba 153 core/suba.c sprintf(buf, "%x %d %x %d =>\n", c, suba->mincell, suba->largest_block, suba->largest_block->h.size); suba 166 core/suba.c void check_stats(allocator *suba) suba 170 core/suba.c cell* largest = &suba->head; suba 171 core/suba.c cell* c = check_cell(suba, &suba->head, "check_stats", __LINE__); suba 177 core/suba.c c = check_cell(suba, c->next, "check_stats", __LINE__); suba 182 core/suba.c if (suba->largest_block->h.size != largest->h.size) suba 184 core/suba.c suba_dump(suba); suba 185 core/suba.c sprintf(buf, "largest %x %d %x %d\n", suba->largest_block, suba->largest_block->h.size, largest, largest->h.size); suba 188 core/suba.c if (suba->free_size != free_size) suba 190 core/suba.c suba_dump(suba); suba 191 core/suba.c sprintf(buf, "free_size %d %d\n", suba->free_size, free_size); suba 194 core/suba.c if (suba->free_block_count != count) suba 196 core/suba.c suba_dump(suba); suba 197 core/suba.c sprintf(buf, "free_count %d %d\n", suba->free_block_count, count); suba 204 core/suba.c suba_getmeminfo(allocator *suba, int *allocated_size, int *allocated_peak, int *allocated_count, int *free_size, int *largest_block, int *free_block_count) suba 206 core/suba.c if (!TakeSemaphore(suba->sem_id, SUBA_SEMAPHORE_TIMEOUT)) suba 208 core/suba.c if (suba->magic != SUBA_MAGIC || *suba->magic2 != SUBA_MAGIC) suba 212 core/suba.c if (suba->largest_block == NULL) suba 214 core/suba.c cell* largest = &suba->head; suba 215 core/suba.c cell* c = check_cell(suba, &suba->head, "suba_getmeminfo", __LINE__); suba 219 core/suba.c c = check_cell(suba, c->next, "suba_getmeminfo", __LINE__); suba 221 core/suba.c suba->largest_block = largest; suba 224 core/suba.c *largest_block = ALLOCSIZE(suba->largest_block->h.size); suba 225 core/suba.c *free_size = suba->free_size; suba 226 core/suba.c *free_block_count = suba->free_block_count; suba 228 core/suba.c *allocated_size = suba->allocated_size; suba 229 core/suba.c *allocated_peak = suba->allocated_peak; suba 230 core/suba.c *allocated_count = suba->allocated_count; suba 233 core/suba.c check_stats(suba); suba 236 core/suba.c GiveSemaphore(suba->sem_id); suba 245 core/suba.c suba_init(allocator *suba, size_t size, size_t mincell, char *name) suba 250 core/suba.c if (suba == NULL || size == 0) { suba 261 core/suba.c memset(suba, 0, hdrsiz); suba 262 core/suba.c suba->magic = SUBA_MAGIC; suba 264 core/suba.c suba->mincell = sizeof(cell); suba 265 core/suba.c if (mincell > suba->mincell) suba 266 core/suba.c suba->mincell = mincell; suba 267 core/suba.c suba->size = size; suba 268 core/suba.c suba->sem_id = CreateBinarySemaphore(name, 1); suba 274 core/suba.c c1 = (cell*)((void*)suba + hdrsiz); suba 289 core/suba.c suba->magic2 = (unsigned int*)CEND(c1); suba 290 core/suba.c *suba->magic2 = SUBA_MAGIC; suba 293 core/suba.c suba->free_block_count = 1; suba 294 core/suba.c suba->free_size = ALLOCSIZE(c1->h.size); suba 295 core/suba.c suba->largest_block = c1; suba 298 core/suba.c suba->head.h.size = sizeof(cell_hdr); suba 299 core/suba.c suba->head.h.magic = CELL_MAGIC; suba 300 core/suba.c suba->head.next = c1; suba 302 core/suba.c return suba; suba 306 core/suba.c suba_alloc(allocator *suba, size_t size, int zero) suba 313 core/suba.c if (cellsize < suba->mincell) cellsize = suba->mincell; suba 315 core/suba.c if (!TakeSemaphore(suba->sem_id, SUBA_SEMAPHORE_TIMEOUT)) suba 318 core/suba.c cell *prev_cell = &suba->head; suba 319 core/suba.c this_cell = check_cell(suba, prev_cell->next, "suba_alloc", __LINE__); suba 322 core/suba.c this_cell = check_cell(suba, this_cell->next, "suba_alloc", __LINE__); suba 327 core/suba.c if (this_cell == suba->largest_block) suba 328 core/suba.c suba->largest_block = NULL; // Force recalculation of largest block in suba_getmeminfo suba 330 core/suba.c if (this_cell->h.size > (cellsize + suba->mincell)) { suba 336 core/suba.c suba->free_size -= cellsize; suba 341 core/suba.c suba->free_block_count -= 1; suba 342 core/suba.c suba->free_size -= ALLOCSIZE(cellsize); suba 346 core/suba.c suba->allocated_size += ALLOCSIZE(cellsize); suba 347 core/suba.c suba->allocated_count++; suba 348 core/suba.c if(suba->allocated_size > suba->allocated_peak) { suba 349 core/suba.c suba->allocated_peak = suba->allocated_size; suba 355 core/suba.c GiveSemaphore(suba->sem_id); suba 374 core/suba.c suba_free(allocator *suba, void *ptr) suba 380 core/suba.c check_cell(suba, this_cell, "suba_free", __LINE__); suba 381 core/suba.c if (this_cell->h.size > suba->size) { suba 387 core/suba.c if (!TakeSemaphore(suba->sem_id, SUBA_SEMAPHORE_TIMEOUT)) suba 390 core/suba.c suba->allocated_size -= ALLOCSIZE(this_cell->h.size); suba 391 core/suba.c suba->allocated_count--; suba 394 core/suba.c cell* prev_cell = &suba->head; suba 398 core/suba.c prev_cell = check_cell(suba, prev_cell->next, "suba_free", __LINE__); suba 400 core/suba.c cell* next_cell = check_cell(suba, prev_cell->next, "suba_free", __LINE__); suba 404 core/suba.c suba->free_size += this_cell->h.size; suba 410 core/suba.c suba->free_block_count += 1; suba 411 core/suba.c suba->free_size += ALLOCSIZE(this_cell->h.size); suba 418 core/suba.c suba->free_block_count -= 1; suba 419 core/suba.c suba->free_size += sizeof(cell_hdr); suba 423 core/suba.c if ((suba->largest_block != NULL) && (this_cell->h.size > suba->largest_block->h.size)) suba 424 core/suba.c suba->largest_block = this_cell; suba 426 core/suba.c GiveSemaphore(suba->sem_id);