diff options
Diffstat (limited to 'erts/emulator/beam/global.h')
-rw-r--r-- | erts/emulator/beam/global.h | 102 |
1 files changed, 72 insertions, 30 deletions
diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h index 1b64e23174..cab249a53f 100644 --- a/erts/emulator/beam/global.h +++ b/erts/emulator/beam/global.h @@ -1,19 +1,19 @@ /* * %CopyrightBegin% - * - * Copyright Ericsson AB 1996-2009. All Rights Reserved. - * + * + * Copyright Ericsson AB 1996-2010. 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% */ @@ -21,6 +21,7 @@ #define __GLOBAL_H__ #include "sys.h" +#include <stddef.h> /* offsetof() */ #include "erl_alloc.h" #include "erl_vm.h" #include "erl_node_container_utils.h" @@ -75,18 +76,29 @@ typedef struct line_buf { /* Buffer used in line oriented I/O */ The rest is the overflow buffer. */ } LineBuf; +/* Temporary object header, auto-deallocated when NIF returns. */ +struct enif_tmp_obj_t { + struct enif_tmp_obj_t* next; + void (*dtor)(struct enif_tmp_obj_t*); + /*char data[];*/ +}; struct enif_environment_t /* ErlNifEnv */ { - void* nif_data; + struct erl_module_nif* mod_nif; Process* proc; Eterm* hp; Eterm* hp_end; - unsigned heap_frag_sz; + ErlHeapFragment* heap_frag; int fpe_was_unmasked; + struct enif_tmp_obj_t* tmp_obj_list; }; -extern void erts_pre_nif(struct enif_environment_t*, Process*, void* nif_data); +extern void erts_pre_nif(struct enif_environment_t*, Process*, + struct erl_module_nif*); extern void erts_post_nif(struct enif_environment_t* env); -extern Eterm erts_nif_taints(Process* p); +extern Eterm erts_nif_taints(Process* p); +extern void erts_print_nif_taints(int to, void* to_arg); +void erts_unload_nif(struct erl_module_nif* nif); +extern void erl_nif_init(void); /* * Port Specific Data. @@ -381,17 +393,45 @@ extern Eterm erts_ddll_monitor_driver(Process *p, ** and Binary, the macros below can convert one type to the other, as they both ** in reality are equal. */ -typedef struct binary { - Uint flags; - erts_refc_t refc; + #ifdef ARCH_32 - Uint32 align__; /* *DO NOT USE* only for alignment. */ + /* *DO NOT USE* only for alignment. */ +#define ERTS_BINARY_STRUCT_ALIGNMENT Uint32 align__; +#else +#define ERTS_BINARY_STRUCT_ALIGNMENT #endif - /* Add fields BEFORE this, otherwise the drivers crash */ + +/* Add fields in ERTS_INTERNAL_BINARY_FIELDS, otherwise the drivers crash */ +#define ERTS_INTERNAL_BINARY_FIELDS \ + Uint flags; \ + erts_refc_t refc; \ + ERTS_BINARY_STRUCT_ALIGNMENT + +typedef struct binary { + ERTS_INTERNAL_BINARY_FIELDS long orig_size; char orig_bytes[1]; /* to be continued */ } Binary; +#define ERTS_SIZEOF_Binary(Sz) \ + (offsetof(Binary,orig_bytes) + (Sz)) + +typedef struct { + ERTS_INTERNAL_BINARY_FIELDS + long orig_size; + void (*destructor)(Binary *); + char magic_bin_data[1]; +} ErtsMagicBinary; + +typedef union { + Binary binary; + ErtsMagicBinary magic_binary; + struct { + ERTS_INTERNAL_BINARY_FIELDS + ErlDrvBinary binary; + } driver; +} ErtsBinary; + /* * 'Binary' alignment: * Address of orig_bytes[0] of a Binary should always be 8-byte aligned. @@ -399,25 +439,23 @@ typedef struct binary { * 32-bits architectures and 8 bytes on 64-bits architectures. */ -/* - * "magic" binary. - */ -typedef struct { - void (*destructor)(Binary *); - char magic_bin_data[1]; -} ErtsBinaryMagicPart; - #define ERTS_MAGIC_BIN_DESTRUCTOR(BP) \ - (((ErtsBinaryMagicPart *) (BP)->orig_bytes)->destructor) + ((ErtsBinary *) (BP))->magic_binary.destructor #define ERTS_MAGIC_BIN_DATA(BP) \ - ((void *) (((ErtsBinaryMagicPart *) (BP)->orig_bytes)->magic_bin_data)) + ((void *) ((ErtsBinary *) (BP))->magic_binary.magic_bin_data) #define ERTS_MAGIC_BIN_DATA_SIZE(BP) \ - ((BP)->orig_size - (sizeof(ErtsBinaryMagicPart) - 1)) - -#define Binary2ErlDrvBinary(B) ((ErlDrvBinary *) (&((B)->orig_size))) + ((BP)->orig_size - sizeof(void (*)(Binary *))) +#define ERTS_MAGIC_BIN_ORIG_SIZE(Sz) \ + (sizeof(void (*)(Binary *)) + (Sz)) +#define ERTS_MAGIC_BIN_SIZE(Sz) \ + (offsetof(ErtsMagicBinary,magic_bin_data) + (Sz)) +#define ERTS_MAGIC_BIN_FROM_DATA(DATA) \ + ((ErtsBinary*)((char*)(DATA) - offsetof(ErtsMagicBinary,magic_bin_data))) + +#define Binary2ErlDrvBinary(B) (&((ErtsBinary *) (B))->driver.binary) #define ErlDrvBinary2Binary(D) ((Binary *) \ - (((char *) (D)) - \ - ((char *) &(((Binary *) 0)->orig_size)))) + (((char *) (D)) \ + - offsetof(ErtsBinary, driver.binary))) /* A "magic" binary flag */ #define BIN_FLAG_MAGIC 1 @@ -1405,6 +1443,11 @@ void p_slpq(_VOID_); /* utils.c */ +/* + * To be used to silence unused result warnings, but do not abuse it. + */ +void erts_silence_warn_unused_result(long unused); + void erts_cleanup_offheap(ErlOffHeap *offheap); void erts_cleanup_externals(ExternalThing *); @@ -1657,7 +1700,6 @@ void erts_bif_trace_init(void); /* ** Call_trace uses this API for the parameter matching functions */ - struct erl_heap_fragment* saved_program_buf; #define MatchSetRef(MPSP) \ do { \ |