1 /*
2  * %CopyrightBegin%
3  *
4  * Copyright Ericsson AB 2009-2017. All Rights Reserved.
5  *
6  * The contents of this file are subject to the Erlang Public License,
7  * Version 1.1, (the "License"); you may not use this file except in
8  * compliance with the License. You should have received a copy of the
9  * Erlang Public License along with this software. If not, it can be
10  * retrieved online at http://www.erlang.org/.
11  *
12  * Software distributed under the License is distributed on an "AS IS"
13  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14  * the License for the specific language governing rights and limitations
15  * under the License.
16  *
17  * %CopyrightEnd%
18  */
19 
20 #if !defined(ERL_NIF_API_FUNC_DECL) && !defined(ERL_NIF_API_FUNC_MACRO)
21 #  error This file should not be included directly
22 #endif
23 
24 /*
25 ** WARNING: add new ERL_NIF_API_FUNC_DECL entries at the bottom of the list
26 ** to keep compatibility on Windows!!!
27 **
28 ** And don't forget to increase ERL_NIF_MINOR_VERSION in erl_nif.h
29 ** when adding functions to the API.
30 */
31 #ifdef ERL_NIF_API_FUNC_DECL
32 ERL_NIF_API_FUNC_DECL(void*,enif_priv_data,(ErlNifEnv*));
33 ERL_NIF_API_FUNC_DECL(void*,enif_alloc,(size_t size));
34 ERL_NIF_API_FUNC_DECL(void,enif_free,(void* ptr));
35 ERL_NIF_API_FUNC_DECL(int,enif_is_atom,(ErlNifEnv*, ERL_NIF_TERM term));
36 ERL_NIF_API_FUNC_DECL(int,enif_is_binary,(ErlNifEnv*, ERL_NIF_TERM term));
37 ERL_NIF_API_FUNC_DECL(int,enif_is_ref,(ErlNifEnv*, ERL_NIF_TERM term));
38 ERL_NIF_API_FUNC_DECL(int,enif_inspect_binary,(ErlNifEnv*, ERL_NIF_TERM bin_term, ErlNifBinary* bin));
39 ERL_NIF_API_FUNC_DECL(int,enif_alloc_binary,(size_t size, ErlNifBinary* bin));
40 ERL_NIF_API_FUNC_DECL(int,enif_realloc_binary,(ErlNifBinary* bin, size_t size));
41 ERL_NIF_API_FUNC_DECL(void,enif_release_binary,(ErlNifBinary* bin));
42 ERL_NIF_API_FUNC_DECL(int,enif_get_int,(ErlNifEnv*, ERL_NIF_TERM term, int* ip));
43 ERL_NIF_API_FUNC_DECL(int,enif_get_ulong,(ErlNifEnv*, ERL_NIF_TERM term, unsigned long* ip));
44 ERL_NIF_API_FUNC_DECL(int,enif_get_double,(ErlNifEnv*, ERL_NIF_TERM term, double* dp));
45 ERL_NIF_API_FUNC_DECL(int,enif_get_list_cell,(ErlNifEnv* env, ERL_NIF_TERM term, ERL_NIF_TERM* head, ERL_NIF_TERM* tail));
46 ERL_NIF_API_FUNC_DECL(int,enif_get_tuple,(ErlNifEnv* env, ERL_NIF_TERM tpl, int* arity, const ERL_NIF_TERM** array));
47 ERL_NIF_API_FUNC_DECL(int,enif_is_identical,(ERL_NIF_TERM lhs, ERL_NIF_TERM rhs));
48 ERL_NIF_API_FUNC_DECL(int,enif_compare,(ERL_NIF_TERM lhs, ERL_NIF_TERM rhs));
49 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_binary,(ErlNifEnv* env, ErlNifBinary* bin));
50 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_badarg,(ErlNifEnv* env));
51 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_int,(ErlNifEnv* env, int i));
52 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_ulong,(ErlNifEnv* env, unsigned long i));
53 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_double,(ErlNifEnv* env, double d));
54 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_atom,(ErlNifEnv* env, const char* name));
55 ERL_NIF_API_FUNC_DECL(int,enif_make_existing_atom,(ErlNifEnv* env, const char* name, ERL_NIF_TERM* atom, ErlNifCharEncoding));
56 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_tuple,(ErlNifEnv* env, unsigned cnt, ...));
57 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_list,(ErlNifEnv* env, unsigned cnt, ...));
58 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_list_cell,(ErlNifEnv* env, ERL_NIF_TERM car, ERL_NIF_TERM cdr));
59 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_string,(ErlNifEnv* env, const char* string, ErlNifCharEncoding));
60 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_ref,(ErlNifEnv* env));
61 
62 ERL_NIF_API_FUNC_DECL(ErlNifMutex*,enif_mutex_create,(char *name));
63 ERL_NIF_API_FUNC_DECL(void,enif_mutex_destroy,(ErlNifMutex *mtx));
64 ERL_NIF_API_FUNC_DECL(int,enif_mutex_trylock,(ErlNifMutex *mtx));
65 ERL_NIF_API_FUNC_DECL(void,enif_mutex_lock,(ErlNifMutex *mtx));
66 ERL_NIF_API_FUNC_DECL(void,enif_mutex_unlock,(ErlNifMutex *mtx));
67 ERL_NIF_API_FUNC_DECL(ErlNifCond*,enif_cond_create,(char *name));
68 ERL_NIF_API_FUNC_DECL(void,enif_cond_destroy,(ErlNifCond *cnd));
69 ERL_NIF_API_FUNC_DECL(void,enif_cond_signal,(ErlNifCond *cnd));
70 ERL_NIF_API_FUNC_DECL(void,enif_cond_broadcast,(ErlNifCond *cnd));
71 ERL_NIF_API_FUNC_DECL(void,enif_cond_wait,(ErlNifCond *cnd, ErlNifMutex *mtx));
72 ERL_NIF_API_FUNC_DECL(ErlNifRWLock*,enif_rwlock_create,(char *name));
73 ERL_NIF_API_FUNC_DECL(void,enif_rwlock_destroy,(ErlNifRWLock *rwlck));
74 ERL_NIF_API_FUNC_DECL(int,enif_rwlock_tryrlock,(ErlNifRWLock *rwlck));
75 ERL_NIF_API_FUNC_DECL(void,enif_rwlock_rlock,(ErlNifRWLock *rwlck));
76 ERL_NIF_API_FUNC_DECL(void,enif_rwlock_runlock,(ErlNifRWLock *rwlck));
77 ERL_NIF_API_FUNC_DECL(int,enif_rwlock_tryrwlock,(ErlNifRWLock *rwlck));
78 ERL_NIF_API_FUNC_DECL(void,enif_rwlock_rwlock,(ErlNifRWLock *rwlck));
79 ERL_NIF_API_FUNC_DECL(void,enif_rwlock_rwunlock,(ErlNifRWLock *rwlck));
80 ERL_NIF_API_FUNC_DECL(int,enif_tsd_key_create,(char *name, ErlNifTSDKey *key));
81 ERL_NIF_API_FUNC_DECL(void,enif_tsd_key_destroy,(ErlNifTSDKey key));
82 ERL_NIF_API_FUNC_DECL(void,enif_tsd_set,(ErlNifTSDKey key, void *data));
83 ERL_NIF_API_FUNC_DECL(void*,enif_tsd_get,(ErlNifTSDKey key));
84 ERL_NIF_API_FUNC_DECL(ErlNifThreadOpts*,enif_thread_opts_create,(char *name));
85 ERL_NIF_API_FUNC_DECL(void,enif_thread_opts_destroy,(ErlNifThreadOpts *opts));
86 ERL_NIF_API_FUNC_DECL(int,enif_thread_create,(char *name,ErlNifTid *tid,void * (*func)(void *),void *args,ErlNifThreadOpts *opts));
87 ERL_NIF_API_FUNC_DECL(ErlNifTid,enif_thread_self,(void));
88 ERL_NIF_API_FUNC_DECL(int,enif_equal_tids,(ErlNifTid tid1, ErlNifTid tid2));
89 ERL_NIF_API_FUNC_DECL(void,enif_thread_exit,(void *resp));
90 ERL_NIF_API_FUNC_DECL(int,enif_thread_join,(ErlNifTid, void **respp));
91 
92 ERL_NIF_API_FUNC_DECL(void*,enif_realloc,(void* ptr, size_t size));
93 ERL_NIF_API_FUNC_DECL(void,enif_system_info,(ErlNifSysInfo *sip, size_t si_size));
94 ERL_NIF_API_FUNC_DECL(int,enif_fprintf,(void/* FILE* */ *filep, const char *format, ...));
95 ERL_NIF_API_FUNC_DECL(int,enif_inspect_iolist_as_binary,(ErlNifEnv*, ERL_NIF_TERM term, ErlNifBinary* bin));
96 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_sub_binary,(ErlNifEnv*, ERL_NIF_TERM bin_term, size_t pos, size_t size));
97 ERL_NIF_API_FUNC_DECL(int,enif_get_string,(ErlNifEnv*, ERL_NIF_TERM list, char* buf, unsigned len, ErlNifCharEncoding));
98 ERL_NIF_API_FUNC_DECL(int,enif_get_atom,(ErlNifEnv*, ERL_NIF_TERM atom, char* buf, unsigned len, ErlNifCharEncoding));
99 ERL_NIF_API_FUNC_DECL(int,enif_is_fun,(ErlNifEnv*, ERL_NIF_TERM term));
100 ERL_NIF_API_FUNC_DECL(int,enif_is_pid,(ErlNifEnv*, ERL_NIF_TERM term));
101 ERL_NIF_API_FUNC_DECL(int,enif_is_port,(ErlNifEnv*, ERL_NIF_TERM term));
102 ERL_NIF_API_FUNC_DECL(int,enif_get_uint,(ErlNifEnv*, ERL_NIF_TERM term, unsigned* ip));
103 ERL_NIF_API_FUNC_DECL(int,enif_get_long,(ErlNifEnv*, ERL_NIF_TERM term, long* ip));
104 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_uint,(ErlNifEnv*, unsigned i));
105 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_long,(ErlNifEnv*, long i));
106 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_tuple_from_array,(ErlNifEnv*, const ERL_NIF_TERM arr[], unsigned cnt));
107 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_list_from_array,(ErlNifEnv*, const ERL_NIF_TERM arr[], unsigned cnt));
108 ERL_NIF_API_FUNC_DECL(int,enif_is_empty_list,(ErlNifEnv*, ERL_NIF_TERM term));
109 ERL_NIF_API_FUNC_DECL(ErlNifResourceType*,enif_open_resource_type,(ErlNifEnv*, const char* module_str, const char* name_str, void (*dtor)(ErlNifEnv*,void *), ErlNifResourceFlags flags, ErlNifResourceFlags* tried));
110 ERL_NIF_API_FUNC_DECL(void*,enif_alloc_resource,(ErlNifResourceType* type, size_t size));
111 ERL_NIF_API_FUNC_DECL(void,enif_release_resource,(void* obj));
112 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_resource,(ErlNifEnv*, void* obj));
113 ERL_NIF_API_FUNC_DECL(int,enif_get_resource,(ErlNifEnv*, ERL_NIF_TERM term, ErlNifResourceType* type, void** objp));
114 ERL_NIF_API_FUNC_DECL(size_t,enif_sizeof_resource,(void* obj));
115 ERL_NIF_API_FUNC_DECL(unsigned char*,enif_make_new_binary,(ErlNifEnv*,size_t size,ERL_NIF_TERM* termp));
116 ERL_NIF_API_FUNC_DECL(int,enif_is_list,(ErlNifEnv*, ERL_NIF_TERM term));
117 ERL_NIF_API_FUNC_DECL(int,enif_is_tuple,(ErlNifEnv*, ERL_NIF_TERM term));
118 ERL_NIF_API_FUNC_DECL(int,enif_get_atom_length,(ErlNifEnv*, ERL_NIF_TERM atom, unsigned* len, ErlNifCharEncoding));
119 ERL_NIF_API_FUNC_DECL(int,enif_get_list_length,(ErlNifEnv* env, ERL_NIF_TERM term, unsigned* len));
120 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM, enif_make_atom_len,(ErlNifEnv* env, const char* name, size_t len));
121 ERL_NIF_API_FUNC_DECL(int, enif_make_existing_atom_len,(ErlNifEnv* env, const char* name, size_t len, ERL_NIF_TERM* atom, ErlNifCharEncoding));
122 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_string_len,(ErlNifEnv* env, const char* string, size_t len, ErlNifCharEncoding));
123 ERL_NIF_API_FUNC_DECL(ErlNifEnv*,enif_alloc_env,(void));
124 ERL_NIF_API_FUNC_DECL(void,enif_free_env,(ErlNifEnv* env));
125 ERL_NIF_API_FUNC_DECL(void,enif_clear_env,(ErlNifEnv* env));
126 ERL_NIF_API_FUNC_DECL(int,enif_send,(ErlNifEnv* env, const ErlNifPid* to_pid, ErlNifEnv* msg_env, ERL_NIF_TERM msg));
127 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_copy,(ErlNifEnv* dst_env, ERL_NIF_TERM src_term));
128 ERL_NIF_API_FUNC_DECL(ErlNifPid*,enif_self,(ErlNifEnv* caller_env, ErlNifPid* pid));
129 ERL_NIF_API_FUNC_DECL(int,enif_get_local_pid,(ErlNifEnv* env, ERL_NIF_TERM, ErlNifPid* pid));
130 ERL_NIF_API_FUNC_DECL(void,enif_keep_resource,(void* obj));
131 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_resource_binary,(ErlNifEnv*,void* obj,const void* data, size_t size));
132 #if SIZEOF_LONG != 8
133 ERL_NIF_API_FUNC_DECL(int,enif_get_int64,(ErlNifEnv*, ERL_NIF_TERM term, ErlNifSInt64* ip));
134 ERL_NIF_API_FUNC_DECL(int,enif_get_uint64,(ErlNifEnv*, ERL_NIF_TERM term, ErlNifUInt64* ip));
135 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_int64,(ErlNifEnv*, ErlNifSInt64));
136 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_uint64,(ErlNifEnv*, ErlNifUInt64));
137 #endif
138 ERL_NIF_API_FUNC_DECL(int,enif_is_exception,(ErlNifEnv*, ERL_NIF_TERM term));
139 ERL_NIF_API_FUNC_DECL(int,enif_make_reverse_list,(ErlNifEnv*, ERL_NIF_TERM term, ERL_NIF_TERM *list));
140 ERL_NIF_API_FUNC_DECL(int,enif_is_number,(ErlNifEnv*, ERL_NIF_TERM term));
141 ERL_NIF_API_FUNC_DECL(void*,enif_dlopen,(const char* lib, void (*err_handler)(void*,const char*), void* err_arg));
142 ERL_NIF_API_FUNC_DECL(void*,enif_dlsym,(void* handle, const char* symbol, void (*err_handler)(void*,const char*), void* err_arg));
143 ERL_NIF_API_FUNC_DECL(int,enif_consume_timeslice,(ErlNifEnv*, int percent));
144 
145 /*
146 ** Add new entries here to keep compatibility on Windows!!!
147 */
148 #endif
149 
150 /*
151 ** Please keep the ERL_NIF_API_FUNC_MACRO list below in the same order
152 ** as the ERL_NIF_API_FUNC_DECL list above
153 */
154 #ifdef ERL_NIF_API_FUNC_MACRO
155 #  define enif_priv_data ERL_NIF_API_FUNC_MACRO(enif_priv_data)
156 #  define enif_alloc ERL_NIF_API_FUNC_MACRO(enif_alloc)
157 #  define enif_free ERL_NIF_API_FUNC_MACRO(enif_free)
158 #  define enif_is_atom ERL_NIF_API_FUNC_MACRO(enif_is_atom)
159 #  define enif_is_binary ERL_NIF_API_FUNC_MACRO(enif_is_binary)
160 #  define enif_is_ref ERL_NIF_API_FUNC_MACRO(enif_is_ref)
161 #  define enif_inspect_binary ERL_NIF_API_FUNC_MACRO(enif_inspect_binary)
162 #  define enif_alloc_binary ERL_NIF_API_FUNC_MACRO(enif_alloc_binary)
163 #  define enif_realloc_binary ERL_NIF_API_FUNC_MACRO(enif_realloc_binary)
164 #  define enif_release_binary ERL_NIF_API_FUNC_MACRO(enif_release_binary)
165 #  define enif_get_int ERL_NIF_API_FUNC_MACRO(enif_get_int)
166 #  define enif_get_ulong ERL_NIF_API_FUNC_MACRO(enif_get_ulong)
167 #  define enif_get_double ERL_NIF_API_FUNC_MACRO(enif_get_double)
168 #  define enif_get_tuple ERL_NIF_API_FUNC_MACRO(enif_get_tuple)
169 #  define enif_get_list_cell ERL_NIF_API_FUNC_MACRO(enif_get_list_cell)
170 #  define enif_is_identical ERL_NIF_API_FUNC_MACRO(enif_is_identical)
171 #  define enif_compare ERL_NIF_API_FUNC_MACRO(enif_compare)
172 
173 #  define enif_make_binary ERL_NIF_API_FUNC_MACRO(enif_make_binary)
174 #  define enif_make_badarg ERL_NIF_API_FUNC_MACRO(enif_make_badarg)
175 #  define enif_make_int ERL_NIF_API_FUNC_MACRO(enif_make_int)
176 #  define enif_make_ulong ERL_NIF_API_FUNC_MACRO(enif_make_ulong)
177 #  define enif_make_double ERL_NIF_API_FUNC_MACRO(enif_make_double)
178 #  define enif_make_atom ERL_NIF_API_FUNC_MACRO(enif_make_atom)
179 #  define enif_make_existing_atom ERL_NIF_API_FUNC_MACRO(enif_make_existing_atom)
180 #  define enif_make_tuple ERL_NIF_API_FUNC_MACRO(enif_make_tuple)
181 #  define enif_make_list ERL_NIF_API_FUNC_MACRO(enif_make_list)
182 #  define enif_make_list_cell ERL_NIF_API_FUNC_MACRO(enif_make_list_cell)
183 #  define enif_make_string ERL_NIF_API_FUNC_MACRO(enif_make_string)
184 #  define enif_make_ref ERL_NIF_API_FUNC_MACRO(enif_make_ref)
185 
186 #  define enif_mutex_create ERL_NIF_API_FUNC_MACRO(enif_mutex_create)
187 #  define enif_mutex_destroy ERL_NIF_API_FUNC_MACRO(enif_mutex_destroy)
188 #  define enif_mutex_trylock ERL_NIF_API_FUNC_MACRO(enif_mutex_trylock)
189 #  define enif_mutex_lock ERL_NIF_API_FUNC_MACRO(enif_mutex_lock)
190 #  define enif_mutex_unlock ERL_NIF_API_FUNC_MACRO(enif_mutex_unlock)
191 #  define enif_cond_create ERL_NIF_API_FUNC_MACRO(enif_cond_create)
192 #  define enif_cond_destroy ERL_NIF_API_FUNC_MACRO(enif_cond_destroy)
193 #  define enif_cond_signal ERL_NIF_API_FUNC_MACRO(enif_cond_signal)
194 #  define enif_cond_broadcast ERL_NIF_API_FUNC_MACRO(enif_cond_broadcast)
195 #  define enif_cond_wait ERL_NIF_API_FUNC_MACRO(enif_cond_wait)
196 #  define enif_rwlock_create ERL_NIF_API_FUNC_MACRO(enif_rwlock_create)
197 #  define enif_rwlock_destroy ERL_NIF_API_FUNC_MACRO(enif_rwlock_destroy)
198 #  define enif_rwlock_tryrlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_tryrlock)
199 #  define enif_rwlock_rlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_rlock)
200 #  define enif_rwlock_runlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_runlock)
201 #  define enif_rwlock_tryrwlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_tryrwlock)
202 #  define enif_rwlock_rwlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_rwlock)
203 #  define enif_rwlock_rwunlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_rwunlock)
204 #  define enif_tsd_key_create ERL_NIF_API_FUNC_MACRO(enif_tsd_key_create)
205 #  define enif_tsd_key_destroy ERL_NIF_API_FUNC_MACRO(enif_tsd_key_destroy)
206 #  define enif_tsd_set ERL_NIF_API_FUNC_MACRO(enif_tsd_set)
207 #  define enif_tsd_get ERL_NIF_API_FUNC_MACRO(enif_tsd_get)
208 #  define enif_thread_opts_create ERL_NIF_API_FUNC_MACRO(enif_thread_opts_create)
209 #  define enif_thread_opts_destroy ERL_NIF_API_FUNC_MACRO(enif_thread_opts_destroy)
210 #  define enif_thread_create ERL_NIF_API_FUNC_MACRO(enif_thread_create)
211 #  define enif_thread_self ERL_NIF_API_FUNC_MACRO(enif_thread_self)
212 #  define enif_equal_tids ERL_NIF_API_FUNC_MACRO(enif_equal_tids)
213 #  define enif_thread_exit ERL_NIF_API_FUNC_MACRO(enif_thread_exit)
214 #  define enif_thread_join ERL_NIF_API_FUNC_MACRO(enif_thread_join)
215 
216 #  define enif_realloc ERL_NIF_API_FUNC_MACRO(enif_realloc)
217 #  define enif_system_info ERL_NIF_API_FUNC_MACRO(enif_system_info)
218 #  define enif_fprintf ERL_NIF_API_FUNC_MACRO(enif_fprintf)
219 #  define enif_inspect_iolist_as_binary ERL_NIF_API_FUNC_MACRO(enif_inspect_iolist_as_binary)
220 #  define enif_make_sub_binary ERL_NIF_API_FUNC_MACRO(enif_make_sub_binary)
221 #  define enif_get_string ERL_NIF_API_FUNC_MACRO(enif_get_string)
222 #  define enif_get_atom ERL_NIF_API_FUNC_MACRO(enif_get_atom)
223 #  define enif_is_fun ERL_NIF_API_FUNC_MACRO(enif_is_fun)
224 #  define enif_is_pid ERL_NIF_API_FUNC_MACRO(enif_is_pid)
225 #  define enif_is_port ERL_NIF_API_FUNC_MACRO(enif_is_port)
226 #  define enif_get_uint ERL_NIF_API_FUNC_MACRO(enif_get_uint)
227 #  define enif_get_long ERL_NIF_API_FUNC_MACRO(enif_get_long)
228 #  define enif_make_uint ERL_NIF_API_FUNC_MACRO(enif_make_uint)
229 #  define enif_make_long ERL_NIF_API_FUNC_MACRO(enif_make_long)
230 #  define enif_make_tuple_from_array ERL_NIF_API_FUNC_MACRO(enif_make_tuple_from_array)
231 #  define enif_make_list_from_array ERL_NIF_API_FUNC_MACRO(enif_make_list_from_array)
232 #  define enif_is_empty_list ERL_NIF_API_FUNC_MACRO(enif_is_empty_list)
233 #  define enif_open_resource_type ERL_NIF_API_FUNC_MACRO(enif_open_resource_type)
234 #  define enif_alloc_resource ERL_NIF_API_FUNC_MACRO(enif_alloc_resource)
235 #  define enif_release_resource ERL_NIF_API_FUNC_MACRO(enif_release_resource)
236 #  define enif_make_resource ERL_NIF_API_FUNC_MACRO(enif_make_resource)
237 #  define enif_get_resource ERL_NIF_API_FUNC_MACRO(enif_get_resource)
238 #  define enif_sizeof_resource ERL_NIF_API_FUNC_MACRO(enif_sizeof_resource)
239 #  define enif_make_new_binary ERL_NIF_API_FUNC_MACRO(enif_make_new_binary)
240 #  define enif_is_list ERL_NIF_API_FUNC_MACRO(enif_is_list)
241 #  define enif_is_tuple ERL_NIF_API_FUNC_MACRO(enif_is_tuple)
242 #  define enif_get_atom_length ERL_NIF_API_FUNC_MACRO(enif_get_atom_length)
243 #  define enif_get_list_length ERL_NIF_API_FUNC_MACRO(enif_get_list_length)
244 #  define enif_make_atom_len ERL_NIF_API_FUNC_MACRO(enif_make_atom_len)
245 #  define enif_make_existing_atom_len ERL_NIF_API_FUNC_MACRO(enif_make_existing_atom_len)
246 #  define enif_make_string_len ERL_NIF_API_FUNC_MACRO(enif_make_string_len)
247 #  define enif_alloc_env ERL_NIF_API_FUNC_MACRO(enif_alloc_env)
248 #  define enif_free_env ERL_NIF_API_FUNC_MACRO(enif_free_env)
249 #  define enif_clear_env ERL_NIF_API_FUNC_MACRO(enif_clear_env)
250 #  define enif_send ERL_NIF_API_FUNC_MACRO(enif_send)
251 #  define enif_make_copy ERL_NIF_API_FUNC_MACRO(enif_make_copy)
252 #  define enif_self ERL_NIF_API_FUNC_MACRO(enif_self)
253 #  define enif_get_local_pid ERL_NIF_API_FUNC_MACRO(enif_get_local_pid)
254 #  define enif_keep_resource ERL_NIF_API_FUNC_MACRO(enif_keep_resource)
255 #  define enif_make_resource_binary ERL_NIF_API_FUNC_MACRO(enif_make_resource_binary)
256 #if  SIZEOF_LONG != 8
257 #  define enif_get_int64 ERL_NIF_API_FUNC_MACRO(enif_get_int64)
258 #  define enif_get_uint64 ERL_NIF_API_FUNC_MACRO(enif_get_uint64)
259 #  define enif_make_int64 ERL_NIF_API_FUNC_MACRO(enif_make_int64)
260 #  define enif_make_uint64 ERL_NIF_API_FUNC_MACRO(enif_make_uint64)
261 #endif
262 
263 #  define enif_is_exception ERL_NIF_API_FUNC_MACRO(enif_is_exception)
264 #  define enif_make_reverse_list ERL_NIF_API_FUNC_MACRO(enif_make_reverse_list)
265 #  define enif_is_number ERL_NIF_API_FUNC_MACRO(enif_is_number)
266 #  define enif_dlopen ERL_NIF_API_FUNC_MACRO(enif_dlopen)
267 #  define enif_dlsym ERL_NIF_API_FUNC_MACRO(enif_dlsym)
268 #  define enif_consume_timeslice ERL_NIF_API_FUNC_MACRO(enif_consume_timeslice)
269 
270 /*
271 ** Add new entries here
272 */
273 #endif
274 
275 
276 #if defined(__GNUC__) && !(defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_))
277 
278 /* Inline functions for compile time type checking of arguments to
279    variadic functions.
280 */
281 
282 #  define ERL_NIF_INLINE __inline__
283 
enif_make_tuple1(ErlNifEnv * env,ERL_NIF_TERM e1)284 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple1(ErlNifEnv* env,
285 						    ERL_NIF_TERM e1)
286 {
287     return enif_make_tuple(env, 1, e1);
288 }
289 
enif_make_tuple2(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2)290 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple2(ErlNifEnv* env,
291 						    ERL_NIF_TERM e1,
292 						    ERL_NIF_TERM e2)
293 {
294     return enif_make_tuple(env, 2, e1, e2);
295 }
296 
enif_make_tuple3(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3)297 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple3(ErlNifEnv* env,
298 						    ERL_NIF_TERM e1,
299 						    ERL_NIF_TERM e2,
300 						    ERL_NIF_TERM e3)
301 {
302     return enif_make_tuple(env, 3, e1, e2, e3);
303 }
304 
enif_make_tuple4(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4)305 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple4(ErlNifEnv* env,
306 						    ERL_NIF_TERM e1,
307 						    ERL_NIF_TERM e2,
308 						    ERL_NIF_TERM e3,
309 						    ERL_NIF_TERM e4)
310 {
311     return enif_make_tuple(env, 4, e1, e2, e3, e4);
312 }
313 
enif_make_tuple5(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4,ERL_NIF_TERM e5)314 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple5(ErlNifEnv* env,
315 						    ERL_NIF_TERM e1,
316 						    ERL_NIF_TERM e2,
317 						    ERL_NIF_TERM e3,
318 						    ERL_NIF_TERM e4,
319 						    ERL_NIF_TERM e5)
320 {
321     return enif_make_tuple(env, 5, e1, e2, e3, e4, e5);
322 }
323 
enif_make_tuple6(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4,ERL_NIF_TERM e5,ERL_NIF_TERM e6)324 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple6(ErlNifEnv* env,
325 						    ERL_NIF_TERM e1,
326 						    ERL_NIF_TERM e2,
327 						    ERL_NIF_TERM e3,
328 						    ERL_NIF_TERM e4,
329 						    ERL_NIF_TERM e5,
330 						    ERL_NIF_TERM e6)
331 {
332     return enif_make_tuple(env, 6, e1, e2, e3, e4, e5, e6);
333 }
334 
enif_make_tuple7(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4,ERL_NIF_TERM e5,ERL_NIF_TERM e6,ERL_NIF_TERM e7)335 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple7(ErlNifEnv* env,
336 						    ERL_NIF_TERM e1,
337 						    ERL_NIF_TERM e2,
338 						    ERL_NIF_TERM e3,
339 						    ERL_NIF_TERM e4,
340 						    ERL_NIF_TERM e5,
341 						    ERL_NIF_TERM e6,
342 						    ERL_NIF_TERM e7)
343 {
344     return enif_make_tuple(env, 7, e1, e2, e3, e4, e5, e6, e7);
345 }
346 
enif_make_tuple8(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4,ERL_NIF_TERM e5,ERL_NIF_TERM e6,ERL_NIF_TERM e7,ERL_NIF_TERM e8)347 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple8(ErlNifEnv* env,
348 						    ERL_NIF_TERM e1,
349 						    ERL_NIF_TERM e2,
350 						    ERL_NIF_TERM e3,
351 						    ERL_NIF_TERM e4,
352 						    ERL_NIF_TERM e5,
353 						    ERL_NIF_TERM e6,
354 						    ERL_NIF_TERM e7,
355 						    ERL_NIF_TERM e8)
356 {
357     return enif_make_tuple(env, 8, e1, e2, e3, e4, e5, e6, e7, e8);
358 }
359 
enif_make_tuple9(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4,ERL_NIF_TERM e5,ERL_NIF_TERM e6,ERL_NIF_TERM e7,ERL_NIF_TERM e8,ERL_NIF_TERM e9)360 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple9(ErlNifEnv* env,
361 						    ERL_NIF_TERM e1,
362 						    ERL_NIF_TERM e2,
363 						    ERL_NIF_TERM e3,
364 						    ERL_NIF_TERM e4,
365 						    ERL_NIF_TERM e5,
366 						    ERL_NIF_TERM e6,
367 						    ERL_NIF_TERM e7,
368 						    ERL_NIF_TERM e8,
369 						    ERL_NIF_TERM e9)
370 {
371     return enif_make_tuple(env, 9, e1, e2, e3, e4, e5, e6, e7, e8, e9);
372 }
373 
enif_make_list1(ErlNifEnv * env,ERL_NIF_TERM e1)374 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list1(ErlNifEnv* env,
375 						   ERL_NIF_TERM e1)
376 {
377     return enif_make_list(env, 1, e1);
378 }
379 
enif_make_list2(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2)380 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list2(ErlNifEnv* env,
381 						   ERL_NIF_TERM e1,
382 						   ERL_NIF_TERM e2)
383 {
384     return enif_make_list(env, 2, e1, e2);
385 }
386 
enif_make_list3(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3)387 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list3(ErlNifEnv* env,
388 						   ERL_NIF_TERM e1,
389 						   ERL_NIF_TERM e2,
390 						   ERL_NIF_TERM e3)
391 {
392     return enif_make_list(env, 3, e1, e2, e3);
393 }
394 
enif_make_list4(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4)395 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list4(ErlNifEnv* env,
396 						   ERL_NIF_TERM e1,
397 						   ERL_NIF_TERM e2,
398 						   ERL_NIF_TERM e3,
399 						   ERL_NIF_TERM e4)
400 {
401     return enif_make_list(env, 4, e1, e2, e3, e4);
402 }
403 
enif_make_list5(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4,ERL_NIF_TERM e5)404 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list5(ErlNifEnv* env,
405 						   ERL_NIF_TERM e1,
406 						   ERL_NIF_TERM e2,
407 						   ERL_NIF_TERM e3,
408 						   ERL_NIF_TERM e4,
409 						   ERL_NIF_TERM e5)
410 {
411     return enif_make_list(env, 5, e1, e2, e3, e4, e5);
412 }
413 
enif_make_list6(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4,ERL_NIF_TERM e5,ERL_NIF_TERM e6)414 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list6(ErlNifEnv* env,
415 						   ERL_NIF_TERM e1,
416 						   ERL_NIF_TERM e2,
417 						   ERL_NIF_TERM e3,
418 						   ERL_NIF_TERM e4,
419 						   ERL_NIF_TERM e5,
420 						   ERL_NIF_TERM e6)
421 {
422     return enif_make_list(env, 6, e1, e2, e3, e4, e5, e6);
423 }
424 
enif_make_list7(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4,ERL_NIF_TERM e5,ERL_NIF_TERM e6,ERL_NIF_TERM e7)425 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list7(ErlNifEnv* env,
426 						   ERL_NIF_TERM e1,
427 						   ERL_NIF_TERM e2,
428 						   ERL_NIF_TERM e3,
429 						   ERL_NIF_TERM e4,
430 						   ERL_NIF_TERM e5,
431 						   ERL_NIF_TERM e6,
432 						   ERL_NIF_TERM e7)
433 {
434     return enif_make_list(env, 7, e1, e2, e3, e4, e5, e6, e7);
435 }
436 
enif_make_list8(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4,ERL_NIF_TERM e5,ERL_NIF_TERM e6,ERL_NIF_TERM e7,ERL_NIF_TERM e8)437 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list8(ErlNifEnv* env,
438 						   ERL_NIF_TERM e1,
439 						   ERL_NIF_TERM e2,
440 						   ERL_NIF_TERM e3,
441 						   ERL_NIF_TERM e4,
442 						   ERL_NIF_TERM e5,
443 						   ERL_NIF_TERM e6,
444 						   ERL_NIF_TERM e7,
445 						   ERL_NIF_TERM e8)
446 {
447     return enif_make_list(env, 8, e1, e2, e3, e4, e5, e6, e7, e8);
448 }
449 
enif_make_list9(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4,ERL_NIF_TERM e5,ERL_NIF_TERM e6,ERL_NIF_TERM e7,ERL_NIF_TERM e8,ERL_NIF_TERM e9)450 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list9(ErlNifEnv* env,
451 						   ERL_NIF_TERM e1,
452 						   ERL_NIF_TERM e2,
453 						   ERL_NIF_TERM e3,
454 						   ERL_NIF_TERM e4,
455 						   ERL_NIF_TERM e5,
456 						   ERL_NIF_TERM e6,
457 						   ERL_NIF_TERM e7,
458 						   ERL_NIF_TERM e8,
459 						   ERL_NIF_TERM e9)
460 {
461     return enif_make_list(env, 9, e1, e2, e3, e4, e5, e6, e7, e8, e9);
462 }
463 
464 #  undef ERL_NIF_INLINE
465 
466 #else /* fallback with macros */
467 
468 #ifndef enif_make_list1
469 #  define enif_make_list1(ENV,E1) enif_make_list(ENV,1,E1)
470 #  define enif_make_list2(ENV,E1,E2) enif_make_list(ENV,2,E1,E2)
471 #  define enif_make_list3(ENV,E1,E2,E3) enif_make_list(ENV,3,E1,E2,E3)
472 #  define enif_make_list4(ENV,E1,E2,E3,E4) enif_make_list(ENV,4,E1,E2,E3,E4)
473 #  define enif_make_list5(ENV,E1,E2,E3,E4,E5) enif_make_list(ENV,5,E1,E2,E3,E4,E5)
474 #  define enif_make_list6(ENV,E1,E2,E3,E4,E5,E6) enif_make_list(ENV,6,E1,E2,E3,E4,E5,E6)
475 #  define enif_make_list7(ENV,E1,E2,E3,E4,E5,E6,E7) enif_make_list(ENV,7,E1,E2,E3,E4,E5,E6,E7)
476 #  define enif_make_list8(ENV,E1,E2,E3,E4,E5,E6,E7,E8) enif_make_list(ENV,8,E1,E2,E3,E4,E5,E6,E7,E8)
477 #  define enif_make_list9(ENV,E1,E2,E3,E4,E5,E6,E7,E8,E9) enif_make_list(ENV,9,E1,E2,E3,E4,E5,E6,E7,E8,E9)
478 #  define enif_make_tuple1(ENV,E1) enif_make_tuple(ENV,1,E1)
479 #  define enif_make_tuple2(ENV,E1,E2) enif_make_tuple(ENV,2,E1,E2)
480 #  define enif_make_tuple3(ENV,E1,E2,E3) enif_make_tuple(ENV,3,E1,E2,E3)
481 #  define enif_make_tuple4(ENV,E1,E2,E3,E4) enif_make_tuple(ENV,4,E1,E2,E3,E4)
482 #  define enif_make_tuple5(ENV,E1,E2,E3,E4,E5) enif_make_tuple(ENV,5,E1,E2,E3,E4,E5)
483 #  define enif_make_tuple6(ENV,E1,E2,E3,E4,E5,E6) enif_make_tuple(ENV,6,E1,E2,E3,E4,E5,E6)
484 #  define enif_make_tuple7(ENV,E1,E2,E3,E4,E5,E6,E7) enif_make_tuple(ENV,7,E1,E2,E3,E4,E5,E6,E7)
485 #  define enif_make_tuple8(ENV,E1,E2,E3,E4,E5,E6,E7,E8) enif_make_tuple(ENV,8,E1,E2,E3,E4,E5,E6,E7,E8)
486 #  define enif_make_tuple9(ENV,E1,E2,E3,E4,E5,E6,E7,E8,E9) enif_make_tuple(ENV,9,E1,E2,E3,E4,E5,E6,E7,E8,E9)
487 #endif
488 
489 #endif /* __GNUC__ && !WIN32 */
490 
491 #ifndef enif_make_pid
492 
493 #  define enif_make_pid(ENV, PID) ((const ERL_NIF_TERM)((PID)->pid))
494 
495 #if SIZEOF_LONG == 8
496 #  define enif_get_int64 enif_get_long
497 #  define enif_get_uint64 enif_get_ulong
498 #  define enif_make_int64 enif_make_long
499 #  define enif_make_uint64 enif_make_ulong
500 #endif
501 
502 #endif
503 
504