diff options
Diffstat (limited to 'erts/emulator/beam/erl_gc.h')
-rw-r--r-- | erts/emulator/beam/erl_gc.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_gc.h b/erts/emulator/beam/erl_gc.h new file mode 100644 index 0000000000..af55b6363f --- /dev/null +++ b/erts/emulator/beam/erl_gc.h @@ -0,0 +1,72 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2007-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +#ifndef __ERL_GC_H__ +#define __ERL_GC_H__ + +/* GC declarations shared by beam/erl_gc.c and hipe/hipe_gc.c */ + +#ifdef DEBUG +# define HARDDEBUG 1 +#endif + +#define IS_MOVED(x) (!is_header((x))) + +#define MOVE_CONS(PTR,CAR,HTOP,ORIG) \ +do { \ + Eterm gval; \ + \ + HTOP[0] = CAR; /* copy car */ \ + HTOP[1] = PTR[1]; /* copy cdr */ \ + gval = make_list(HTOP); /* new location */ \ + *ORIG = gval; /* redirect original reference */ \ + PTR[0] = THE_NON_VALUE; /* store forwarding indicator */ \ + PTR[1] = gval; /* store forwarding address */ \ + HTOP += 2; /* update tospace htop */ \ +} while(0) + +#define MOVE_BOXED(PTR,HDR,HTOP,ORIG) \ +do { \ + Eterm gval; \ + Sint nelts; \ + \ + ASSERT(is_header(HDR)); \ + gval = make_boxed(HTOP); \ + *ORIG = gval; \ + *HTOP++ = HDR; \ + *PTR++ = gval; \ + nelts = header_arity(HDR); \ + switch ((HDR) & _HEADER_SUBTAG_MASK) { \ + case SUB_BINARY_SUBTAG: nelts++; break; \ + case FUN_SUBTAG: nelts+=((ErlFunThing*)(PTR-1))->num_free+1; break; \ + } \ + while (nelts--) \ + *HTOP++ = *PTR++; \ +} while(0) + +#define in_area(ptr,start,nbytes) \ + ((unsigned long)((char*)(ptr) - (char*)(start)) < (nbytes)) + +extern Uint erts_test_long_gc_sleep; + +#if defined(DEBUG) || defined(ERTS_OFFHEAP_DEBUG) +int within(Eterm *ptr, Process *p); +#endif + +#endif /* __ERL_GC_H__ */ |