4
* Copyright Ericsson AB 2009. All Rights Reserved.
4
* Copyright Ericsson AB 2009-2011. All Rights Reserved.
6
6
* The contents of this file are subject to the Erlang Public License,
7
7
* Version 1.1, (the "License"); you may not use this file except in
8
8
* compliance with the License. You should have received a copy of the
9
9
* Erlang Public License along with this software. If not, it can be
10
10
* retrieved online at http://www.erlang.org/.
12
12
* Software distributed under the License is distributed on an "AS IS"
13
13
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14
14
* the License for the specific language governing rights and limitations
15
15
* under the License.
20
20
/* Include file for writers of Native Implemented Functions.
23
#define ERL_NIF_MAJOR_VERSION 0
27
#include "erl_drv_nif.h"
33
** 2.1: R14B02 "vm_variant"
35
#define ERL_NIF_MAJOR_VERSION 2
24
36
#define ERL_NIF_MINOR_VERSION 1
26
38
#include <stdlib.h>
41
# define SIZEOF_CHAR_SAVED__ SIZEOF_CHAR
45
# define SIZEOF_SHORT_SAVED__ SIZEOF_SHORT
49
# define SIZEOF_INT_SAVED__ SIZEOF_INT
53
# define SIZEOF_LONG_SAVED__ SIZEOF_LONG
56
#ifdef SIZEOF_LONG_LONG
57
# define SIZEOF_LONG_LONG_SAVED__ SIZEOF_LONG_LONG
58
# undef SIZEOF_LONG_LONG
60
#ifdef HALFWORD_HEAP_EMULATOR
61
# define HALFWORD_HEAP_EMULATOR_SAVED__ HALFWORD_HEAP_EMULATOR
62
# undef HALFWORD_HEAP_EMULATOR
64
#include "erl_int_sizes_config.h"
70
#if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_))
71
typedef unsigned __int64 ErlNifUInt64;
72
typedef __int64 ErlNifSInt64;
73
#elif SIZEOF_LONG == 8
74
typedef unsigned long ErlNifUInt64;
75
typedef long ErlNifSInt64;
76
#elif SIZEOF_LONG_LONG == 8
77
typedef unsigned long long ErlNifUInt64;
78
typedef long long ErlNifSInt64;
80
#error No 64-bit integer type
83
#ifdef HALFWORD_HEAP_EMULATOR
84
# define ERL_NIF_VM_VARIANT "beam.halfword"
85
typedef unsigned int ERL_NIF_TERM;
87
# define ERL_NIF_VM_VARIANT "beam.vanilla"
28
88
typedef unsigned long ERL_NIF_TERM;
91
struct enif_environment_t;
92
typedef struct enif_environment_t ErlNifEnv;
34
void* fptr; //ERL_NIF_TERM (*fptr)(void*, ...);
98
ERL_NIF_TERM (*fptr)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
37
struct enif_environment_t;
38
typedef struct enif_environment_t ErlNifEnv;
40
101
typedef struct enif_entry_t
47
108
int (*load) (ErlNifEnv*, void** priv_data, ERL_NIF_TERM load_info);
48
109
int (*reload) (ErlNifEnv*, void** priv_data, ERL_NIF_TERM load_info);
49
110
int (*upgrade)(ErlNifEnv*, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info);
50
void (*unload) (ErlNifEnv*, void* priv_data);
111
void (*unload) (ErlNifEnv*, void* priv_data);
112
const char* vm_variant;
58
120
unsigned char* data;
60
122
/* Internals (avert your eyes) */
61
123
ERL_NIF_TERM bin_term;
62
unsigned char* tmp_alloc;
127
typedef struct enif_resource_type_t ErlNifResourceType;
128
typedef void ErlNifResourceDtor(ErlNifEnv*, void*);
131
ERL_NIF_RT_CREATE = 1,
132
ERL_NIF_RT_TAKEOVER = 2
133
}ErlNifResourceFlags;
142
ERL_NIF_TERM pid; /* internal, may change */
145
typedef ErlDrvSysInfo ErlNifSysInfo;
147
typedef struct ErlDrvTid_ *ErlNifTid;
148
typedef struct ErlDrvMutex_ ErlNifMutex;
149
typedef struct ErlDrvCond_ ErlNifCond;
150
typedef struct ErlDrvRWLock_ ErlNifRWLock;
151
typedef int ErlNifTSDKey;
153
typedef ErlDrvThreadOpts ErlNifThreadOpts;
67
155
#if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_))
68
156
# define ERL_NIF_API_FUNC_DECL(RET_TYPE, NAME, ARGS) RET_TYPE (*NAME) ARGS
194
# define ERL_NIF_INIT_PROLOGUE extern "C" {
195
# define ERL_NIF_INIT_EPILOGUE }
197
# define ERL_NIF_INIT_PROLOGUE
198
# define ERL_NIF_INIT_EPILOGUE
106
202
#define ERL_NIF_INIT(NAME, FUNCS, LOAD, RELOAD, UPGRADE, UNLOAD) \
203
ERL_NIF_INIT_PROLOGUE \
107
204
ERL_NIF_INIT_GLOB \
205
ERL_NIF_INIT_DECL(NAME); \
108
206
ERL_NIF_INIT_DECL(NAME) \
110
208
static ErlNifEntry entry = \
115
213
sizeof(FUNCS) / sizeof(*FUNCS), \
117
LOAD, RELOAD, UPGRADE, UNLOAD \
215
LOAD, RELOAD, UPGRADE, UNLOAD, \
119
218
ERL_NIF_INIT_BODY; \
221
ERL_NIF_INIT_EPILOGUE
224
#endif /* __ERL_NIF_H__ */