00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 # ifndef GC_PRIVATE_H
00013 # include "gc_private.h"
00014 # endif
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 # define GC_MALLOC_WORDS(result,n) \
00030 { \
00031 register ptr_t op; \
00032 register ptr_t *opp; \
00033 DCL_LOCK_STATE; \
00034 \
00035 opp = &(GC_objfreelist[n]); \
00036 FASTLOCK(); \
00037 if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) { \
00038 FASTUNLOCK(); \
00039 (result) = GC_generic_malloc_words_small((n), NORMAL); \
00040 } else { \
00041 *opp = obj_link(op); \
00042 obj_link(op) = 0; \
00043 GC_words_allocd += (n); \
00044 FASTUNLOCK(); \
00045 (result) = (extern_ptr_t) op; \
00046 } \
00047 }
00048
00049
00050
00051 # define GC_MALLOC_ATOMIC_WORDS(result,n) \
00052 { \
00053 register ptr_t op; \
00054 register ptr_t *opp; \
00055 DCL_LOCK_STATE; \
00056 \
00057 opp = &(GC_aobjfreelist[n]); \
00058 FASTLOCK(); \
00059 if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) { \
00060 FASTUNLOCK(); \
00061 (result) = GC_generic_malloc_words_small((n), PTRFREE); \
00062 } else { \
00063 *opp = obj_link(op); \
00064 obj_link(op) = 0; \
00065 GC_words_allocd += (n); \
00066 FASTUNLOCK(); \
00067 (result) = (extern_ptr_t) op; \
00068 } \
00069 }
00070
00071
00072 # define GC_CONS(result, first, second) \
00073 { \
00074 register ptr_t op; \
00075 register ptr_t *opp; \
00076 DCL_LOCK_STATE; \
00077 \
00078 opp = &(GC_objfreelist[2]); \
00079 FASTLOCK(); \
00080 if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) { \
00081 FASTUNLOCK(); \
00082 op = GC_generic_malloc_words_small(2, NORMAL); \
00083 } else { \
00084 *opp = obj_link(op); \
00085 GC_words_allocd += 2; \
00086 FASTUNLOCK(); \
00087 } \
00088 ((word *)op)[0] = (word)(first); \
00089 ((word *)op)[1] = (word)(second); \
00090 (result) = (extern_ptr_t) op; \
00091 }