diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2011-07-26 20:09:54 +0400 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2011-07-26 20:09:54 +0400 |
commit | e35a4171fe47dfbf847e08988ea6cec4dfc8d124 (patch) | |
tree | 25f3501669fbf24a4b370c4f8b0c0701b1da4062 /gcj_mlc.c | |
parent | ffa0c9ea38b3dd87e91b5ed2118c74002fed6782 (diff) | |
download | bdwgc-e35a4171fe47dfbf847e08988ea6cec4dfc8d124.tar.gz |
gc7.0alpha1 tarball importgc7_0alpha1
Diffstat (limited to 'gcj_mlc.c')
-rw-r--r-- | gcj_mlc.c | 136 |
1 files changed, 29 insertions, 107 deletions
@@ -1,6 +1,6 @@ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. - * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved. + * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. @@ -58,20 +58,16 @@ void GC_init_gcj_malloc(int mp_index, void * /* really GC_mark_proc */mp) DCL_LOCK_STATE; GC_init(); /* In case it's not already done. */ - DISABLE_SIGNALS(); LOCK(); if (GC_gcj_malloc_initialized) { UNLOCK(); - ENABLE_SIGNALS(); return; } GC_gcj_malloc_initialized = TRUE; ignore_gcj_info = (0 != GETENV("GC_IGNORE_GCJ_INFO")); -# ifdef CONDPRINT - if (GC_print_stats && ignore_gcj_info) { - GC_printf0("Gcj-style type information is disabled!\n"); - } -# endif + if (GC_print_stats && ignore_gcj_info) { + GC_log_printf("Gcj-style type information is disabled!\n"); + } GC_ASSERT(GC_mark_procs[mp_index] == (GC_mark_proc)0); /* unused */ GC_mark_procs[mp_index] = (GC_mark_proc)mp; if (mp_index >= GC_n_mark_procs) ABORT("GC_init_gcj_malloc: bad index"); @@ -103,16 +99,15 @@ void GC_init_gcj_malloc(int mp_index, void * /* really GC_mark_proc */mp) FALSE, TRUE); } UNLOCK(); - ENABLE_SIGNALS(); } -ptr_t GC_clear_stack(); +void * GC_clear_stack(void *); #define GENERAL_MALLOC(lb,k) \ - (GC_PTR)GC_clear_stack(GC_generic_malloc_inner((word)lb, k)) + GC_clear_stack(GC_generic_malloc_inner((word)lb, k)) #define GENERAL_MALLOC_IOP(lb,k) \ - (GC_PTR)GC_clear_stack(GC_generic_malloc_inner_ignore_off_page(lb, k)) + GC_clear_stack(GC_generic_malloc_inner_ignore_off_page(lb, k)) /* We need a mechanism to release the lock and invoke finalizers. */ /* We don't really have an opportunity to do this on a rarely executed */ @@ -138,18 +133,14 @@ static void maybe_finalize() /* This adds a byte at the end of the object if GC_malloc would.*/ void * GC_gcj_malloc(size_t lb, void * ptr_to_struct_containing_descr) { -register ptr_t op; -register ptr_t * opp; -register word lw; -DCL_LOCK_STATE; + ptr_t op; + ptr_t * opp; + word lg; + DCL_LOCK_STATE; - if( EXPECT(SMALL_OBJ(lb), 1) ) { -# ifdef MERGE_SIZES - lw = GC_size_map[lb]; -# else - lw = ALIGNED_WORDS(lb); -# endif - opp = &(GC_gcjobjfreelist[lw]); + if(SMALL_OBJ(lb)) { + lg = GC_size_map[lb]; + opp = &(GC_gcjobjfreelist[lg]); LOCK(); op = *opp; if(EXPECT(op == 0, 0)) { @@ -159,12 +150,10 @@ DCL_LOCK_STATE; UNLOCK(); return(GC_oom_fn(lb)); } -# ifdef MERGE_SIZES - lw = GC_size_map[lb]; /* May have been uninitialized. */ -# endif + lw = GC_size_map[lb]; /* May have been uninitialized. */ } else { *opp = obj_link(op); - GC_words_allocd += lw; + GC_bytes_allocd += GRANULES_TO_BYTES(lg); } *(void **)op = ptr_to_struct_containing_descr; GC_ASSERT(((void **)op)[1] == 0); @@ -180,15 +169,15 @@ DCL_LOCK_STATE; *(void **)op = ptr_to_struct_containing_descr; UNLOCK(); } - return((GC_PTR) op); + return((void *) op); } /* Similar to GC_gcj_malloc, but add debug info. This is allocated */ /* with GC_gcj_debug_kind. */ -GC_PTR GC_debug_gcj_malloc(size_t lb, void * ptr_to_struct_containing_descr, +void * GC_debug_gcj_malloc(size_t lb, void * ptr_to_struct_containing_descr, GC_EXTRA_PARAMS) { - GC_PTR result; + void * result; /* We're careful to avoid extra calls, which could */ /* confuse the backtrace. */ @@ -213,92 +202,25 @@ GC_PTR GC_debug_gcj_malloc(size_t lb, void * ptr_to_struct_containing_descr, return (GC_store_debug_info(result, (word)lb, s, (word)i)); } -/* Similar to GC_gcj_malloc, but the size is in words, and we don't */ -/* adjust it. The size is assumed to be such that it can be */ -/* allocated as a small object. */ -void * GC_gcj_fast_malloc(size_t lw, void * ptr_to_struct_containing_descr) -{ -ptr_t op; -ptr_t * opp; -DCL_LOCK_STATE; - - opp = &(GC_gcjobjfreelist[lw]); - LOCK(); - op = *opp; - if( EXPECT(op == 0, 0) ) { - maybe_finalize(); - op = (ptr_t)GC_clear_stack( - GC_generic_malloc_words_small_inner(lw, GC_gcj_kind)); - if (0 == op) { - UNLOCK(); - return GC_oom_fn(WORDS_TO_BYTES(lw)); - } - } else { - *opp = obj_link(op); - GC_words_allocd += lw; - } - *(void **)op = ptr_to_struct_containing_descr; - UNLOCK(); - return((GC_PTR) op); -} - -/* And a debugging version of the above: */ -void * GC_debug_gcj_fast_malloc(size_t lw, - void * ptr_to_struct_containing_descr, - GC_EXTRA_PARAMS) -{ - GC_PTR result; - size_t lb = WORDS_TO_BYTES(lw); - - /* We clone the code from GC_debug_gcj_malloc, so that we */ - /* dont end up with extra frames on the stack, which could */ - /* confuse the backtrace. */ - LOCK(); - maybe_finalize(); - result = GC_generic_malloc_inner(lb + DEBUG_BYTES, GC_gcj_debug_kind); - if (result == 0) { - UNLOCK(); - GC_err_printf2("GC_debug_gcj_fast_malloc(%ld, 0x%lx) returning NIL (", - (unsigned long) lw, - (unsigned long) ptr_to_struct_containing_descr); - GC_err_puts(s); - GC_err_printf1(":%ld)\n", (unsigned long)i); - return GC_oom_fn(WORDS_TO_BYTES(lw)); - } - *((void **)((ptr_t)result + sizeof(oh))) = ptr_to_struct_containing_descr; - UNLOCK(); - if (!GC_debugging_started) { - GC_start_debugging(); - } - ADD_CALL_CHAIN(result, ra); - return (GC_store_debug_info(result, (word)lb, s, (word)i)); -} - void * GC_gcj_malloc_ignore_off_page(size_t lb, void * ptr_to_struct_containing_descr) { -register ptr_t op; -register ptr_t * opp; -register word lw; -DCL_LOCK_STATE; + ptr_t op; + ptr_t * opp; + word lg; + DCL_LOCK_STATE; - if( SMALL_OBJ(lb) ) { -# ifdef MERGE_SIZES - lw = GC_size_map[lb]; -# else - lw = ALIGNED_WORDS(lb); -# endif - opp = &(GC_gcjobjfreelist[lw]); + if(SMALL_OBJ(lb)) { + lg = GC_size_map[lb]; + opp = &(GC_gcjobjfreelist[lg]); LOCK(); if( (op = *opp) == 0 ) { maybe_finalize(); op = (ptr_t)GENERAL_MALLOC_IOP(lb, GC_gcj_kind); -# ifdef MERGE_SIZES - lw = GC_size_map[lb]; /* May have been uninitialized. */ -# endif + lg = GC_size_map[lb]; /* May have been uninitialized. */ } else { *opp = obj_link(op); - GC_words_allocd += lw; + GC_bytes_allocd += GRANULES_TO_BYTES(lg); } *(void **)op = ptr_to_struct_containing_descr; UNLOCK(); @@ -311,7 +233,7 @@ DCL_LOCK_STATE; } UNLOCK(); } - return((GC_PTR) op); + return((void *) op); } #else |