1 /*
2  * %CopyrightBegin%
3  *
4  * Copyright Ericsson AB 2009-2020. All Rights Reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * %CopyrightEnd%
19  */
20 
21 #if !defined(ERL_NIF_API_FUNC_DECL) && !defined(ERL_NIF_API_FUNC_MACRO)
22 #  error This file should not be included directly
23 #endif
24 
25 /*
26 ** WARNING: Add new ERL_NIF_API_FUNC_DECL entries at the bottom of the list
27 ** to keep compatibility on Windows!!!
28 **
29 ** And don't forget to increase ERL_NIF_MINOR_VERSION in erl_nif.h
30 ** when adding functions to the API.
31 */
32 #ifdef ERL_NIF_API_FUNC_DECL
33 ERL_NIF_API_FUNC_DECL(void*,enif_priv_data,(ErlNifEnv*));
34 ERL_NIF_API_FUNC_DECL(void*,enif_alloc,(size_t size));
35 ERL_NIF_API_FUNC_DECL(void,enif_free,(void* ptr));
36 ERL_NIF_API_FUNC_DECL(int,enif_is_atom,(ErlNifEnv*, ERL_NIF_TERM term));
37 ERL_NIF_API_FUNC_DECL(int,enif_is_binary,(ErlNifEnv*, ERL_NIF_TERM term));
38 ERL_NIF_API_FUNC_DECL(int,enif_is_ref,(ErlNifEnv*, ERL_NIF_TERM term));
39 ERL_NIF_API_FUNC_DECL(int,enif_inspect_binary,(ErlNifEnv*, ERL_NIF_TERM bin_term, ErlNifBinary* bin));
40 ERL_NIF_API_FUNC_DECL(int,enif_alloc_binary,(size_t size, ErlNifBinary* bin));
41 ERL_NIF_API_FUNC_DECL(int,enif_realloc_binary,(ErlNifBinary* bin, size_t size));
42 ERL_NIF_API_FUNC_DECL(void,enif_release_binary,(ErlNifBinary* bin));
43 ERL_NIF_API_FUNC_DECL(int,enif_get_int,(ErlNifEnv*, ERL_NIF_TERM term, int* ip));
44 ERL_NIF_API_FUNC_DECL(int,enif_get_ulong,(ErlNifEnv*, ERL_NIF_TERM term, unsigned long* ip));
45 ERL_NIF_API_FUNC_DECL(int,enif_get_double,(ErlNifEnv*, ERL_NIF_TERM term, double* dp));
46 ERL_NIF_API_FUNC_DECL(int,enif_get_list_cell,(ErlNifEnv* env, ERL_NIF_TERM term, ERL_NIF_TERM* head, ERL_NIF_TERM* tail));
47 ERL_NIF_API_FUNC_DECL(int,enif_get_tuple,(ErlNifEnv* env, ERL_NIF_TERM tpl, int* arity, const ERL_NIF_TERM** array));
48 ERL_NIF_API_FUNC_DECL(int,enif_is_identical,(ERL_NIF_TERM lhs, ERL_NIF_TERM rhs));
49 ERL_NIF_API_FUNC_DECL(int,enif_compare,(ERL_NIF_TERM lhs, ERL_NIF_TERM rhs));
50 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_binary,(ErlNifEnv* env, ErlNifBinary* bin));
51 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_badarg,(ErlNifEnv* env));
52 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_int,(ErlNifEnv* env, int i));
53 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_ulong,(ErlNifEnv* env, unsigned long i));
54 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_double,(ErlNifEnv* env, double d));
55 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_atom,(ErlNifEnv* env, const char* name));
56 ERL_NIF_API_FUNC_DECL(int,enif_make_existing_atom,(ErlNifEnv* env, const char* name, ERL_NIF_TERM* atom, ErlNifCharEncoding));
57 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_tuple,(ErlNifEnv* env, unsigned cnt, ...));
58 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_list,(ErlNifEnv* env, unsigned cnt, ...));
59 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_list_cell,(ErlNifEnv* env, ERL_NIF_TERM car, ERL_NIF_TERM cdr));
60 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_string,(ErlNifEnv* env, const char* string, ErlNifCharEncoding));
61 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_ref,(ErlNifEnv* env));
62 
63 ERL_NIF_API_FUNC_DECL(ErlNifMutex*,enif_mutex_create,(char *name));
64 ERL_NIF_API_FUNC_DECL(void,enif_mutex_destroy,(ErlNifMutex *mtx));
65 ERL_NIF_API_FUNC_DECL(int,enif_mutex_trylock,(ErlNifMutex *mtx));
66 ERL_NIF_API_FUNC_DECL(void,enif_mutex_lock,(ErlNifMutex *mtx));
67 ERL_NIF_API_FUNC_DECL(void,enif_mutex_unlock,(ErlNifMutex *mtx));
68 ERL_NIF_API_FUNC_DECL(ErlNifCond*,enif_cond_create,(char *name));
69 ERL_NIF_API_FUNC_DECL(void,enif_cond_destroy,(ErlNifCond *cnd));
70 ERL_NIF_API_FUNC_DECL(void,enif_cond_signal,(ErlNifCond *cnd));
71 ERL_NIF_API_FUNC_DECL(void,enif_cond_broadcast,(ErlNifCond *cnd));
72 ERL_NIF_API_FUNC_DECL(void,enif_cond_wait,(ErlNifCond *cnd, ErlNifMutex *mtx));
73 ERL_NIF_API_FUNC_DECL(ErlNifRWLock*,enif_rwlock_create,(char *name));
74 ERL_NIF_API_FUNC_DECL(void,enif_rwlock_destroy,(ErlNifRWLock *rwlck));
75 ERL_NIF_API_FUNC_DECL(int,enif_rwlock_tryrlock,(ErlNifRWLock *rwlck));
76 ERL_NIF_API_FUNC_DECL(void,enif_rwlock_rlock,(ErlNifRWLock *rwlck));
77 ERL_NIF_API_FUNC_DECL(void,enif_rwlock_runlock,(ErlNifRWLock *rwlck));
78 ERL_NIF_API_FUNC_DECL(int,enif_rwlock_tryrwlock,(ErlNifRWLock *rwlck));
79 ERL_NIF_API_FUNC_DECL(void,enif_rwlock_rwlock,(ErlNifRWLock *rwlck));
80 ERL_NIF_API_FUNC_DECL(void,enif_rwlock_rwunlock,(ErlNifRWLock *rwlck));
81 ERL_NIF_API_FUNC_DECL(int,enif_tsd_key_create,(char *name, ErlNifTSDKey *key));
82 ERL_NIF_API_FUNC_DECL(void,enif_tsd_key_destroy,(ErlNifTSDKey key));
83 ERL_NIF_API_FUNC_DECL(void,enif_tsd_set,(ErlNifTSDKey key, void *data));
84 ERL_NIF_API_FUNC_DECL(void*,enif_tsd_get,(ErlNifTSDKey key));
85 ERL_NIF_API_FUNC_DECL(ErlNifThreadOpts*,enif_thread_opts_create,(char *name));
86 ERL_NIF_API_FUNC_DECL(void,enif_thread_opts_destroy,(ErlNifThreadOpts *opts));
87 ERL_NIF_API_FUNC_DECL(int,enif_thread_create,(char *name,ErlNifTid *tid,void * (*func)(void *),void *args,ErlNifThreadOpts *opts));
88 ERL_NIF_API_FUNC_DECL(ErlNifTid,enif_thread_self,(void));
89 ERL_NIF_API_FUNC_DECL(int,enif_equal_tids,(ErlNifTid tid1, ErlNifTid tid2));
90 ERL_NIF_API_FUNC_DECL(void,enif_thread_exit,(void *resp));
91 ERL_NIF_API_FUNC_DECL(int,enif_thread_join,(ErlNifTid, void **respp));
92 
93 ERL_NIF_API_FUNC_DECL(void*,enif_realloc,(void* ptr, size_t size));
94 ERL_NIF_API_FUNC_DECL(void,enif_system_info,(ErlNifSysInfo *sip, size_t si_size));
95 ERL_NIF_API_FUNC_DECL(int,enif_fprintf,(FILE* filep, const char *format, ...));
96 ERL_NIF_API_FUNC_DECL(int,enif_inspect_iolist_as_binary,(ErlNifEnv*, ERL_NIF_TERM term, ErlNifBinary* bin));
97 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_sub_binary,(ErlNifEnv*, ERL_NIF_TERM bin_term, size_t pos, size_t size));
98 ERL_NIF_API_FUNC_DECL(int,enif_get_string,(ErlNifEnv*, ERL_NIF_TERM list, char* buf, unsigned len, ErlNifCharEncoding));
99 ERL_NIF_API_FUNC_DECL(int,enif_get_atom,(ErlNifEnv*, ERL_NIF_TERM atom, char* buf, unsigned len, ErlNifCharEncoding));
100 ERL_NIF_API_FUNC_DECL(int,enif_is_fun,(ErlNifEnv*, ERL_NIF_TERM term));
101 ERL_NIF_API_FUNC_DECL(int,enif_is_pid,(ErlNifEnv*, ERL_NIF_TERM term));
102 ERL_NIF_API_FUNC_DECL(int,enif_is_port,(ErlNifEnv*, ERL_NIF_TERM term));
103 ERL_NIF_API_FUNC_DECL(int,enif_get_uint,(ErlNifEnv*, ERL_NIF_TERM term, unsigned* ip));
104 ERL_NIF_API_FUNC_DECL(int,enif_get_long,(ErlNifEnv*, ERL_NIF_TERM term, long* ip));
105 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_uint,(ErlNifEnv*, unsigned i));
106 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_long,(ErlNifEnv*, long i));
107 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_tuple_from_array,(ErlNifEnv*, const ERL_NIF_TERM arr[], unsigned cnt));
108 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_list_from_array,(ErlNifEnv*, const ERL_NIF_TERM arr[], unsigned cnt));
109 ERL_NIF_API_FUNC_DECL(int,enif_is_empty_list,(ErlNifEnv*, ERL_NIF_TERM term));
110 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));
111 ERL_NIF_API_FUNC_DECL(void*,enif_alloc_resource,(ErlNifResourceType* type, size_t size));
112 ERL_NIF_API_FUNC_DECL(void,enif_release_resource,(void* obj));
113 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_resource,(ErlNifEnv*, void* obj));
114 ERL_NIF_API_FUNC_DECL(int,enif_get_resource,(ErlNifEnv*, ERL_NIF_TERM term, ErlNifResourceType* type, void** objp));
115 ERL_NIF_API_FUNC_DECL(size_t,enif_sizeof_resource,(void* obj));
116 ERL_NIF_API_FUNC_DECL(unsigned char*,enif_make_new_binary,(ErlNifEnv*,size_t size,ERL_NIF_TERM* termp));
117 ERL_NIF_API_FUNC_DECL(int,enif_is_list,(ErlNifEnv*, ERL_NIF_TERM term));
118 ERL_NIF_API_FUNC_DECL(int,enif_is_tuple,(ErlNifEnv*, ERL_NIF_TERM term));
119 ERL_NIF_API_FUNC_DECL(int,enif_get_atom_length,(ErlNifEnv*, ERL_NIF_TERM atom, unsigned* len, ErlNifCharEncoding));
120 ERL_NIF_API_FUNC_DECL(int,enif_get_list_length,(ErlNifEnv* env, ERL_NIF_TERM term, unsigned* len));
121 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM, enif_make_atom_len,(ErlNifEnv* env, const char* name, size_t len));
122 ERL_NIF_API_FUNC_DECL(int, enif_make_existing_atom_len,(ErlNifEnv* env, const char* name, size_t len, ERL_NIF_TERM* atom, ErlNifCharEncoding));
123 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_string_len,(ErlNifEnv* env, const char* string, size_t len, ErlNifCharEncoding));
124 ERL_NIF_API_FUNC_DECL(ErlNifEnv*,enif_alloc_env,(void));
125 ERL_NIF_API_FUNC_DECL(void,enif_free_env,(ErlNifEnv* env));
126 ERL_NIF_API_FUNC_DECL(void,enif_clear_env,(ErlNifEnv* env));
127 ERL_NIF_API_FUNC_DECL(int,enif_send,(ErlNifEnv* env, const ErlNifPid* to_pid, ErlNifEnv* msg_env, ERL_NIF_TERM msg));
128 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_copy,(ErlNifEnv* dst_env, ERL_NIF_TERM src_term));
129 ERL_NIF_API_FUNC_DECL(ErlNifPid*,enif_self,(ErlNifEnv* caller_env, ErlNifPid* pid));
130 ERL_NIF_API_FUNC_DECL(int,enif_get_local_pid,(ErlNifEnv* env, ERL_NIF_TERM, ErlNifPid* pid));
131 ERL_NIF_API_FUNC_DECL(void,enif_keep_resource,(void* obj));
132 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_resource_binary,(ErlNifEnv*,void* obj,const void* data, size_t size));
133 #if SIZEOF_LONG != 8
134 ERL_NIF_API_FUNC_DECL(int,enif_get_int64,(ErlNifEnv*, ERL_NIF_TERM term, ErlNifSInt64* ip));
135 ERL_NIF_API_FUNC_DECL(int,enif_get_uint64,(ErlNifEnv*, ERL_NIF_TERM term, ErlNifUInt64* ip));
136 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_int64,(ErlNifEnv*, ErlNifSInt64));
137 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_uint64,(ErlNifEnv*, ErlNifUInt64));
138 #endif
139 ERL_NIF_API_FUNC_DECL(int,enif_is_exception,(ErlNifEnv*, ERL_NIF_TERM term));
140 ERL_NIF_API_FUNC_DECL(int,enif_make_reverse_list,(ErlNifEnv*, ERL_NIF_TERM term, ERL_NIF_TERM *list));
141 ERL_NIF_API_FUNC_DECL(int,enif_is_number,(ErlNifEnv*, ERL_NIF_TERM term));
142 ERL_NIF_API_FUNC_DECL(void*,enif_dlopen,(const char* lib, void (*err_handler)(void*,const char*), void* err_arg));
143 ERL_NIF_API_FUNC_DECL(void*,enif_dlsym,(void* handle, const char* symbol, void (*err_handler)(void*,const char*), void* err_arg));
144 ERL_NIF_API_FUNC_DECL(int,enif_consume_timeslice,(ErlNifEnv*, int percent));
145 ERL_NIF_API_FUNC_DECL(int, enif_is_map, (ErlNifEnv* env, ERL_NIF_TERM term));
146 ERL_NIF_API_FUNC_DECL(int, enif_get_map_size, (ErlNifEnv* env, ERL_NIF_TERM term, size_t *size));
147 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM, enif_make_new_map, (ErlNifEnv* env));
148 ERL_NIF_API_FUNC_DECL(int, enif_make_map_put, (ErlNifEnv* env, ERL_NIF_TERM map_in, ERL_NIF_TERM key, ERL_NIF_TERM value, ERL_NIF_TERM* map_out));
149 ERL_NIF_API_FUNC_DECL(int, enif_get_map_value, (ErlNifEnv* env, ERL_NIF_TERM map, ERL_NIF_TERM key, ERL_NIF_TERM* value));
150 ERL_NIF_API_FUNC_DECL(int, enif_make_map_update, (ErlNifEnv* env, ERL_NIF_TERM map_in, ERL_NIF_TERM key, ERL_NIF_TERM value, ERL_NIF_TERM* map_out));
151 ERL_NIF_API_FUNC_DECL(int, enif_make_map_remove, (ErlNifEnv* env, ERL_NIF_TERM map_in, ERL_NIF_TERM key, ERL_NIF_TERM* map_out));
152 ERL_NIF_API_FUNC_DECL(int, enif_map_iterator_create, (ErlNifEnv *env, ERL_NIF_TERM map, ErlNifMapIterator *iter, ErlNifMapIteratorEntry entry));
153 ERL_NIF_API_FUNC_DECL(void, enif_map_iterator_destroy, (ErlNifEnv *env, ErlNifMapIterator *iter));
154 ERL_NIF_API_FUNC_DECL(int, enif_map_iterator_is_head, (ErlNifEnv *env, ErlNifMapIterator *iter));
155 ERL_NIF_API_FUNC_DECL(int, enif_map_iterator_is_tail, (ErlNifEnv *env, ErlNifMapIterator *iter));
156 ERL_NIF_API_FUNC_DECL(int, enif_map_iterator_next, (ErlNifEnv *env, ErlNifMapIterator *iter));
157 ERL_NIF_API_FUNC_DECL(int, enif_map_iterator_prev, (ErlNifEnv *env, ErlNifMapIterator *iter));
158 ERL_NIF_API_FUNC_DECL(int, enif_map_iterator_get_pair, (ErlNifEnv *env, ErlNifMapIterator *iter, ERL_NIF_TERM *key, ERL_NIF_TERM *value));
159 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_schedule_nif,(ErlNifEnv*,const char*,int,ERL_NIF_TERM (*)(ErlNifEnv*,int,const ERL_NIF_TERM[]),int,const ERL_NIF_TERM[]));
160 ERL_NIF_API_FUNC_DECL(int, enif_has_pending_exception, (ErlNifEnv *env, ERL_NIF_TERM* reason));
161 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM, enif_raise_exception, (ErlNifEnv *env, ERL_NIF_TERM reason));
162 ERL_NIF_API_FUNC_DECL(int,enif_getenv,(const char* key, char* value, size_t* value_size));
163 ERL_NIF_API_FUNC_DECL(ErlNifTime, enif_monotonic_time, (ErlNifTimeUnit));
164 ERL_NIF_API_FUNC_DECL(ErlNifTime, enif_time_offset, (ErlNifTimeUnit));
165 ERL_NIF_API_FUNC_DECL(ErlNifTime, enif_convert_time_unit, (ErlNifTime, ErlNifTimeUnit, ErlNifTimeUnit));
166 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM, enif_now_time, (ErlNifEnv *env));
167 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM, enif_cpu_time, (ErlNifEnv *env));
168 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM, enif_make_unique_integer, (ErlNifEnv *env, ErlNifUniqueInteger properties));
169 ERL_NIF_API_FUNC_DECL(int, enif_is_current_process_alive, (ErlNifEnv *env));
170 ERL_NIF_API_FUNC_DECL(int, enif_is_process_alive, (ErlNifEnv *env, ErlNifPid *pid));
171 ERL_NIF_API_FUNC_DECL(int, enif_is_port_alive, (ErlNifEnv *env, ErlNifPort *port_id));
172 ERL_NIF_API_FUNC_DECL(int, enif_get_local_port, (ErlNifEnv* env, ERL_NIF_TERM, ErlNifPort* port_id));
173 ERL_NIF_API_FUNC_DECL(int, enif_term_to_binary, (ErlNifEnv *env, ERL_NIF_TERM term, ErlNifBinary *bin));
174 ERL_NIF_API_FUNC_DECL(size_t, enif_binary_to_term, (ErlNifEnv *env, const unsigned char* data, size_t sz, ERL_NIF_TERM *term, unsigned int opts));
175 ERL_NIF_API_FUNC_DECL(int, enif_port_command, (ErlNifEnv *env, const ErlNifPort* to_port, ErlNifEnv *msg_env, ERL_NIF_TERM msg));
176 ERL_NIF_API_FUNC_DECL(int,enif_thread_type,(void));
177 ERL_NIF_API_FUNC_DECL(int,enif_snprintf,(char * buffer, size_t size, const char *format, ...));
178 ERL_NIF_API_FUNC_DECL(int,enif_select,(ErlNifEnv* env, ErlNifEvent e, enum ErlNifSelectFlags flags, void* obj, const ErlNifPid* pid, ERL_NIF_TERM ref));
179 ERL_NIF_API_FUNC_DECL(ErlNifResourceType*,enif_open_resource_type_x,(ErlNifEnv*, const char* name_str, const ErlNifResourceTypeInit*, ErlNifResourceFlags flags, ErlNifResourceFlags* tried));
180 ERL_NIF_API_FUNC_DECL(int, enif_monitor_process,(ErlNifEnv*,void* obj,const ErlNifPid*,ErlNifMonitor *monitor));
181 ERL_NIF_API_FUNC_DECL(int, enif_demonitor_process,(ErlNifEnv*,void* obj,const ErlNifMonitor *monitor));
182 ERL_NIF_API_FUNC_DECL(int, enif_compare_monitors,(const ErlNifMonitor*,const ErlNifMonitor*));
183 ERL_NIF_API_FUNC_DECL(ErlNifUInt64,enif_hash,(ErlNifHash type, ERL_NIF_TERM term, ErlNifUInt64 salt));
184 ERL_NIF_API_FUNC_DECL(int, enif_whereis_pid, (ErlNifEnv *env, ERL_NIF_TERM name, ErlNifPid *pid));
185 ERL_NIF_API_FUNC_DECL(int, enif_whereis_port, (ErlNifEnv *env, ERL_NIF_TERM name, ErlNifPort *port));
186 
187 ERL_NIF_API_FUNC_DECL(ErlNifIOQueue *,enif_ioq_create,(ErlNifIOQueueOpts opts));
188 ERL_NIF_API_FUNC_DECL(void,enif_ioq_destroy,(ErlNifIOQueue *q));
189 
190 ERL_NIF_API_FUNC_DECL(int,enif_ioq_enq_binary,(ErlNifIOQueue *q, ErlNifBinary *bin, size_t skip));
191 ERL_NIF_API_FUNC_DECL(int,enif_ioq_enqv,(ErlNifIOQueue *q, ErlNifIOVec *iov, size_t skip));
192 
193 ERL_NIF_API_FUNC_DECL(size_t,enif_ioq_size,(ErlNifIOQueue *q));
194 ERL_NIF_API_FUNC_DECL(int,enif_ioq_deq,(ErlNifIOQueue *q, size_t count, size_t *size));
195 
196 ERL_NIF_API_FUNC_DECL(SysIOVec*,enif_ioq_peek,(ErlNifIOQueue *q, int *iovlen));
197 
198 ERL_NIF_API_FUNC_DECL(int,enif_inspect_iovec,(ErlNifEnv *env, size_t max_length, ERL_NIF_TERM iovec_term, ERL_NIF_TERM *tail, ErlNifIOVec **iovec));
199 ERL_NIF_API_FUNC_DECL(void,enif_free_iovec,(ErlNifIOVec *iov));
200 
201 ERL_NIF_API_FUNC_DECL(int,enif_ioq_peek_head,(ErlNifEnv *env, ErlNifIOQueue *q, size_t *size, ERL_NIF_TERM *head));
202 
203 ERL_NIF_API_FUNC_DECL(char*,enif_mutex_name,(ErlNifMutex*));
204 ERL_NIF_API_FUNC_DECL(char*,enif_cond_name,(ErlNifCond*));
205 ERL_NIF_API_FUNC_DECL(char*,enif_rwlock_name,(ErlNifRWLock*));
206 ERL_NIF_API_FUNC_DECL(char*,enif_thread_name,(ErlNifTid));
207 
208 ERL_NIF_API_FUNC_DECL(int,enif_vfprintf,(FILE*, const char *fmt, va_list));
209 ERL_NIF_API_FUNC_DECL(int,enif_vsnprintf,(char*, size_t, const char *fmt, va_list));
210 
211 ERL_NIF_API_FUNC_DECL(int,enif_make_map_from_arrays,(ErlNifEnv *env, ERL_NIF_TERM keys[], ERL_NIF_TERM values[], size_t cnt, ERL_NIF_TERM *map_out));
212 
213 ERL_NIF_API_FUNC_DECL(int,enif_select_x,(ErlNifEnv* env, ErlNifEvent e, enum ErlNifSelectFlags flags, void* obj, const ErlNifPid* pid, ERL_NIF_TERM msg, ErlNifEnv* msg_env));
214 ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_monitor_term,(ErlNifEnv* env, const ErlNifMonitor*));
215 ERL_NIF_API_FUNC_DECL(void,enif_set_pid_undefined,(ErlNifPid* pid));
216 ERL_NIF_API_FUNC_DECL(int,enif_is_pid_undefined,(const ErlNifPid* pid));
217 
218 ERL_NIF_API_FUNC_DECL(ErlNifTermType,enif_term_type,(ErlNifEnv* env, ERL_NIF_TERM term));
219 ERL_NIF_API_FUNC_DECL(ErlNifResourceType*,enif_init_resource_type,(ErlNifEnv*, const char* name_str, const ErlNifResourceTypeInit*, ErlNifResourceFlags flags, ErlNifResourceFlags* tried));
220 ERL_NIF_API_FUNC_DECL(int,enif_dynamic_resource_call,(ErlNifEnv*, ERL_NIF_TERM mod, ERL_NIF_TERM name, ERL_NIF_TERM rsrc, void* call_data));
221 
222 /*
223 ** ADD NEW ENTRIES HERE (before this comment) !!!
224 */
225 #endif /* ERL_NIF_API_FUNC_DECL */
226 
227 /*
228 ** Please keep the ERL_NIF_API_FUNC_MACRO list below in the same order
229 ** as the ERL_NIF_API_FUNC_DECL list above
230 */
231 #ifdef ERL_NIF_API_FUNC_MACRO
232 #  define enif_priv_data ERL_NIF_API_FUNC_MACRO(enif_priv_data)
233 #  define enif_alloc ERL_NIF_API_FUNC_MACRO(enif_alloc)
234 #  define enif_free ERL_NIF_API_FUNC_MACRO(enif_free)
235 #  define enif_is_atom ERL_NIF_API_FUNC_MACRO(enif_is_atom)
236 #  define enif_is_binary ERL_NIF_API_FUNC_MACRO(enif_is_binary)
237 #  define enif_is_ref ERL_NIF_API_FUNC_MACRO(enif_is_ref)
238 #  define enif_inspect_binary ERL_NIF_API_FUNC_MACRO(enif_inspect_binary)
239 #  define enif_alloc_binary ERL_NIF_API_FUNC_MACRO(enif_alloc_binary)
240 #  define enif_realloc_binary ERL_NIF_API_FUNC_MACRO(enif_realloc_binary)
241 #  define enif_release_binary ERL_NIF_API_FUNC_MACRO(enif_release_binary)
242 #  define enif_get_int ERL_NIF_API_FUNC_MACRO(enif_get_int)
243 #  define enif_get_ulong ERL_NIF_API_FUNC_MACRO(enif_get_ulong)
244 #  define enif_get_double ERL_NIF_API_FUNC_MACRO(enif_get_double)
245 #  define enif_get_tuple ERL_NIF_API_FUNC_MACRO(enif_get_tuple)
246 #  define enif_get_list_cell ERL_NIF_API_FUNC_MACRO(enif_get_list_cell)
247 #  define enif_is_identical ERL_NIF_API_FUNC_MACRO(enif_is_identical)
248 #  define enif_compare ERL_NIF_API_FUNC_MACRO(enif_compare)
249 
250 #  define enif_make_binary ERL_NIF_API_FUNC_MACRO(enif_make_binary)
251 #  define enif_make_badarg ERL_NIF_API_FUNC_MACRO(enif_make_badarg)
252 #  define enif_make_int ERL_NIF_API_FUNC_MACRO(enif_make_int)
253 #  define enif_make_ulong ERL_NIF_API_FUNC_MACRO(enif_make_ulong)
254 #  define enif_make_double ERL_NIF_API_FUNC_MACRO(enif_make_double)
255 #  define enif_make_atom ERL_NIF_API_FUNC_MACRO(enif_make_atom)
256 #  define enif_make_existing_atom ERL_NIF_API_FUNC_MACRO(enif_make_existing_atom)
257 #  define enif_make_tuple ERL_NIF_API_FUNC_MACRO(enif_make_tuple)
258 #  define enif_make_list ERL_NIF_API_FUNC_MACRO(enif_make_list)
259 #  define enif_make_list_cell ERL_NIF_API_FUNC_MACRO(enif_make_list_cell)
260 #  define enif_make_string ERL_NIF_API_FUNC_MACRO(enif_make_string)
261 #  define enif_make_ref ERL_NIF_API_FUNC_MACRO(enif_make_ref)
262 
263 #  define enif_mutex_create ERL_NIF_API_FUNC_MACRO(enif_mutex_create)
264 #  define enif_mutex_destroy ERL_NIF_API_FUNC_MACRO(enif_mutex_destroy)
265 #  define enif_mutex_trylock ERL_NIF_API_FUNC_MACRO(enif_mutex_trylock)
266 #  define enif_mutex_lock ERL_NIF_API_FUNC_MACRO(enif_mutex_lock)
267 #  define enif_mutex_unlock ERL_NIF_API_FUNC_MACRO(enif_mutex_unlock)
268 #  define enif_cond_create ERL_NIF_API_FUNC_MACRO(enif_cond_create)
269 #  define enif_cond_destroy ERL_NIF_API_FUNC_MACRO(enif_cond_destroy)
270 #  define enif_cond_signal ERL_NIF_API_FUNC_MACRO(enif_cond_signal)
271 #  define enif_cond_broadcast ERL_NIF_API_FUNC_MACRO(enif_cond_broadcast)
272 #  define enif_cond_wait ERL_NIF_API_FUNC_MACRO(enif_cond_wait)
273 #  define enif_rwlock_create ERL_NIF_API_FUNC_MACRO(enif_rwlock_create)
274 #  define enif_rwlock_destroy ERL_NIF_API_FUNC_MACRO(enif_rwlock_destroy)
275 #  define enif_rwlock_tryrlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_tryrlock)
276 #  define enif_rwlock_rlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_rlock)
277 #  define enif_rwlock_runlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_runlock)
278 #  define enif_rwlock_tryrwlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_tryrwlock)
279 #  define enif_rwlock_rwlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_rwlock)
280 #  define enif_rwlock_rwunlock ERL_NIF_API_FUNC_MACRO(enif_rwlock_rwunlock)
281 #  define enif_tsd_key_create ERL_NIF_API_FUNC_MACRO(enif_tsd_key_create)
282 #  define enif_tsd_key_destroy ERL_NIF_API_FUNC_MACRO(enif_tsd_key_destroy)
283 #  define enif_tsd_set ERL_NIF_API_FUNC_MACRO(enif_tsd_set)
284 #  define enif_tsd_get ERL_NIF_API_FUNC_MACRO(enif_tsd_get)
285 #  define enif_thread_opts_create ERL_NIF_API_FUNC_MACRO(enif_thread_opts_create)
286 #  define enif_thread_opts_destroy ERL_NIF_API_FUNC_MACRO(enif_thread_opts_destroy)
287 #  define enif_thread_create ERL_NIF_API_FUNC_MACRO(enif_thread_create)
288 #  define enif_thread_self ERL_NIF_API_FUNC_MACRO(enif_thread_self)
289 #  define enif_equal_tids ERL_NIF_API_FUNC_MACRO(enif_equal_tids)
290 #  define enif_thread_exit ERL_NIF_API_FUNC_MACRO(enif_thread_exit)
291 #  define enif_thread_join ERL_NIF_API_FUNC_MACRO(enif_thread_join)
292 
293 #  define enif_realloc ERL_NIF_API_FUNC_MACRO(enif_realloc)
294 #  define enif_system_info ERL_NIF_API_FUNC_MACRO(enif_system_info)
295 #  define enif_fprintf ERL_NIF_API_FUNC_MACRO(enif_fprintf)
296 #  define enif_inspect_iolist_as_binary ERL_NIF_API_FUNC_MACRO(enif_inspect_iolist_as_binary)
297 #  define enif_make_sub_binary ERL_NIF_API_FUNC_MACRO(enif_make_sub_binary)
298 #  define enif_get_string ERL_NIF_API_FUNC_MACRO(enif_get_string)
299 #  define enif_get_atom ERL_NIF_API_FUNC_MACRO(enif_get_atom)
300 #  define enif_is_fun ERL_NIF_API_FUNC_MACRO(enif_is_fun)
301 #  define enif_is_pid ERL_NIF_API_FUNC_MACRO(enif_is_pid)
302 #  define enif_is_port ERL_NIF_API_FUNC_MACRO(enif_is_port)
303 #  define enif_get_uint ERL_NIF_API_FUNC_MACRO(enif_get_uint)
304 #  define enif_get_long ERL_NIF_API_FUNC_MACRO(enif_get_long)
305 #  define enif_make_uint ERL_NIF_API_FUNC_MACRO(enif_make_uint)
306 #  define enif_make_long ERL_NIF_API_FUNC_MACRO(enif_make_long)
307 #  define enif_make_tuple_from_array ERL_NIF_API_FUNC_MACRO(enif_make_tuple_from_array)
308 #  define enif_make_list_from_array ERL_NIF_API_FUNC_MACRO(enif_make_list_from_array)
309 #  define enif_is_empty_list ERL_NIF_API_FUNC_MACRO(enif_is_empty_list)
310 #  define enif_open_resource_type ERL_NIF_API_FUNC_MACRO(enif_open_resource_type)
311 #  define enif_alloc_resource ERL_NIF_API_FUNC_MACRO(enif_alloc_resource)
312 #  define enif_release_resource ERL_NIF_API_FUNC_MACRO(enif_release_resource)
313 #  define enif_make_resource ERL_NIF_API_FUNC_MACRO(enif_make_resource)
314 #  define enif_get_resource ERL_NIF_API_FUNC_MACRO(enif_get_resource)
315 #  define enif_sizeof_resource ERL_NIF_API_FUNC_MACRO(enif_sizeof_resource)
316 #  define enif_make_new_binary ERL_NIF_API_FUNC_MACRO(enif_make_new_binary)
317 #  define enif_is_list ERL_NIF_API_FUNC_MACRO(enif_is_list)
318 #  define enif_is_tuple ERL_NIF_API_FUNC_MACRO(enif_is_tuple)
319 #  define enif_get_atom_length ERL_NIF_API_FUNC_MACRO(enif_get_atom_length)
320 #  define enif_get_list_length ERL_NIF_API_FUNC_MACRO(enif_get_list_length)
321 #  define enif_make_atom_len ERL_NIF_API_FUNC_MACRO(enif_make_atom_len)
322 #  define enif_make_existing_atom_len ERL_NIF_API_FUNC_MACRO(enif_make_existing_atom_len)
323 #  define enif_make_string_len ERL_NIF_API_FUNC_MACRO(enif_make_string_len)
324 #  define enif_alloc_env ERL_NIF_API_FUNC_MACRO(enif_alloc_env)
325 #  define enif_free_env ERL_NIF_API_FUNC_MACRO(enif_free_env)
326 #  define enif_clear_env ERL_NIF_API_FUNC_MACRO(enif_clear_env)
327 #  define enif_send ERL_NIF_API_FUNC_MACRO(enif_send)
328 #  define enif_make_copy ERL_NIF_API_FUNC_MACRO(enif_make_copy)
329 #  define enif_self ERL_NIF_API_FUNC_MACRO(enif_self)
330 #  define enif_get_local_pid ERL_NIF_API_FUNC_MACRO(enif_get_local_pid)
331 #  define enif_keep_resource ERL_NIF_API_FUNC_MACRO(enif_keep_resource)
332 #  define enif_make_resource_binary ERL_NIF_API_FUNC_MACRO(enif_make_resource_binary)
333 #if  SIZEOF_LONG != 8
334 #  define enif_get_int64 ERL_NIF_API_FUNC_MACRO(enif_get_int64)
335 #  define enif_get_uint64 ERL_NIF_API_FUNC_MACRO(enif_get_uint64)
336 #  define enif_make_int64 ERL_NIF_API_FUNC_MACRO(enif_make_int64)
337 #  define enif_make_uint64 ERL_NIF_API_FUNC_MACRO(enif_make_uint64)
338 #endif
339 #  define enif_is_exception ERL_NIF_API_FUNC_MACRO(enif_is_exception)
340 #  define enif_make_reverse_list ERL_NIF_API_FUNC_MACRO(enif_make_reverse_list)
341 #  define enif_is_number ERL_NIF_API_FUNC_MACRO(enif_is_number)
342 #  define enif_dlopen ERL_NIF_API_FUNC_MACRO(enif_dlopen)
343 #  define enif_dlsym ERL_NIF_API_FUNC_MACRO(enif_dlsym)
344 #  define enif_consume_timeslice ERL_NIF_API_FUNC_MACRO(enif_consume_timeslice)
345 #  define enif_is_map ERL_NIF_API_FUNC_MACRO(enif_is_map)
346 #  define enif_get_map_size ERL_NIF_API_FUNC_MACRO(enif_get_map_size)
347 #  define enif_make_new_map ERL_NIF_API_FUNC_MACRO(enif_make_new_map)
348 #  define enif_make_map_put ERL_NIF_API_FUNC_MACRO(enif_make_map_put)
349 #  define enif_get_map_value ERL_NIF_API_FUNC_MACRO(enif_get_map_value)
350 #  define enif_make_map_update ERL_NIF_API_FUNC_MACRO(enif_make_map_update)
351 #  define enif_make_map_remove ERL_NIF_API_FUNC_MACRO(enif_make_map_remove)
352 #  define enif_map_iterator_create ERL_NIF_API_FUNC_MACRO(enif_map_iterator_create)
353 #  define enif_map_iterator_destroy ERL_NIF_API_FUNC_MACRO(enif_map_iterator_destroy)
354 #  define enif_map_iterator_is_head ERL_NIF_API_FUNC_MACRO(enif_map_iterator_is_head)
355 #  define enif_map_iterator_is_tail ERL_NIF_API_FUNC_MACRO(enif_map_iterator_is_tail)
356 #  define enif_map_iterator_next ERL_NIF_API_FUNC_MACRO(enif_map_iterator_next)
357 #  define enif_map_iterator_prev ERL_NIF_API_FUNC_MACRO(enif_map_iterator_prev)
358 #  define enif_map_iterator_get_pair ERL_NIF_API_FUNC_MACRO(enif_map_iterator_get_pair)
359 #  define enif_schedule_nif ERL_NIF_API_FUNC_MACRO(enif_schedule_nif)
360 #  define enif_has_pending_exception ERL_NIF_API_FUNC_MACRO(enif_has_pending_exception)
361 #  define enif_raise_exception ERL_NIF_API_FUNC_MACRO(enif_raise_exception)
362 #  define enif_getenv ERL_NIF_API_FUNC_MACRO(enif_getenv)
363 #  define enif_monotonic_time ERL_NIF_API_FUNC_MACRO(enif_monotonic_time)
364 #  define enif_time_offset ERL_NIF_API_FUNC_MACRO(enif_time_offset)
365 #  define enif_convert_time_unit ERL_NIF_API_FUNC_MACRO(enif_convert_time_unit)
366 #  define enif_now_time ERL_NIF_API_FUNC_MACRO(enif_now_time)
367 #  define enif_cpu_time ERL_NIF_API_FUNC_MACRO(enif_cpu_time)
368 #  define enif_make_unique_integer ERL_NIF_API_FUNC_MACRO(enif_make_unique_integer)
369 #  define enif_is_current_process_alive ERL_NIF_API_FUNC_MACRO(enif_is_current_process_alive)
370 #  define enif_is_process_alive ERL_NIF_API_FUNC_MACRO(enif_is_process_alive)
371 #  define enif_is_port_alive ERL_NIF_API_FUNC_MACRO(enif_is_port_alive)
372 #  define enif_get_local_port ERL_NIF_API_FUNC_MACRO(enif_get_local_port)
373 #  define enif_term_to_binary ERL_NIF_API_FUNC_MACRO(enif_term_to_binary)
374 #  define enif_binary_to_term ERL_NIF_API_FUNC_MACRO(enif_binary_to_term)
375 #  define enif_port_command ERL_NIF_API_FUNC_MACRO(enif_port_command)
376 #  define enif_thread_type ERL_NIF_API_FUNC_MACRO(enif_thread_type)
377 #  define enif_snprintf ERL_NIF_API_FUNC_MACRO(enif_snprintf)
378 #  define enif_select ERL_NIF_API_FUNC_MACRO(enif_select)
379 #  define enif_open_resource_type_x ERL_NIF_API_FUNC_MACRO(enif_open_resource_type_x)
380 #  define enif_monitor_process ERL_NIF_API_FUNC_MACRO(enif_monitor_process)
381 #  define enif_demonitor_process ERL_NIF_API_FUNC_MACRO(enif_demonitor_process)
382 #  define enif_compare_monitors ERL_NIF_API_FUNC_MACRO(enif_compare_monitors)
383 #  define enif_hash ERL_NIF_API_FUNC_MACRO(enif_hash)
384 #  define enif_whereis_pid ERL_NIF_API_FUNC_MACRO(enif_whereis_pid)
385 #  define enif_whereis_port ERL_NIF_API_FUNC_MACRO(enif_whereis_port)
386 #  define enif_ioq_create ERL_NIF_API_FUNC_MACRO(enif_ioq_create)
387 #  define enif_ioq_destroy ERL_NIF_API_FUNC_MACRO(enif_ioq_destroy)
388 #  define enif_ioq_enq ERL_NIF_API_FUNC_MACRO(enif_ioq_enq)
389 #  define enif_ioq_enq_binary ERL_NIF_API_FUNC_MACRO(enif_ioq_enq_binary)
390 #  define enif_ioq_enqv ERL_NIF_API_FUNC_MACRO(enif_ioq_enqv)
391 #  define enif_ioq_size ERL_NIF_API_FUNC_MACRO(enif_ioq_size)
392 #  define enif_ioq_deq ERL_NIF_API_FUNC_MACRO(enif_ioq_deq)
393 #  define enif_ioq_peek ERL_NIF_API_FUNC_MACRO(enif_ioq_peek)
394 #  define enif_inspect_iovec ERL_NIF_API_FUNC_MACRO(enif_inspect_iovec)
395 #  define enif_free_iovec ERL_NIF_API_FUNC_MACRO(enif_free_iovec)
396 #  define enif_ioq_peek_head ERL_NIF_API_FUNC_MACRO(enif_ioq_peek_head)
397 #  define enif_mutex_name ERL_NIF_API_FUNC_MACRO(enif_mutex_name)
398 #  define enif_cond_name ERL_NIF_API_FUNC_MACRO(enif_cond_name)
399 #  define enif_rwlock_name ERL_NIF_API_FUNC_MACRO(enif_rwlock_name)
400 #  define enif_thread_name ERL_NIF_API_FUNC_MACRO(enif_thread_name)
401 #  define enif_vfprintf ERL_NIF_API_FUNC_MACRO(enif_vfprintf)
402 #  define enif_vsnprintf ERL_NIF_API_FUNC_MACRO(enif_vsnprintf)
403 #  define enif_make_map_from_arrays ERL_NIF_API_FUNC_MACRO(enif_make_map_from_arrays)
404 #  define enif_select_x ERL_NIF_API_FUNC_MACRO(enif_select_x)
405 #  define enif_make_monitor_term ERL_NIF_API_FUNC_MACRO(enif_make_monitor_term)
406 #  define enif_set_pid_undefined ERL_NIF_API_FUNC_MACRO(enif_set_pid_undefined)
407 #  define enif_is_pid_undefined ERL_NIF_API_FUNC_MACRO(enif_is_pid_undefined)
408 #  define enif_term_type ERL_NIF_API_FUNC_MACRO(enif_term_type)
409 #  define enif_init_resource_type ERL_NIF_API_FUNC_MACRO(enif_init_resource_type)
410 #  define enif_dynamic_resource_call ERL_NIF_API_FUNC_MACRO(enif_dynamic_resource_call)
411 /*
412 ** ADD NEW ENTRIES HERE (before this comment)
413 */
414 
415 /*
416  * Conditional EXPERIMENTAL stuff always last
417  * Must be moved up and made unconditional to support binary backward
418  * compatibility on Windows.
419  */
420 #endif  /* ERL_NIF_API_FUNC_MACRO */
421 
422 
423 #if defined(__GNUC__) && !(defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_))
424 
425 /* Inline functions for compile time type checking of arguments to
426    variadic functions.
427 */
428 
429 #  define ERL_NIF_INLINE __inline__
430 
enif_make_tuple1(ErlNifEnv * env,ERL_NIF_TERM e1)431 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple1(ErlNifEnv* env,
432 						    ERL_NIF_TERM e1)
433 {
434     return enif_make_tuple(env, 1, e1);
435 }
436 
enif_make_tuple2(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2)437 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple2(ErlNifEnv* env,
438 						    ERL_NIF_TERM e1,
439 						    ERL_NIF_TERM e2)
440 {
441     return enif_make_tuple(env, 2, e1, e2);
442 }
443 
enif_make_tuple3(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3)444 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple3(ErlNifEnv* env,
445 						    ERL_NIF_TERM e1,
446 						    ERL_NIF_TERM e2,
447 						    ERL_NIF_TERM e3)
448 {
449     return enif_make_tuple(env, 3, e1, e2, e3);
450 }
451 
enif_make_tuple4(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4)452 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple4(ErlNifEnv* env,
453 						    ERL_NIF_TERM e1,
454 						    ERL_NIF_TERM e2,
455 						    ERL_NIF_TERM e3,
456 						    ERL_NIF_TERM e4)
457 {
458     return enif_make_tuple(env, 4, e1, e2, e3, e4);
459 }
460 
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)461 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple5(ErlNifEnv* env,
462 						    ERL_NIF_TERM e1,
463 						    ERL_NIF_TERM e2,
464 						    ERL_NIF_TERM e3,
465 						    ERL_NIF_TERM e4,
466 						    ERL_NIF_TERM e5)
467 {
468     return enif_make_tuple(env, 5, e1, e2, e3, e4, e5);
469 }
470 
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)471 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple6(ErlNifEnv* env,
472 						    ERL_NIF_TERM e1,
473 						    ERL_NIF_TERM e2,
474 						    ERL_NIF_TERM e3,
475 						    ERL_NIF_TERM e4,
476 						    ERL_NIF_TERM e5,
477 						    ERL_NIF_TERM e6)
478 {
479     return enif_make_tuple(env, 6, e1, e2, e3, e4, e5, e6);
480 }
481 
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)482 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple7(ErlNifEnv* env,
483 						    ERL_NIF_TERM e1,
484 						    ERL_NIF_TERM e2,
485 						    ERL_NIF_TERM e3,
486 						    ERL_NIF_TERM e4,
487 						    ERL_NIF_TERM e5,
488 						    ERL_NIF_TERM e6,
489 						    ERL_NIF_TERM e7)
490 {
491     return enif_make_tuple(env, 7, e1, e2, e3, e4, e5, e6, e7);
492 }
493 
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)494 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple8(ErlNifEnv* env,
495 						    ERL_NIF_TERM e1,
496 						    ERL_NIF_TERM e2,
497 						    ERL_NIF_TERM e3,
498 						    ERL_NIF_TERM e4,
499 						    ERL_NIF_TERM e5,
500 						    ERL_NIF_TERM e6,
501 						    ERL_NIF_TERM e7,
502 						    ERL_NIF_TERM e8)
503 {
504     return enif_make_tuple(env, 8, e1, e2, e3, e4, e5, e6, e7, e8);
505 }
506 
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)507 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_tuple9(ErlNifEnv* env,
508 						    ERL_NIF_TERM e1,
509 						    ERL_NIF_TERM e2,
510 						    ERL_NIF_TERM e3,
511 						    ERL_NIF_TERM e4,
512 						    ERL_NIF_TERM e5,
513 						    ERL_NIF_TERM e6,
514 						    ERL_NIF_TERM e7,
515 						    ERL_NIF_TERM e8,
516 						    ERL_NIF_TERM e9)
517 {
518     return enif_make_tuple(env, 9, e1, e2, e3, e4, e5, e6, e7, e8, e9);
519 }
520 
enif_make_list1(ErlNifEnv * env,ERL_NIF_TERM e1)521 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list1(ErlNifEnv* env,
522 						   ERL_NIF_TERM e1)
523 {
524     return enif_make_list(env, 1, e1);
525 }
526 
enif_make_list2(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2)527 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list2(ErlNifEnv* env,
528 						   ERL_NIF_TERM e1,
529 						   ERL_NIF_TERM e2)
530 {
531     return enif_make_list(env, 2, e1, e2);
532 }
533 
enif_make_list3(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3)534 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list3(ErlNifEnv* env,
535 						   ERL_NIF_TERM e1,
536 						   ERL_NIF_TERM e2,
537 						   ERL_NIF_TERM e3)
538 {
539     return enif_make_list(env, 3, e1, e2, e3);
540 }
541 
enif_make_list4(ErlNifEnv * env,ERL_NIF_TERM e1,ERL_NIF_TERM e2,ERL_NIF_TERM e3,ERL_NIF_TERM e4)542 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list4(ErlNifEnv* env,
543 						   ERL_NIF_TERM e1,
544 						   ERL_NIF_TERM e2,
545 						   ERL_NIF_TERM e3,
546 						   ERL_NIF_TERM e4)
547 {
548     return enif_make_list(env, 4, e1, e2, e3, e4);
549 }
550 
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)551 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list5(ErlNifEnv* env,
552 						   ERL_NIF_TERM e1,
553 						   ERL_NIF_TERM e2,
554 						   ERL_NIF_TERM e3,
555 						   ERL_NIF_TERM e4,
556 						   ERL_NIF_TERM e5)
557 {
558     return enif_make_list(env, 5, e1, e2, e3, e4, e5);
559 }
560 
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)561 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list6(ErlNifEnv* env,
562 						   ERL_NIF_TERM e1,
563 						   ERL_NIF_TERM e2,
564 						   ERL_NIF_TERM e3,
565 						   ERL_NIF_TERM e4,
566 						   ERL_NIF_TERM e5,
567 						   ERL_NIF_TERM e6)
568 {
569     return enif_make_list(env, 6, e1, e2, e3, e4, e5, e6);
570 }
571 
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)572 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list7(ErlNifEnv* env,
573 						   ERL_NIF_TERM e1,
574 						   ERL_NIF_TERM e2,
575 						   ERL_NIF_TERM e3,
576 						   ERL_NIF_TERM e4,
577 						   ERL_NIF_TERM e5,
578 						   ERL_NIF_TERM e6,
579 						   ERL_NIF_TERM e7)
580 {
581     return enif_make_list(env, 7, e1, e2, e3, e4, e5, e6, e7);
582 }
583 
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)584 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list8(ErlNifEnv* env,
585 						   ERL_NIF_TERM e1,
586 						   ERL_NIF_TERM e2,
587 						   ERL_NIF_TERM e3,
588 						   ERL_NIF_TERM e4,
589 						   ERL_NIF_TERM e5,
590 						   ERL_NIF_TERM e6,
591 						   ERL_NIF_TERM e7,
592 						   ERL_NIF_TERM e8)
593 {
594     return enif_make_list(env, 8, e1, e2, e3, e4, e5, e6, e7, e8);
595 }
596 
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)597 static ERL_NIF_INLINE ERL_NIF_TERM enif_make_list9(ErlNifEnv* env,
598 						   ERL_NIF_TERM e1,
599 						   ERL_NIF_TERM e2,
600 						   ERL_NIF_TERM e3,
601 						   ERL_NIF_TERM e4,
602 						   ERL_NIF_TERM e5,
603 						   ERL_NIF_TERM e6,
604 						   ERL_NIF_TERM e7,
605 						   ERL_NIF_TERM e8,
606 						   ERL_NIF_TERM e9)
607 {
608     return enif_make_list(env, 9, e1, e2, e3, e4, e5, e6, e7, e8, e9);
609 }
610 
611 #  undef ERL_NIF_INLINE
612 
613 #else /* fallback with macros */
614 
615 #ifndef enif_make_list1
616 #  define enif_make_list1(ENV,E1) enif_make_list(ENV,1,E1)
617 #  define enif_make_list2(ENV,E1,E2) enif_make_list(ENV,2,E1,E2)
618 #  define enif_make_list3(ENV,E1,E2,E3) enif_make_list(ENV,3,E1,E2,E3)
619 #  define enif_make_list4(ENV,E1,E2,E3,E4) enif_make_list(ENV,4,E1,E2,E3,E4)
620 #  define enif_make_list5(ENV,E1,E2,E3,E4,E5) enif_make_list(ENV,5,E1,E2,E3,E4,E5)
621 #  define enif_make_list6(ENV,E1,E2,E3,E4,E5,E6) enif_make_list(ENV,6,E1,E2,E3,E4,E5,E6)
622 #  define enif_make_list7(ENV,E1,E2,E3,E4,E5,E6,E7) enif_make_list(ENV,7,E1,E2,E3,E4,E5,E6,E7)
623 #  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)
624 #  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)
625 #  define enif_make_tuple1(ENV,E1) enif_make_tuple(ENV,1,E1)
626 #  define enif_make_tuple2(ENV,E1,E2) enif_make_tuple(ENV,2,E1,E2)
627 #  define enif_make_tuple3(ENV,E1,E2,E3) enif_make_tuple(ENV,3,E1,E2,E3)
628 #  define enif_make_tuple4(ENV,E1,E2,E3,E4) enif_make_tuple(ENV,4,E1,E2,E3,E4)
629 #  define enif_make_tuple5(ENV,E1,E2,E3,E4,E5) enif_make_tuple(ENV,5,E1,E2,E3,E4,E5)
630 #  define enif_make_tuple6(ENV,E1,E2,E3,E4,E5,E6) enif_make_tuple(ENV,6,E1,E2,E3,E4,E5,E6)
631 #  define enif_make_tuple7(ENV,E1,E2,E3,E4,E5,E6,E7) enif_make_tuple(ENV,7,E1,E2,E3,E4,E5,E6,E7)
632 #  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)
633 #  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)
634 #endif
635 
636 #endif /* __GNUC__ && !WIN32 */
637 
638 #ifndef enif_make_pid
639 
640 #  define enif_make_pid(ENV, PID) ((void)(ENV),(const ERL_NIF_TERM)((PID)->pid))
641 #  define enif_compare_pids(A, B) (enif_compare((A)->pid,(B)->pid))
642 #  define enif_select_read(ENV, E, OBJ, PID, MSG, MSG_ENV) \
643     enif_select_x(ENV, E, ERL_NIF_SELECT_READ | ERL_NIF_SELECT_CUSTOM_MSG, \
644                   OBJ, PID, MSG, MSG_ENV)
645 #  define enif_select_write(ENV, E, OBJ, PID, MSG, MSG_ENV) \
646     enif_select_x(ENV, E, ERL_NIF_SELECT_WRITE | ERL_NIF_SELECT_CUSTOM_MSG, \
647                   OBJ, PID, MSG, MSG_ENV)
648 #  define enif_select_error(ENV, E, OBJ, PID, MSG, MSG_ENV) \
649     enif_select_x(ENV, E, ERL_NIF_SELECT_ERROR | ERL_NIF_SELECT_CUSTOM_MSG, \
650                   OBJ, PID, MSG, MSG_ENV)
651 
652 #if SIZEOF_LONG == 8
653 #  define enif_get_int64 enif_get_long
654 #  define enif_get_uint64 enif_get_ulong
655 #  define enif_make_int64 enif_make_long
656 #  define enif_make_uint64 enif_make_ulong
657 #endif
658 
659 #endif
660 
661