13ff48bf5SDavid du Colombier /* Copyright (C) 1998, 2000 Aladdin Enterprises. All rights reserved.
27dd7cddfSDavid du Colombier
3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier implied.
57dd7cddfSDavid du Colombier
6*593dc095SDavid du Colombier This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier
10*593dc095SDavid du Colombier For more information about licensing, please refer to
11*593dc095SDavid du Colombier http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier San Rafael, CA 94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier
17*593dc095SDavid du Colombier /* $Id: gsmemlok.c,v 1.6 2004/08/04 19:36:12 stefan Exp $ */
187dd7cddfSDavid du Colombier /* Monitor-locked heap memory allocator */
197dd7cddfSDavid du Colombier
207dd7cddfSDavid du Colombier /* Initial version 2/1/98 by John Desrosiers (soho@crl.com) */
217dd7cddfSDavid du Colombier /* Revised 8/6/98 by L. Peter Deutsch (ghost@aladdin.com) for changes */
227dd7cddfSDavid du Colombier /* in memory manager API */
237dd7cddfSDavid du Colombier /* Edited 3/23/1999 by L. Peter Deutsch to remove compiler warnings. */
247dd7cddfSDavid du Colombier
257dd7cddfSDavid du Colombier #include "gx.h"
267dd7cddfSDavid du Colombier #include "gsmemlok.h"
277dd7cddfSDavid du Colombier #include "gserrors.h"
287dd7cddfSDavid du Colombier
297dd7cddfSDavid du Colombier /* Raw memory procedures */
307dd7cddfSDavid du Colombier private gs_memory_proc_alloc_bytes(gs_locked_alloc_bytes_immovable);
317dd7cddfSDavid du Colombier private gs_memory_proc_resize_object(gs_locked_resize_object);
327dd7cddfSDavid du Colombier private gs_memory_proc_free_object(gs_locked_free_object);
337dd7cddfSDavid du Colombier private gs_memory_proc_stable(gs_locked_stable);
347dd7cddfSDavid du Colombier private gs_memory_proc_status(gs_locked_status);
357dd7cddfSDavid du Colombier private gs_memory_proc_free_all(gs_locked_free_all);
367dd7cddfSDavid du Colombier private gs_memory_proc_consolidate_free(gs_locked_consolidate_free);
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier /* Object memory procedures */
397dd7cddfSDavid du Colombier private gs_memory_proc_alloc_bytes(gs_locked_alloc_bytes);
407dd7cddfSDavid du Colombier private gs_memory_proc_alloc_struct(gs_locked_alloc_struct);
417dd7cddfSDavid du Colombier private gs_memory_proc_alloc_struct(gs_locked_alloc_struct_immovable);
427dd7cddfSDavid du Colombier private gs_memory_proc_alloc_byte_array(gs_locked_alloc_byte_array);
437dd7cddfSDavid du Colombier private gs_memory_proc_alloc_byte_array(gs_locked_alloc_byte_array_immovable);
447dd7cddfSDavid du Colombier private gs_memory_proc_alloc_struct_array(gs_locked_alloc_struct_array);
457dd7cddfSDavid du Colombier private gs_memory_proc_alloc_struct_array(gs_locked_alloc_struct_array_immovable);
467dd7cddfSDavid du Colombier private gs_memory_proc_object_size(gs_locked_object_size);
477dd7cddfSDavid du Colombier private gs_memory_proc_object_type(gs_locked_object_type);
487dd7cddfSDavid du Colombier private gs_memory_proc_alloc_string(gs_locked_alloc_string);
497dd7cddfSDavid du Colombier private gs_memory_proc_alloc_string(gs_locked_alloc_string_immovable);
507dd7cddfSDavid du Colombier private gs_memory_proc_resize_string(gs_locked_resize_string);
517dd7cddfSDavid du Colombier private gs_memory_proc_free_string(gs_locked_free_string);
527dd7cddfSDavid du Colombier private gs_memory_proc_register_root(gs_locked_register_root);
537dd7cddfSDavid du Colombier private gs_memory_proc_unregister_root(gs_locked_unregister_root);
547dd7cddfSDavid du Colombier private gs_memory_proc_enable_free(gs_locked_enable_free);
557dd7cddfSDavid du Colombier private const gs_memory_procs_t locked_procs =
567dd7cddfSDavid du Colombier {
577dd7cddfSDavid du Colombier /* Raw memory procedures */
587dd7cddfSDavid du Colombier gs_locked_alloc_bytes_immovable,
597dd7cddfSDavid du Colombier gs_locked_resize_object,
607dd7cddfSDavid du Colombier gs_locked_free_object,
617dd7cddfSDavid du Colombier gs_locked_stable,
627dd7cddfSDavid du Colombier gs_locked_status,
637dd7cddfSDavid du Colombier gs_locked_free_all,
647dd7cddfSDavid du Colombier gs_locked_consolidate_free,
657dd7cddfSDavid du Colombier /* Object memory procedures */
667dd7cddfSDavid du Colombier gs_locked_alloc_bytes,
677dd7cddfSDavid du Colombier gs_locked_alloc_struct,
687dd7cddfSDavid du Colombier gs_locked_alloc_struct_immovable,
697dd7cddfSDavid du Colombier gs_locked_alloc_byte_array,
707dd7cddfSDavid du Colombier gs_locked_alloc_byte_array_immovable,
717dd7cddfSDavid du Colombier gs_locked_alloc_struct_array,
727dd7cddfSDavid du Colombier gs_locked_alloc_struct_array_immovable,
737dd7cddfSDavid du Colombier gs_locked_object_size,
747dd7cddfSDavid du Colombier gs_locked_object_type,
757dd7cddfSDavid du Colombier gs_locked_alloc_string,
767dd7cddfSDavid du Colombier gs_locked_alloc_string_immovable,
777dd7cddfSDavid du Colombier gs_locked_resize_string,
787dd7cddfSDavid du Colombier gs_locked_free_string,
797dd7cddfSDavid du Colombier gs_locked_register_root,
807dd7cddfSDavid du Colombier gs_locked_unregister_root,
817dd7cddfSDavid du Colombier gs_locked_enable_free
827dd7cddfSDavid du Colombier };
837dd7cddfSDavid du Colombier
847dd7cddfSDavid du Colombier /* ---------- Public constructors/destructors ---------- */
857dd7cddfSDavid du Colombier
867dd7cddfSDavid du Colombier /* Initialize a gs_memory_locked_t */
877dd7cddfSDavid du Colombier int /* -ve error code or 0 */
gs_memory_locked_init(gs_memory_locked_t * lmem,gs_memory_t * target)887dd7cddfSDavid du Colombier gs_memory_locked_init(
897dd7cddfSDavid du Colombier gs_memory_locked_t * lmem, /* allocator to init */
907dd7cddfSDavid du Colombier gs_memory_t * target /* allocator to monitor lock */
917dd7cddfSDavid du Colombier )
927dd7cddfSDavid du Colombier {
937dd7cddfSDavid du Colombier lmem->stable_memory = 0;
947dd7cddfSDavid du Colombier lmem->procs = locked_procs;
957dd7cddfSDavid du Colombier
967dd7cddfSDavid du Colombier lmem->target = target;
97*593dc095SDavid du Colombier lmem->gs_lib_ctx = target->gs_lib_ctx;
987dd7cddfSDavid du Colombier
997dd7cddfSDavid du Colombier /* Allocate a monitor to serialize access to structures within */
1007dd7cddfSDavid du Colombier lmem->monitor = gx_monitor_alloc(target);
1017dd7cddfSDavid du Colombier return (lmem->monitor ? 0 : gs_note_error(gs_error_VMerror));
1027dd7cddfSDavid du Colombier }
1037dd7cddfSDavid du Colombier
1047dd7cddfSDavid du Colombier /* Release a locked memory manager. */
1057dd7cddfSDavid du Colombier /* Note that this has no effect on the target. */
1067dd7cddfSDavid du Colombier void
gs_memory_locked_release(gs_memory_locked_t * lmem)1077dd7cddfSDavid du Colombier gs_memory_locked_release(gs_memory_locked_t *lmem)
1087dd7cddfSDavid du Colombier {
1097dd7cddfSDavid du Colombier gs_memory_free_all((gs_memory_t *)lmem, FREE_ALL_STRUCTURES,
1107dd7cddfSDavid du Colombier "gs_memory_locked_release");
1117dd7cddfSDavid du Colombier }
1127dd7cddfSDavid du Colombier
1137dd7cddfSDavid du Colombier /* ---------- Accessors ------------- */
1147dd7cddfSDavid du Colombier
1157dd7cddfSDavid du Colombier /* Retrieve this allocator's target */
1167dd7cddfSDavid du Colombier gs_memory_t *
gs_memory_locked_target(const gs_memory_locked_t * lmem)1177dd7cddfSDavid du Colombier gs_memory_locked_target(const gs_memory_locked_t *lmem)
1187dd7cddfSDavid du Colombier {
1197dd7cddfSDavid du Colombier return lmem->target;
1207dd7cddfSDavid du Colombier }
1217dd7cddfSDavid du Colombier
1227dd7cddfSDavid du Colombier /* -------- Private members just wrap a monitor around a gs_memory_heap --- */
1237dd7cddfSDavid du Colombier
1247dd7cddfSDavid du Colombier /*
1257dd7cddfSDavid du Colombier * Contrary to our usual practice, we don't use BEGIN/END here, because
1267dd7cddfSDavid du Colombier * that causes some compilers to give bogus error messages.
1277dd7cddfSDavid du Colombier */
1287dd7cddfSDavid du Colombier
1297dd7cddfSDavid du Colombier #define DO_MONITORED(call_target)\
1307dd7cddfSDavid du Colombier gs_memory_locked_t * const lmem = (gs_memory_locked_t *)mem;\
1317dd7cddfSDavid du Colombier \
1327dd7cddfSDavid du Colombier gx_monitor_enter(lmem->monitor);\
1337dd7cddfSDavid du Colombier call_target;\
1347dd7cddfSDavid du Colombier gx_monitor_leave(lmem->monitor)
1357dd7cddfSDavid du Colombier
1367dd7cddfSDavid du Colombier #define RETURN_MONITORED(result_type, call_target)\
1377dd7cddfSDavid du Colombier gs_memory_locked_t * const lmem = (gs_memory_locked_t *)mem;\
1387dd7cddfSDavid du Colombier result_type temp;\
1397dd7cddfSDavid du Colombier \
1407dd7cddfSDavid du Colombier gx_monitor_enter(lmem->monitor);\
1417dd7cddfSDavid du Colombier temp = call_target;\
1427dd7cddfSDavid du Colombier gx_monitor_leave(lmem->monitor);\
1437dd7cddfSDavid du Colombier return temp
1447dd7cddfSDavid du Colombier
1457dd7cddfSDavid du Colombier /* Procedures */
1467dd7cddfSDavid du Colombier private void
gs_locked_free_all(gs_memory_t * mem,uint free_mask,client_name_t cname)1477dd7cddfSDavid du Colombier gs_locked_free_all(gs_memory_t * mem, uint free_mask, client_name_t cname)
1487dd7cddfSDavid du Colombier {
1497dd7cddfSDavid du Colombier gs_memory_locked_t * const lmem = (gs_memory_locked_t *)mem;
1507dd7cddfSDavid du Colombier gs_memory_t * const target = lmem->target;
1517dd7cddfSDavid du Colombier
1527dd7cddfSDavid du Colombier /* Only free the structures and the allocator itself. */
1537dd7cddfSDavid du Colombier if (mem->stable_memory) {
1543ff48bf5SDavid du Colombier if (mem->stable_memory != mem)
1557dd7cddfSDavid du Colombier gs_memory_free_all(mem->stable_memory, free_mask, cname);
1567dd7cddfSDavid du Colombier if (free_mask & FREE_ALL_ALLOCATOR)
1577dd7cddfSDavid du Colombier mem->stable_memory = 0;
1587dd7cddfSDavid du Colombier }
1597dd7cddfSDavid du Colombier if (free_mask & FREE_ALL_STRUCTURES) {
1607dd7cddfSDavid du Colombier /*
1617dd7cddfSDavid du Colombier * Check for monitor == 0, in case this is called after a
1627dd7cddfSDavid du Colombier * failure during initialization.
1637dd7cddfSDavid du Colombier */
1647dd7cddfSDavid du Colombier if (lmem->monitor)
1657dd7cddfSDavid du Colombier gx_monitor_free(lmem->monitor);
1667dd7cddfSDavid du Colombier lmem->monitor = 0;
1677dd7cddfSDavid du Colombier lmem->target = 0;
1687dd7cddfSDavid du Colombier }
1697dd7cddfSDavid du Colombier if (free_mask & FREE_ALL_ALLOCATOR)
1707dd7cddfSDavid du Colombier gs_free_object(target, lmem, cname);
1717dd7cddfSDavid du Colombier }
1727dd7cddfSDavid du Colombier private void
gs_locked_consolidate_free(gs_memory_t * mem)1737dd7cddfSDavid du Colombier gs_locked_consolidate_free(gs_memory_t * mem)
1747dd7cddfSDavid du Colombier {
1757dd7cddfSDavid du Colombier DO_MONITORED(
1767dd7cddfSDavid du Colombier (*lmem->target->procs.consolidate_free)(lmem->target)
1777dd7cddfSDavid du Colombier );
1787dd7cddfSDavid du Colombier }
1797dd7cddfSDavid du Colombier private byte *
gs_locked_alloc_bytes(gs_memory_t * mem,uint size,client_name_t cname)1807dd7cddfSDavid du Colombier gs_locked_alloc_bytes(gs_memory_t * mem, uint size, client_name_t cname)
1817dd7cddfSDavid du Colombier {
1827dd7cddfSDavid du Colombier RETURN_MONITORED(
1837dd7cddfSDavid du Colombier byte *,
1847dd7cddfSDavid du Colombier (*lmem->target->procs.alloc_bytes)
1857dd7cddfSDavid du Colombier (lmem->target, size, cname)
1867dd7cddfSDavid du Colombier );
1877dd7cddfSDavid du Colombier }
1887dd7cddfSDavid du Colombier private byte *
gs_locked_alloc_bytes_immovable(gs_memory_t * mem,uint size,client_name_t cname)1897dd7cddfSDavid du Colombier gs_locked_alloc_bytes_immovable(gs_memory_t * mem, uint size,
1907dd7cddfSDavid du Colombier client_name_t cname)
1917dd7cddfSDavid du Colombier {
1927dd7cddfSDavid du Colombier RETURN_MONITORED(
1937dd7cddfSDavid du Colombier byte *,
1947dd7cddfSDavid du Colombier (*lmem->target->procs.alloc_bytes_immovable)
1957dd7cddfSDavid du Colombier (lmem->target, size, cname)
1967dd7cddfSDavid du Colombier );
1977dd7cddfSDavid du Colombier }
1987dd7cddfSDavid du Colombier private void *
gs_locked_alloc_struct(gs_memory_t * mem,gs_memory_type_ptr_t pstype,client_name_t cname)1997dd7cddfSDavid du Colombier gs_locked_alloc_struct(gs_memory_t * mem, gs_memory_type_ptr_t pstype,
2007dd7cddfSDavid du Colombier client_name_t cname)
2017dd7cddfSDavid du Colombier {
2027dd7cddfSDavid du Colombier RETURN_MONITORED(
2037dd7cddfSDavid du Colombier void *,
2047dd7cddfSDavid du Colombier (*lmem->target->procs.alloc_struct)
2057dd7cddfSDavid du Colombier (lmem->target, pstype, cname)
2067dd7cddfSDavid du Colombier );
2077dd7cddfSDavid du Colombier }
2087dd7cddfSDavid du Colombier private void *
gs_locked_alloc_struct_immovable(gs_memory_t * mem,gs_memory_type_ptr_t pstype,client_name_t cname)2097dd7cddfSDavid du Colombier gs_locked_alloc_struct_immovable(gs_memory_t * mem,
2107dd7cddfSDavid du Colombier gs_memory_type_ptr_t pstype, client_name_t cname)
2117dd7cddfSDavid du Colombier {
2127dd7cddfSDavid du Colombier RETURN_MONITORED(
2137dd7cddfSDavid du Colombier void *,
2147dd7cddfSDavid du Colombier (*lmem->target->procs.alloc_struct_immovable)
2157dd7cddfSDavid du Colombier (lmem->target, pstype, cname)
2167dd7cddfSDavid du Colombier );
2177dd7cddfSDavid du Colombier }
2187dd7cddfSDavid du Colombier private byte *
gs_locked_alloc_byte_array(gs_memory_t * mem,uint num_elements,uint elt_size,client_name_t cname)2197dd7cddfSDavid du Colombier gs_locked_alloc_byte_array(gs_memory_t * mem, uint num_elements, uint elt_size,
2207dd7cddfSDavid du Colombier client_name_t cname)
2217dd7cddfSDavid du Colombier {
2227dd7cddfSDavid du Colombier RETURN_MONITORED(
2237dd7cddfSDavid du Colombier byte *,
2247dd7cddfSDavid du Colombier (*lmem->target->procs.alloc_byte_array)
2257dd7cddfSDavid du Colombier (lmem->target, num_elements, elt_size, cname)
2267dd7cddfSDavid du Colombier );
2277dd7cddfSDavid du Colombier }
2287dd7cddfSDavid du Colombier private byte *
gs_locked_alloc_byte_array_immovable(gs_memory_t * mem,uint num_elements,uint elt_size,client_name_t cname)2297dd7cddfSDavid du Colombier gs_locked_alloc_byte_array_immovable(gs_memory_t * mem, uint num_elements,
2307dd7cddfSDavid du Colombier uint elt_size, client_name_t cname)
2317dd7cddfSDavid du Colombier {
2327dd7cddfSDavid du Colombier RETURN_MONITORED(
2337dd7cddfSDavid du Colombier byte *,
2347dd7cddfSDavid du Colombier (*lmem->target->procs.alloc_byte_array_immovable)
2357dd7cddfSDavid du Colombier (lmem->target, num_elements, elt_size, cname)
2367dd7cddfSDavid du Colombier );
2377dd7cddfSDavid du Colombier }
2387dd7cddfSDavid du Colombier private void *
gs_locked_alloc_struct_array(gs_memory_t * mem,uint num_elements,gs_memory_type_ptr_t pstype,client_name_t cname)2397dd7cddfSDavid du Colombier gs_locked_alloc_struct_array(gs_memory_t * mem, uint num_elements,
2407dd7cddfSDavid du Colombier gs_memory_type_ptr_t pstype, client_name_t cname)
2417dd7cddfSDavid du Colombier {
2427dd7cddfSDavid du Colombier RETURN_MONITORED(
2437dd7cddfSDavid du Colombier void *,
2447dd7cddfSDavid du Colombier (*lmem->target->procs.alloc_struct_array)
2457dd7cddfSDavid du Colombier (lmem->target, num_elements, pstype, cname)
2467dd7cddfSDavid du Colombier );
2477dd7cddfSDavid du Colombier }
2487dd7cddfSDavid du Colombier private void *
gs_locked_alloc_struct_array_immovable(gs_memory_t * mem,uint num_elements,gs_memory_type_ptr_t pstype,client_name_t cname)2497dd7cddfSDavid du Colombier gs_locked_alloc_struct_array_immovable(gs_memory_t * mem, uint num_elements,
2507dd7cddfSDavid du Colombier gs_memory_type_ptr_t pstype, client_name_t cname)
2517dd7cddfSDavid du Colombier {
2527dd7cddfSDavid du Colombier RETURN_MONITORED(
2537dd7cddfSDavid du Colombier void *,
2547dd7cddfSDavid du Colombier (*lmem->target->procs.alloc_struct_array_immovable)
2557dd7cddfSDavid du Colombier (lmem->target, num_elements, pstype, cname)
2567dd7cddfSDavid du Colombier );
2577dd7cddfSDavid du Colombier }
2587dd7cddfSDavid du Colombier private void *
gs_locked_resize_object(gs_memory_t * mem,void * obj,uint new_num_elements,client_name_t cname)2597dd7cddfSDavid du Colombier gs_locked_resize_object(gs_memory_t * mem, void *obj, uint new_num_elements,
2607dd7cddfSDavid du Colombier client_name_t cname)
2617dd7cddfSDavid du Colombier {
2627dd7cddfSDavid du Colombier RETURN_MONITORED(
2637dd7cddfSDavid du Colombier void *,
2647dd7cddfSDavid du Colombier (*lmem->target->procs.resize_object)
2657dd7cddfSDavid du Colombier (lmem->target, obj, new_num_elements, cname)
2667dd7cddfSDavid du Colombier );
2677dd7cddfSDavid du Colombier }
2687dd7cddfSDavid du Colombier private uint
gs_locked_object_size(gs_memory_t * mem,const void * ptr)2697dd7cddfSDavid du Colombier gs_locked_object_size(gs_memory_t * mem, const void *ptr)
2707dd7cddfSDavid du Colombier {
2717dd7cddfSDavid du Colombier RETURN_MONITORED(
2727dd7cddfSDavid du Colombier uint,
2737dd7cddfSDavid du Colombier (*lmem->target->procs.object_size)
2747dd7cddfSDavid du Colombier (lmem->target, ptr)
2757dd7cddfSDavid du Colombier );
2767dd7cddfSDavid du Colombier }
2777dd7cddfSDavid du Colombier private gs_memory_type_ptr_t
gs_locked_object_type(gs_memory_t * mem,const void * ptr)2787dd7cddfSDavid du Colombier gs_locked_object_type(gs_memory_t * mem, const void *ptr)
2797dd7cddfSDavid du Colombier {
2807dd7cddfSDavid du Colombier RETURN_MONITORED(
2817dd7cddfSDavid du Colombier gs_memory_type_ptr_t,
2827dd7cddfSDavid du Colombier (*lmem->target->procs.object_type)
2837dd7cddfSDavid du Colombier (lmem->target, ptr)
2847dd7cddfSDavid du Colombier );
2857dd7cddfSDavid du Colombier }
2867dd7cddfSDavid du Colombier private void
gs_locked_free_object(gs_memory_t * mem,void * ptr,client_name_t cname)2877dd7cddfSDavid du Colombier gs_locked_free_object(gs_memory_t * mem, void *ptr, client_name_t cname)
2887dd7cddfSDavid du Colombier {
2897dd7cddfSDavid du Colombier DO_MONITORED(
2907dd7cddfSDavid du Colombier (*lmem->target->procs.free_object)
2917dd7cddfSDavid du Colombier (lmem->target, ptr, cname)
2927dd7cddfSDavid du Colombier );
2937dd7cddfSDavid du Colombier }
2947dd7cddfSDavid du Colombier private byte *
gs_locked_alloc_string(gs_memory_t * mem,uint nbytes,client_name_t cname)2957dd7cddfSDavid du Colombier gs_locked_alloc_string(gs_memory_t * mem, uint nbytes, client_name_t cname)
2967dd7cddfSDavid du Colombier {
2977dd7cddfSDavid du Colombier RETURN_MONITORED(
2987dd7cddfSDavid du Colombier byte *,
2997dd7cddfSDavid du Colombier (*lmem->target->procs.alloc_string)
3007dd7cddfSDavid du Colombier (lmem->target, nbytes, cname)
3017dd7cddfSDavid du Colombier );
3027dd7cddfSDavid du Colombier }
3037dd7cddfSDavid du Colombier private byte *
gs_locked_alloc_string_immovable(gs_memory_t * mem,uint nbytes,client_name_t cname)3047dd7cddfSDavid du Colombier gs_locked_alloc_string_immovable(gs_memory_t * mem, uint nbytes,
3057dd7cddfSDavid du Colombier client_name_t cname)
3067dd7cddfSDavid du Colombier {
3077dd7cddfSDavid du Colombier RETURN_MONITORED(
3087dd7cddfSDavid du Colombier byte *,
3097dd7cddfSDavid du Colombier (*lmem->target->procs.alloc_string_immovable)
3107dd7cddfSDavid du Colombier (lmem->target, nbytes, cname)
3117dd7cddfSDavid du Colombier );
3127dd7cddfSDavid du Colombier }
3137dd7cddfSDavid du Colombier private byte *
gs_locked_resize_string(gs_memory_t * mem,byte * data,uint old_num,uint new_num,client_name_t cname)3147dd7cddfSDavid du Colombier gs_locked_resize_string(gs_memory_t * mem, byte * data, uint old_num,
3157dd7cddfSDavid du Colombier uint new_num,
3167dd7cddfSDavid du Colombier client_name_t cname)
3177dd7cddfSDavid du Colombier {
3187dd7cddfSDavid du Colombier RETURN_MONITORED(
3197dd7cddfSDavid du Colombier byte *,
3207dd7cddfSDavid du Colombier (*lmem->target->procs.resize_string)
3217dd7cddfSDavid du Colombier (lmem->target, data, old_num, new_num, cname)
3227dd7cddfSDavid du Colombier );
3237dd7cddfSDavid du Colombier }
3247dd7cddfSDavid du Colombier private void
gs_locked_free_string(gs_memory_t * mem,byte * data,uint nbytes,client_name_t cname)3257dd7cddfSDavid du Colombier gs_locked_free_string(gs_memory_t * mem, byte * data, uint nbytes,
3267dd7cddfSDavid du Colombier client_name_t cname)
3277dd7cddfSDavid du Colombier {
3287dd7cddfSDavid du Colombier DO_MONITORED(
3297dd7cddfSDavid du Colombier (*lmem->target->procs.free_string)
3307dd7cddfSDavid du Colombier (lmem->target, data, nbytes, cname)
3317dd7cddfSDavid du Colombier );
3327dd7cddfSDavid du Colombier }
3337dd7cddfSDavid du Colombier private int
gs_locked_register_root(gs_memory_t * mem,gs_gc_root_t * rp,gs_ptr_type_t ptype,void ** up,client_name_t cname)3347dd7cddfSDavid du Colombier gs_locked_register_root(gs_memory_t * mem, gs_gc_root_t * rp,
3357dd7cddfSDavid du Colombier gs_ptr_type_t ptype, void **up, client_name_t cname)
3367dd7cddfSDavid du Colombier {
3377dd7cddfSDavid du Colombier RETURN_MONITORED(
3387dd7cddfSDavid du Colombier int,
3397dd7cddfSDavid du Colombier (*lmem->target->procs.register_root)
3407dd7cddfSDavid du Colombier (lmem->target, rp, ptype, up, cname)
3417dd7cddfSDavid du Colombier );
3427dd7cddfSDavid du Colombier }
3437dd7cddfSDavid du Colombier private void
gs_locked_unregister_root(gs_memory_t * mem,gs_gc_root_t * rp,client_name_t cname)3447dd7cddfSDavid du Colombier gs_locked_unregister_root(gs_memory_t * mem, gs_gc_root_t * rp,
3457dd7cddfSDavid du Colombier client_name_t cname)
3467dd7cddfSDavid du Colombier {
3477dd7cddfSDavid du Colombier DO_MONITORED(
3487dd7cddfSDavid du Colombier (*lmem->target->procs.unregister_root)
3497dd7cddfSDavid du Colombier (lmem->target, rp, cname)
3507dd7cddfSDavid du Colombier );
3517dd7cddfSDavid du Colombier }
3527dd7cddfSDavid du Colombier private gs_memory_t *
gs_locked_stable(gs_memory_t * mem)3537dd7cddfSDavid du Colombier gs_locked_stable(gs_memory_t * mem)
3547dd7cddfSDavid du Colombier {
3557dd7cddfSDavid du Colombier if (!mem->stable_memory) {
3567dd7cddfSDavid du Colombier gs_memory_locked_t * const lmem = (gs_memory_locked_t *)mem;
3577dd7cddfSDavid du Colombier gs_memory_t *stable;
3587dd7cddfSDavid du Colombier
3597dd7cddfSDavid du Colombier gx_monitor_enter(lmem->monitor);
3607dd7cddfSDavid du Colombier stable = gs_memory_stable(lmem->target);
3617dd7cddfSDavid du Colombier if (stable == lmem->target)
3627dd7cddfSDavid du Colombier mem->stable_memory = mem;
3637dd7cddfSDavid du Colombier else {
3647dd7cddfSDavid du Colombier gs_memory_locked_t *locked_stable = (gs_memory_locked_t *)
3657dd7cddfSDavid du Colombier gs_alloc_bytes(stable, sizeof(*lmem), "gs_locked_stable");
3667dd7cddfSDavid du Colombier
3677dd7cddfSDavid du Colombier if (locked_stable) {
3687dd7cddfSDavid du Colombier int code = gs_memory_locked_init(locked_stable, stable);
3697dd7cddfSDavid du Colombier
3707dd7cddfSDavid du Colombier if (code < 0)
3717dd7cddfSDavid du Colombier gs_free_object(stable, locked_stable, "gs_locked_stable");
3727dd7cddfSDavid du Colombier else
3737dd7cddfSDavid du Colombier mem->stable_memory = (gs_memory_t *)locked_stable;
3747dd7cddfSDavid du Colombier }
3757dd7cddfSDavid du Colombier }
3767dd7cddfSDavid du Colombier gx_monitor_leave(lmem->monitor);
3777dd7cddfSDavid du Colombier }
3787dd7cddfSDavid du Colombier return mem->stable_memory;
3797dd7cddfSDavid du Colombier }
3807dd7cddfSDavid du Colombier private void
gs_locked_status(gs_memory_t * mem,gs_memory_status_t * pstat)3817dd7cddfSDavid du Colombier gs_locked_status(gs_memory_t * mem, gs_memory_status_t * pstat)
3827dd7cddfSDavid du Colombier {
3837dd7cddfSDavid du Colombier DO_MONITORED(
3847dd7cddfSDavid du Colombier (*lmem->target->procs.status)(lmem->target, pstat)
3857dd7cddfSDavid du Colombier );
3867dd7cddfSDavid du Colombier }
3877dd7cddfSDavid du Colombier private void
gs_locked_enable_free(gs_memory_t * mem,bool enable)3887dd7cddfSDavid du Colombier gs_locked_enable_free(gs_memory_t * mem, bool enable)
3897dd7cddfSDavid du Colombier {
3907dd7cddfSDavid du Colombier DO_MONITORED(
3917dd7cddfSDavid du Colombier (*lmem->target->procs.enable_free)(lmem->target, enable)
3927dd7cddfSDavid du Colombier );
3937dd7cddfSDavid du Colombier }
394