diff options
author | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
commit | 84adefa331c4159d432d22840663c38f155cd4c1 (patch) | |
tree | bff9a9c66adda4df2106dfd0e5c053ab182a12bd /erts/emulator/beam/erl_db.h | |
download | otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2 otp-84adefa331c4159d432d22840663c38f155cd4c1.zip |
The R13B03 release.OTP_R13B03
Diffstat (limited to 'erts/emulator/beam/erl_db.h')
-rw-r--r-- | erts/emulator/beam/erl_db.h | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_db.h b/erts/emulator/beam/erl_db.h new file mode 100644 index 0000000000..7da28fad29 --- /dev/null +++ b/erts/emulator/beam/erl_db.h @@ -0,0 +1,247 @@ +/* + * %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% + */ + +/* + * This file now contains only the definitions needed for the + * meta table. + * + */ + +#ifndef __DB_H__ +#define __DB_H__ + +#include "sys.h" +#include "bif.h" + +#include "erl_db_util.h" /* Flags */ +#include "erl_db_hash.h" /* DbTableHash */ +#include "erl_db_tree.h" /* DbTableTree */ +/*TT*/ + +Uint erts_get_ets_misc_mem_size(void); + +/* + * So, the structure for a database table, NB this is only + * interesting in db.c. + */ +union db_table { + DbTableCommon common; /* Any type of db table */ + DbTableHash hash; /* Linear hash array specific data */ + DbTableTree tree; /* AVL tree specific data */ + /*TT*/ +}; + +#define DB_DEF_MAX_TABS 2053 /* Superseeded by environment variable + "ERL_MAX_ETS_TABLES" */ +#define ERL_MAX_ETS_TABLES_ENV "ERL_MAX_ETS_TABLES" + +void init_db(void); +int erts_db_process_exiting(Process *, ErtsProcLocks); +void db_info(int, void *, int); +void erts_db_foreach_table(void (*)(DbTable *, void *), void *); +void erts_db_foreach_offheap(DbTable *, + void (*func)(ErlOffHeap *, void *), + void *); + +extern int user_requested_db_max_tabs; /* set in erl_init */ +extern int erts_ets_realloc_always_moves; /* set in erl_init */ +extern Export ets_select_delete_continue_exp; +extern Export ets_select_count_continue_exp; +extern Export ets_select_continue_exp; +extern erts_smp_atomic_t erts_ets_misc_mem_size; + +Eterm erts_ets_colliding_names(Process*, Eterm name, Uint cnt); + +#endif + +#if defined(ERTS_WANT_DB_INTERNAL__) && !defined(ERTS_HAVE_DB_INTERNAL__) +#define ERTS_HAVE_DB_INTERNAL__ + +#include "erl_alloc.h" + +/* + * _fnf : Failure Not Fatal (same as for erts_alloc/erts_realloc/erts_free) + * _nt : No Table (i.e. memory not associated with a specific table) + */ + +#define ERTS_DB_ALC_MEM_UPDATE_(TAB, FREE_SZ, ALLOC_SZ) \ +do { \ + long sz__ = ((long) (ALLOC_SZ)) - ((long) (FREE_SZ)); \ + ASSERT((TAB)); \ + erts_smp_atomic_add(&(TAB)->common.memory_size, sz__); \ +} while (0) + +#define ERTS_ETS_MISC_MEM_ADD(SZ) \ + erts_smp_atomic_add(&erts_ets_misc_mem_size, (SZ)); + +ERTS_GLB_INLINE void *erts_db_alloc(ErtsAlcType_t type, + DbTable *tab, + Uint size); +ERTS_GLB_INLINE void *erts_db_alloc_fnf(ErtsAlcType_t type, + DbTable *tab, + Uint size); +ERTS_GLB_INLINE void *erts_db_alloc_nt(ErtsAlcType_t type, Uint size); +ERTS_GLB_INLINE void *erts_db_alloc_fnf_nt(ErtsAlcType_t type, Uint size); + +#if ERTS_GLB_INLINE_INCL_FUNC_DEF + +ERTS_GLB_INLINE void * +erts_db_alloc(ErtsAlcType_t type, DbTable *tab, Uint size) +{ + void *res = erts_alloc(type, size); + ERTS_DB_ALC_MEM_UPDATE_(tab, 0, size); + return res; +} + +ERTS_GLB_INLINE void * +erts_db_alloc_fnf(ErtsAlcType_t type, DbTable *tab, Uint size) +{ + void *res = erts_alloc_fnf(type, size); + if (!res) + return NULL; + ERTS_DB_ALC_MEM_UPDATE_(tab, 0, size); + return res; +} + +ERTS_GLB_INLINE void * +erts_db_alloc_nt(ErtsAlcType_t type, Uint size) +{ + void *res = erts_alloc(type, size); + return res; +} + +ERTS_GLB_INLINE void * +erts_db_alloc_fnf_nt(ErtsAlcType_t type, Uint size) +{ + void *res = erts_alloc_fnf(type, size); + if (!res) + return NULL; + return res; +} + +#endif /* #if ERTS_GLB_INLINE_INCL_FUNC_DEF */ + +ERTS_GLB_INLINE void *erts_db_realloc(ErtsAlcType_t type, + DbTable *tab, + void *ptr, + Uint old_size, + Uint size); +ERTS_GLB_INLINE void *erts_db_realloc_fnf(ErtsAlcType_t type, + DbTable *tab, + void *ptr, + Uint old_size, + Uint size); +ERTS_GLB_INLINE void *erts_db_realloc_nt(ErtsAlcType_t type, + void *ptr, + Uint old_size, + Uint size); +ERTS_GLB_INLINE void *erts_db_realloc_fnf_nt(ErtsAlcType_t type, + void *ptr, + Uint old_size, + Uint size); + +#if ERTS_GLB_INLINE_INCL_FUNC_DEF + +ERTS_GLB_INLINE void * +erts_db_realloc(ErtsAlcType_t type, DbTable *tab, void *ptr, + Uint old_size, Uint size) +{ + void *res; + ASSERT(!ptr || old_size == ERTS_ALC_DBG_BLK_SZ(ptr)); + res = erts_realloc(type, ptr, size); + ERTS_DB_ALC_MEM_UPDATE_(tab, old_size, size); + return res; +} + +ERTS_GLB_INLINE void * +erts_db_realloc_fnf(ErtsAlcType_t type, DbTable *tab, void *ptr, + Uint old_size, Uint size) +{ + void *res; + ASSERT(!ptr || old_size == ERTS_ALC_DBG_BLK_SZ(ptr)); + res = erts_realloc_fnf(type, ptr, size); + if (!res) + return NULL; + ERTS_DB_ALC_MEM_UPDATE_(tab, old_size, size); + return res; +} + +ERTS_GLB_INLINE void * +erts_db_realloc_nt(ErtsAlcType_t type, void *ptr, + Uint old_size, Uint size) +{ + void *res; + ASSERT(!ptr || old_size == ERTS_ALC_DBG_BLK_SZ(ptr)); + res = erts_realloc(type, ptr, size); + return res; +} + +ERTS_GLB_INLINE void * +erts_db_realloc_fnf_nt(ErtsAlcType_t type, void *ptr, + Uint old_size, Uint size) +{ + void *res; + ASSERT(!ptr || old_size == ERTS_ALC_DBG_BLK_SZ(ptr)); + res = erts_realloc_fnf(type, ptr, size); + if (!res) + return NULL; + return res; +} + +#endif /* #if ERTS_GLB_INLINE_INCL_FUNC_DEF */ + +ERTS_GLB_INLINE void erts_db_free(ErtsAlcType_t type, + DbTable *tab, + void *ptr, + Uint size); + +ERTS_GLB_INLINE void erts_db_free_nt(ErtsAlcType_t type, + void *ptr, + Uint size); + +#if ERTS_GLB_INLINE_INCL_FUNC_DEF + +ERTS_GLB_INLINE void +erts_db_free(ErtsAlcType_t type, DbTable *tab, void *ptr, Uint size) +{ + ASSERT(ptr != 0); + ASSERT(size == ERTS_ALC_DBG_BLK_SZ(ptr)); + ERTS_DB_ALC_MEM_UPDATE_(tab, size, 0); + + ASSERT(((void *) tab) != ptr + || erts_smp_atomic_read(&tab->common.memory_size) == 0); + + erts_free(type, ptr); +} + +ERTS_GLB_INLINE void +erts_db_free_nt(ErtsAlcType_t type, void *ptr, Uint size) +{ + ASSERT(ptr != 0); + ASSERT(size == ERTS_ALC_DBG_BLK_SZ(ptr)); + + erts_free(type, ptr); +} + +#endif /* #if ERTS_GLB_INLINE_INCL_FUNC_DEF */ + +#undef ERTS_DB_ALC_MEM_UPDATE_ + +#endif /* #if defined(ERTS_WANT_DB_INTERNAL__) && !defined(ERTS_HAVE_DB_INTERNAL__) */ + |