Changeset 3461 for trunk/src/kash/memalloc.c
- Timestamp:
- Sep 15, 2020, 2:55:26 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kash/memalloc.c
r3458 r3461 371 371 TRACE2((NULL, "pstackrelease: %p - %u refs (%s)\n", pst, refs, caller)); K_NOREF(caller); 372 372 if (refs == 0) { 373 shinstance * const psh = shthread_get_shell();374 373 struct stack_block *top; 375 374 while ((top = pst->top) != &pst->first) … … 382 381 pst->nextbyte = NULL; 383 382 pst->top = NULL; 384 /** @todo push into an alloc cache rather than freeing it */ 385 sh_free(psh, pst); 383 384 if (!psh->freepstack) 385 psh->freepstack = pst; 386 else 387 sh_free(psh, pst); 386 388 } 387 389 } else … … 395 397 while (target < psh->pstacksize) { 396 398 unsigned idx = --psh->pstacksize; 397 pstack_block *ps k= psh->pstack[idx];399 pstack_block *pst = psh->pstack[idx]; 398 400 psh->pstack[idx] = NULL; 399 if (psh->curpstack == psk) 400 psh->curpstack = idx > 0 ? psh->pstack[idx - 1] : NULL; 401 pstackrelease(psh, psk, "popstackmark"); 401 if (psh->curpstack == pst) { 402 pstack_block *pstnext; 403 if (idx <= 0 || (pstnext = psh->pstack[idx - 1])->done) 404 psh->curpstack = NULL; 405 else 406 psh->curpstack = pstnext; 407 } 408 pstackrelease(psh, pst, "popstackmark"); 402 409 } 403 410 … … 454 461 * Allocate and initialize it. 455 462 */ 456 pst = (pstack_block *)ckmalloc(psh, blocksize); 463 pst = psh->freepstack; 464 if (pst) 465 psh->freepstack = NULL; 466 else 467 pst = (pstack_block *)ckmalloc(psh, blocksize); 457 468 pst->nextbyte = &pst->first.space[0]; 458 469 pst->avail = blocksize - offsetof(pstack_block, first.space); 459 470 pst->topsize = blocksize - offsetof(pstack_block, first.space); 471 pst->top = &pst->first; 460 472 pst->strleft = 0; 461 pst->top = &pst->first;462 473 pst->allocations = 0; 463 474 pst->bytesalloced = 0; … … 468 479 pst->fragmentation = 0; 469 480 pst->refs = 1; 470 pst-> padding = 42;481 pst->done = K_FALSE; 471 482 pst->first.prev = NULL; 472 483 … … 480 491 TRACE2((psh, "pstackallocpush: %p - entry %u\n", pst, psh->pstacksize - 1)); 481 492 return pst; 493 } 494 495 /** 496 * Marks the block as done, preventing it from being marked current again. 497 */ 498 void pstackmarkdone(pstack_block *pst) 499 { 500 pst->done = K_TRUE; 482 501 } 483 502
Note:
See TracChangeset
for help on using the changeset viewer.