aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/global.h
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2017-02-23 19:48:00 +0100
committerSverker Eriksson <[email protected]>2017-02-23 19:48:00 +0100
commita5638411f2d16f6648bb1c904206079df00d2471 (patch)
tree4a7c7ca6073a1b84e37112a7c4ee556ce4877099 /erts/emulator/beam/global.h
parent9c07c8727f440b408dc2542634812ca944e97c78 (diff)
parent0e566efe903fd2482c51762f1939bc292dca43e7 (diff)
downloadotp-a5638411f2d16f6648bb1c904206079df00d2471.tar.gz
otp-a5638411f2d16f6648bb1c904206079df00d2471.tar.bz2
otp-a5638411f2d16f6648bb1c904206079df00d2471.zip
Merge branch 'sverker/enif_select/OTP-13684'
* sverker/enif_select: (31 commits) Remove debug printout and comment Fix nif_SUITE:select for old linux Add docs for enif_compare_monitors and ErlNifMonitor Fix ErlNifMonitor handling Remove faulty debug ASSERT erts: Skip nif_SUITE:select on windows Fix enif_select for windows Fix whitebox monitor tests Fix erl_nif doc Expand nif_SUITE:monitor_frenzy to verify dtor calls Expand nif_SUITE:monitor_frenzy with binary_to_term erts: Avoid revival of dying resource by dec_term erts: Add enif_compare_monitors erts: Try fix enif_select for windows erts: Change return value for enif_select erts: Add pid argument to enif_select erts: Beautify enif_select erts: Fix bad_fd_in_pollset error case for enif_select erts: Add enif_monitor_process and enif_demonitor_process erts: Rename ErlNifResource as ErtsResource ...
Diffstat (limited to 'erts/emulator/beam/global.h')
-rw-r--r--erts/emulator/beam/global.h48
1 files changed, 48 insertions, 0 deletions
diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h
index fff22fe9c1..c4c848f49f 100644
--- a/erts/emulator/beam/global.h
+++ b/erts/emulator/beam/global.h
@@ -42,6 +42,7 @@
#include "erl_utils.h"
#include "erl_port.h"
#include "erl_gc.h"
+#include "erl_nif.h"
#define ERTS_BINARY_TYPES_ONLY__
#include "erl_binary.h"
#undef ERTS_BINARY_TYPES_ONLY__
@@ -68,9 +69,54 @@ struct enif_environment_t /* ErlNifEnv */
int dbg_disable_assert_in_env;
#endif
};
+struct enif_resource_type_t
+{
+ struct enif_resource_type_t* next; /* list of all resource types */
+ struct enif_resource_type_t* prev;
+ struct erl_module_nif* owner; /* that created this type and thus implements the destructor*/
+ ErlNifResourceDtor* dtor; /* user destructor function */
+ ErlNifResourceStop* stop;
+ ErlNifResourceDown* down;
+ erts_refc_t refc; /* num of resources of this type (HOTSPOT warning)
+ +1 for active erl_module_nif */
+ Eterm module;
+ Eterm name;
+};
+
+typedef struct
+{
+ erts_smp_mtx_t lock;
+ ErtsMonitor* root;
+ int pending_failed_fire;
+ int is_dying;
+
+ size_t user_data_sz;
+} ErtsResourceMonitors;
+
+typedef struct ErtsResource_
+{
+ struct enif_resource_type_t* type;
+ ErtsResourceMonitors* monitors;
+#ifdef DEBUG
+ erts_refc_t nif_refc;
+#else
+# ifdef ARCH_32
+ byte align__[4];
+# endif
+#endif
+ char data[1];
+}ErtsResource;
+
+#define DATA_TO_RESOURCE(PTR) ErtsContainerStruct(PTR, ErtsResource, data)
+#define erts_resource_ref_size(P) ERTS_MAGIC_REF_THING_SIZE
+
+extern Eterm erts_bld_resource_ref(Eterm** hp, ErlOffHeap*, ErtsResource*);
+
extern void erts_pre_nif(struct enif_environment_t*, Process*,
struct erl_module_nif*, Process* tracee);
extern void erts_post_nif(struct enif_environment_t* env);
+extern void erts_resource_stop(ErtsResource*, ErlNifEvent, int is_direct_call);
+void erts_fire_nif_monitor(ErtsResource*, Eterm pid, Eterm ref);
extern Eterm erts_nif_taints(Process* p);
extern void erts_print_nif_taints(fmtfn_t to, void* to_arg);
void erts_unload_nif(struct erl_module_nif* nif);
@@ -1129,6 +1175,8 @@ void erts_stale_drv_select(Eterm, ErlDrvPort, ErlDrvEvent, int, int);
Port *erts_get_heart_port(void);
void erts_emergency_close_ports(void);
+void erts_ref_to_driver_monitor(Eterm ref, ErlDrvMonitor *mon);
+Eterm erts_driver_monitor_to_ref(Eterm* hp, const ErlDrvMonitor *mon);
#if defined(ERTS_SMP) && defined(ERTS_ENABLE_LOCK_COUNT)
void erts_lcnt_enable_io_lock_count(int enable);