diff options
Diffstat (limited to 'erts/emulator/beam/module.c')
-rw-r--r-- | erts/emulator/beam/module.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/erts/emulator/beam/module.c b/erts/emulator/beam/module.c new file mode 100644 index 0000000000..57a43c89f4 --- /dev/null +++ b/erts/emulator/beam/module.c @@ -0,0 +1,134 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 1996-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% + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "sys.h" +#include "erl_vm.h" +#include "global.h" +#include "module.h" + +#define MODULE_SIZE 50 +#define MODULE_LIMIT (64*1024) + +static IndexTable module_table; + +/* + * SMP note: We don't need to look accesses to the module table because + * there is one only scheduler thread when we update it. + */ + +#include "erl_smp.h" + +void module_info(int to, void *to_arg) +{ + index_info(to, to_arg, &module_table); +} + + +static HashValue module_hash(Module* x) +{ + return (HashValue) x->module; +} + + +static int module_cmp(Module* tmpl, Module* obj) +{ + return tmpl->module != obj->module; +} + + +static Module* module_alloc(Module* tmpl) +{ + Module* obj = (Module*) erts_alloc(ERTS_ALC_T_MODULE, sizeof(Module)); + + obj->module = tmpl->module; + obj->code = 0; + obj->old_code = 0; + obj->code_length = 0; + obj->old_code_length = 0; + obj->slot.index = -1; + obj->nif.handle = NULL; + obj->old_nif.handle = NULL; + obj->nif.entry = NULL; + obj->old_nif.entry = NULL; + obj->nif.data = NULL; + obj->old_nif.data = NULL; + return obj; +} + + +void init_module_table(void) +{ + HashFunctions f; + + f.hash = (H_FUN) module_hash; + f.cmp = (HCMP_FUN) module_cmp; + f.alloc = (HALLOC_FUN) module_alloc; + f.free = 0; + + erts_index_init(ERTS_ALC_T_MODULE_TABLE, &module_table, "module_code", + MODULE_SIZE, MODULE_LIMIT, f); +} + +Module* +erts_get_module(Eterm mod) +{ + Module e; + int index; + + ASSERT(is_atom(mod)); + e.module = atom_val(mod); + index = index_get(&module_table, (void*) &e); + if (index == -1) { + return NULL; + } else { + return (Module*) erts_index_lookup(&module_table, index); + } +} + +Module* +erts_put_module(Eterm mod) +{ + Module e; + int index; + + ASSERT(is_atom(mod)); + ERTS_SMP_LC_ASSERT(erts_initialized == 0 || erts_smp_is_system_blocked(0)); + e.module = atom_val(mod); + index = index_put(&module_table, (void*) &e); + return (Module*) erts_index_lookup(&module_table, index); +} + +Module *module_code(int i) +{ + return (Module*) erts_index_lookup(&module_table, i); +} + +int module_code_size(void) +{ + return module_table.entries; +} + +int module_table_sz(void) +{ + return index_table_sz(&module_table); +} |