192
197
bp->cname = cname;
193
198
mmem->allocated = bp;
194
199
ptr = (byte *) (bp + 1);
195
gs_alloc_fill(ptr, gs_alloc_fill_alloc, size);
196
200
mmem->used += size + sizeof(gs_malloc_block_t);
197
201
if (mmem->used > mmem->max_used)
198
202
mmem->max_used = mmem->used;
206
gx_monitor_leave(mmem->monitor); /* Done with exclusive access */
207
/* We don't want to 'fill' under mutex to keep the window smaller */
209
gs_alloc_fill(ptr, gs_alloc_fill_alloc, size);
202
211
if (gs_debug_c('a') || msg != ok_msg)
203
212
dlprintf4("[a+]gs_malloc(%s)(%u) = 0x%lx: %s\n",
403
430
gs_heap_free_all(gs_memory_t * mem, uint free_mask, client_name_t cname)
405
432
gs_malloc_memory_t *const mmem = (gs_malloc_memory_t *) mem;
433
gx_monitor_t *mon = mmem->monitor;
436
* We don't perform locking during this process since the 'monitor'
437
* is contained in this allocator, and will get freed along the way.
438
* It is only called at exit, and there better not be any threads
439
* accessing this allocator.
441
mmem->monitor = NULL; /* delete reference to this monitor */
442
gx_monitor_free(mon); /* free the monitor */
407
443
if (free_mask & FREE_ALL_DATA) {
408
444
gs_malloc_block_t *bp = mmem->allocated;
409
445
gs_malloc_block_t *np;
428
464
gs_malloc_wrap(gs_memory_t **wrapped, gs_malloc_memory_t *contents)
430
#ifdef USE_RETRY_AND_LOCKING_MEMORY_WRAPPERS
431
gs_memory_t *cmem = (gs_memory_t *)contents;
432
gs_memory_locked_t *lmem = (gs_memory_locked_t *)
433
gs_alloc_bytes_immovable(cmem, sizeof(gs_memory_locked_t),
434
"gs_malloc_wrap(locked)");
435
gs_memory_retrying_t *rmem;
439
return_error(gs_error_VMerror);
440
code = gs_memory_locked_init(lmem, cmem);
442
gs_free_object(cmem, lmem, "gs_malloc_wrap(locked)");
446
rmem = (gs_memory_retrying_t *)
447
gs_alloc_bytes_immovable((gs_memory_t *)lmem,
448
sizeof(gs_memory_retrying_t),
449
"gs_malloc_wrap(retrying)");
451
gs_memory_locked_release(lmem);
452
gs_free_object(cmem, lmem, "gs_malloc_wrap(locked)");
453
return_error(gs_error_VMerror);
455
code = gs_memory_retrying_init(rmem, (gs_memory_t *)lmem);
457
gs_free_object((gs_memory_t *)lmem, rmem, "gs_malloc_wrap(retrying)");
458
gs_memory_locked_release(lmem);
459
gs_free_object(cmem, lmem, "gs_malloc_wrap(locked)");
463
*wrapped = (gs_memory_t *)rmem;
466
# ifdef USE_RETRY_MEMORY_WRAPPER
468
* This is deprecated since 'retry' for clist reversion/cycling
469
* will ONLY work for monochrome, simple PS or PCL, not for a
470
* color device and not for PDF or XPS with transparency
473
gs_memory_retrying_t *rmem;
474
rmem = (gs_memory_retrying_t *)
475
gs_alloc_bytes_immovable((gs_memory_t *)lmem,
476
sizeof(gs_memory_retrying_t),
477
"gs_malloc_wrap(retrying)");
479
gs_memory_locked_release(lmem);
480
gs_free_object(cmem, lmem, "gs_malloc_wrap(locked)");
481
return_error(gs_error_VMerror);
483
code = gs_memory_retrying_init(rmem, (gs_memory_t *)lmem);
485
gs_free_object((gs_memory_t *)lmem, rmem, "gs_malloc_wrap(retrying)");
486
gs_memory_locked_release(lmem);
487
gs_free_object(cmem, lmem, "gs_malloc_wrap(locked)");
491
*wrapped = (gs_memory_t *)rmem;
493
# endif /* retrying */
469
498
gs_malloc_memory_t *
470
499
gs_malloc_wrapped_contents(gs_memory_t *wrapped)
472
#ifdef USE_RETRY_AND_LOCKING_MEMORY_WRAPPERS
501
#ifdef USE_RETRY_MEMORY_WRAPPER
473
502
gs_memory_retrying_t *rmem = (gs_memory_retrying_t *)wrapped;
474
gs_memory_locked_t *lmem =
475
(gs_memory_locked_t *)gs_memory_retrying_target(rmem);
477
return (gs_malloc_memory_t *)gs_memory_locked_target(lmem);
478
return (gs_malloc_memory_t *) wrapped;
504
return (gs_malloc_memory_t *)gs_memory_retrying_target(rmem);
480
506
return (gs_malloc_memory_t *)wrapped;
507
#endif /* retrying */
484
510
/* Free the wrapper, and return the wrapped contents. */
485
511
gs_malloc_memory_t *
486
512
gs_malloc_unwrap(gs_memory_t *wrapped)
488
#ifdef USE_RETRY_AND_LOCKING_MEMORY_WRAPPERS
514
#ifdef USE_RETRY_MEMORY_WRAPPER
489
515
gs_memory_retrying_t *rmem = (gs_memory_retrying_t *)wrapped;
490
gs_memory_locked_t *lmem =
491
(gs_memory_locked_t *)gs_memory_retrying_target(rmem);
492
gs_memory_t *contents = gs_memory_locked_target(lmem);
516
gs_memory_t *contents = gs_memory_retrying_target(rmem);
494
gs_free_object((gs_memory_t *)lmem, rmem, "gs_malloc_unwrap(retrying)");
495
gs_memory_locked_release(lmem);
496
gs_free_object(contents, lmem, "gs_malloc_unwrap(locked)");
518
gs_free_object(wrapped rmem, "gs_malloc_unwrap(retrying)");
497
519
return (gs_malloc_memory_t *)contents;
499
521
return (gs_malloc_memory_t *)wrapped;