1 /*
2  * %CopyrightBegin%
3  *
4  * Copyright Ericsson AB 2003-2018. 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 /*
22  * Include file for erlang driver writers using dynamic drivers on windows.
23  */
24 
25 /* Maybe this should be auto generated, but I'll leave that for now... */
26 
27 #ifndef _ERL_WIN_DYN_DRIVER_H
28 #define _ERL_WIN_DYN_DRIVER_H
29 
30 #define WDD_FTYPE(FunctionName) TWinDynDriver##FunctionName
31 
32 #define WDD_TYPEDEF(RetType, FunctionName, Params) \
33   typedef RetType WDD_FTYPE(FunctionName) Params
34 
35 WDD_TYPEDEF(int, null_func,(void));
36 WDD_TYPEDEF(int, driver_failure_atom,(ErlDrvPort, char *));
37 WDD_TYPEDEF(int, driver_failure_posix,(ErlDrvPort, int));
38 WDD_TYPEDEF(int, driver_failure,(ErlDrvPort, int));
39 WDD_TYPEDEF(int, driver_exit, (ErlDrvPort, int));
40 WDD_TYPEDEF(int, driver_failure_eof, (ErlDrvPort));
41 WDD_TYPEDEF(void, erl_drv_busy_msgq_limits, (ErlDrvPort, ErlDrvSizeT *, ErlDrvSizeT *));
42 WDD_TYPEDEF(int, driver_select, (ErlDrvPort, ErlDrvEvent, int, int));
43 WDD_TYPEDEF(int, driver_output, (ErlDrvPort, char *, ErlDrvSizeT));
44 WDD_TYPEDEF(int, driver_output2, (ErlDrvPort, char *, ErlDrvSizeT ,char *, ErlDrvSizeT));
45 WDD_TYPEDEF(int, driver_output_binary, (ErlDrvPort, char *, ErlDrvSizeT, ErlDrvBinary*, ErlDrvSizeT, ErlDrvSizeT));
46 WDD_TYPEDEF(int, driver_outputv, (ErlDrvPort, char*, ErlDrvSizeT, ErlIOVec *, ErlDrvSizeT));
47 WDD_TYPEDEF(ErlDrvSizeT, driver_vec_to_buf, (ErlIOVec *, char *, ErlDrvSizeT));
48 WDD_TYPEDEF(int, driver_set_timer, (ErlDrvPort, unsigned long));
49 WDD_TYPEDEF(int, driver_cancel_timer, (ErlDrvPort));
50 WDD_TYPEDEF(int, driver_read_timer, (ErlDrvPort, unsigned long *));
51 WDD_TYPEDEF(int, erl_drv_consume_timeslice, (ErlDrvPort, int));
52 WDD_TYPEDEF(char *, erl_errno_id, (int));
53 WDD_TYPEDEF(void, set_busy_port, (ErlDrvPort, int));
54 WDD_TYPEDEF(void, set_port_control_flags, (ErlDrvPort, int));
55 WDD_TYPEDEF(int, get_port_flags, (ErlDrvPort));
56 WDD_TYPEDEF(ErlDrvBinary *, driver_alloc_binary, (ErlDrvSizeT));
57 WDD_TYPEDEF(ErlDrvBinary *, driver_realloc_binary, (ErlDrvBinary *, ErlDrvSizeT));
58 WDD_TYPEDEF(void, driver_free_binary, (ErlDrvBinary *));
59 WDD_TYPEDEF(void *, driver_alloc, (ErlDrvSizeT));
60 WDD_TYPEDEF(void *, driver_realloc, (void *, ErlDrvSizeT));
61 WDD_TYPEDEF(void, driver_free, (void *));
62 WDD_TYPEDEF(int, driver_enq, (ErlDrvPort, char*, ErlDrvSizeT));
63 WDD_TYPEDEF(int, driver_pushq, (ErlDrvPort, char*, ErlDrvSizeT));
64 WDD_TYPEDEF(ErlDrvSizeT, driver_deq, (ErlDrvPort, ErlDrvSizeT));
65 WDD_TYPEDEF(ErlDrvSizeT, driver_sizeq, (ErlDrvPort));
66 WDD_TYPEDEF(int, driver_enq_bin, (ErlDrvPort, ErlDrvBinary *, ErlDrvSizeT, ErlDrvSizeT));
67 WDD_TYPEDEF(int, driver_pushq_bin, (ErlDrvPort, ErlDrvBinary *, ErlDrvSizeT, ErlDrvSizeT));
68 WDD_TYPEDEF(ErlDrvSizeT, driver_peekqv, (ErlDrvPort, ErlIOVec *));
69 WDD_TYPEDEF(SysIOVec *, driver_peekq, (ErlDrvPort, int *));
70 WDD_TYPEDEF(int, driver_enqv, (ErlDrvPort, ErlIOVec *, ErlDrvSizeT));
71 WDD_TYPEDEF(int, driver_pushqv, (ErlDrvPort, ErlIOVec *, ErlDrvSizeT));
72 WDD_TYPEDEF(void, add_driver_entry, (ErlDrvEntry *));
73 WDD_TYPEDEF(int, remove_driver_entry, (ErlDrvEntry *));
74 WDD_TYPEDEF(ErlDrvTermData, driver_mk_atom, (char*));
75 WDD_TYPEDEF(ErlDrvTermData, driver_mk_port,(ErlDrvPort));
76 WDD_TYPEDEF(ErlDrvTermData, driver_connected,(ErlDrvPort));
77 WDD_TYPEDEF(ErlDrvTermData, driver_caller,(ErlDrvPort));
78 WDD_TYPEDEF(ErlDrvTermData, driver_mk_term_nil,(void));
79 WDD_TYPEDEF(int, erl_drv_output_term, (ErlDrvTermData, ErlDrvTermData*, int));
80 WDD_TYPEDEF(int, driver_output_term, (ErlDrvPort, ErlDrvTermData*, int));
81 WDD_TYPEDEF(int, erl_drv_send_term, (ErlDrvTermData, ErlDrvTermData, ErlDrvTermData*, int));
82 WDD_TYPEDEF(int, driver_send_term, (ErlDrvPort, ErlDrvTermData, ErlDrvTermData*, int));
83 WDD_TYPEDEF(unsigned int, driver_async_port_key, (ErlDrvPort));
84 WDD_TYPEDEF(long, driver_async, (ErlDrvPort,unsigned int*,void (*)(void*),void*,void (*)(void*)));
85 WDD_TYPEDEF(int, driver_lock_driver, (ErlDrvPort));
86 WDD_TYPEDEF(void *, driver_dl_open, (char *));
87 WDD_TYPEDEF(void *, driver_dl_sym, (void *, char *));
88 WDD_TYPEDEF(int, driver_dl_close, (void *));
89 WDD_TYPEDEF(char *, driver_dl_error, (void));
90 WDD_TYPEDEF(ErlDrvUInt, erts_alc_test, (ErlDrvUInt,
91 					ErlDrvUInt,
92 					ErlDrvUInt,
93 					ErlDrvUInt));
94 WDD_TYPEDEF(ErlDrvSInt, driver_binary_get_refc, (ErlDrvBinary *dbp));
95 WDD_TYPEDEF(ErlDrvSInt, driver_binary_inc_refc, (ErlDrvBinary *dbp));
96 WDD_TYPEDEF(ErlDrvSInt, driver_binary_dec_refc, (ErlDrvBinary *dbp));
97 WDD_TYPEDEF(ErlDrvPDL, driver_pdl_create, (ErlDrvPort));
98 WDD_TYPEDEF(void, driver_pdl_lock, (ErlDrvPDL));
99 WDD_TYPEDEF(void, driver_pdl_unlock, (ErlDrvPDL));
100 WDD_TYPEDEF(ErlDrvSInt, driver_pdl_get_refc, (ErlDrvPDL));
101 WDD_TYPEDEF(ErlDrvSInt, driver_pdl_inc_refc, (ErlDrvPDL));
102 WDD_TYPEDEF(ErlDrvSInt, driver_pdl_dec_refc, (ErlDrvPDL));
103 WDD_TYPEDEF(void, driver_system_info, (ErlDrvSysInfo *, size_t));
104 WDD_TYPEDEF(int, driver_get_now, (ErlDrvNowData *));
105 WDD_TYPEDEF(ErlDrvTime, erl_drv_monotonic_time, (ErlDrvTimeUnit));
106 WDD_TYPEDEF(ErlDrvTime, erl_drv_time_offset, (ErlDrvTimeUnit));
107 WDD_TYPEDEF(ErlDrvTime, erl_drv_convert_time_unit, (ErlDrvTime,
108 						    ErlDrvTimeUnit,
109 						    ErlDrvTimeUnit));
110 WDD_TYPEDEF(int, driver_monitor_process, (ErlDrvPort port,
111 					  ErlDrvTermData process,
112 					  ErlDrvMonitor *monitor));
113 WDD_TYPEDEF(int, driver_demonitor_process, (ErlDrvPort port,
114 					    const ErlDrvMonitor *monitor));
115 WDD_TYPEDEF(ErlDrvTermData,  driver_get_monitored_process,
116 	    (ErlDrvPort port, const ErlDrvMonitor *monitor));
117 WDD_TYPEDEF(int,  driver_compare_monitors,
118 	    (const ErlDrvMonitor *, const ErlDrvMonitor *));
119 WDD_TYPEDEF(ErlDrvMutex *, erl_drv_mutex_create, (char *name));
120 WDD_TYPEDEF(void, erl_drv_mutex_destroy, (ErlDrvMutex *mtx));
121 WDD_TYPEDEF(int, erl_drv_mutex_trylock, (ErlDrvMutex *mtx));
122 WDD_TYPEDEF(void, erl_drv_mutex_lock, (ErlDrvMutex *mtx));
123 WDD_TYPEDEF(void, erl_drv_mutex_unlock, (ErlDrvMutex *mtx));
124 WDD_TYPEDEF(ErlDrvCond *, erl_drv_cond_create, (char *name));
125 WDD_TYPEDEF(void, erl_drv_cond_destroy, (ErlDrvCond *cnd));
126 WDD_TYPEDEF(void, erl_drv_cond_signal, (ErlDrvCond *cnd));
127 WDD_TYPEDEF(void, erl_drv_cond_broadcast, (ErlDrvCond *cnd));
128 WDD_TYPEDEF(void, erl_drv_cond_wait, (ErlDrvCond *cnd, ErlDrvMutex *mtx));
129 WDD_TYPEDEF(ErlDrvRWLock *, erl_drv_rwlock_create, (char *name));
130 WDD_TYPEDEF(void, erl_drv_rwlock_destroy, (ErlDrvRWLock *rwlck));
131 WDD_TYPEDEF(int, erl_drv_rwlock_tryrlock, (ErlDrvRWLock *rwlck));
132 WDD_TYPEDEF(void, erl_drv_rwlock_rlock, (ErlDrvRWLock *rwlck));
133 WDD_TYPEDEF(void, erl_drv_rwlock_runlock, (ErlDrvRWLock *rwlck));
134 WDD_TYPEDEF(int, erl_drv_rwlock_tryrwlock, (ErlDrvRWLock *rwlck));
135 WDD_TYPEDEF(void, erl_drv_rwlock_rwlock, (ErlDrvRWLock *rwlck));
136 WDD_TYPEDEF(void, erl_drv_rwlock_rwunlock, (ErlDrvRWLock *rwlck));
137 WDD_TYPEDEF(int, erl_drv_tsd_key_create, (char *name, ErlDrvTSDKey *key));
138 WDD_TYPEDEF(void, erl_drv_tsd_key_destroy, (ErlDrvTSDKey key));
139 WDD_TYPEDEF(void, erl_drv_tsd_set, (ErlDrvTSDKey key, void *data));
140 WDD_TYPEDEF(void *, erl_drv_tsd_get, (ErlDrvTSDKey key));
141 WDD_TYPEDEF(ErlDrvThreadOpts *, erl_drv_thread_opts_create, (char *name));
142 WDD_TYPEDEF(void, erl_drv_thread_opts_destroy, (ErlDrvThreadOpts *opts));
143 WDD_TYPEDEF(int, erl_drv_thread_create, (char *name,
144 					 ErlDrvTid *tid,
145 					 void * (*func)(void *),
146 					 void *args,
147 					 ErlDrvThreadOpts *opts));
148 WDD_TYPEDEF(ErlDrvTid, erl_drv_thread_self, (void));
149 WDD_TYPEDEF(int, erl_drv_equal_tids, (ErlDrvTid tid1, ErlDrvTid tid2));
150 WDD_TYPEDEF(void, erl_drv_thread_exit, (void *resp));
151 WDD_TYPEDEF(int, erl_drv_thread_join, (ErlDrvTid, void **respp));
152 WDD_TYPEDEF(int, erl_drv_putenv, (const char *key, char *value));
153 WDD_TYPEDEF(int, erl_drv_getenv, (const char *key, char *value, size_t *value_size));
154 
155 typedef struct {
156     WDD_FTYPE(null_func) *null_func;
157     WDD_FTYPE(driver_failure_atom) *driver_failure_atom;
158     WDD_FTYPE(driver_failure_posix) *driver_failure_posix;
159     WDD_FTYPE(driver_failure) *driver_failure;
160     WDD_FTYPE(driver_exit) *driver_exit;
161     WDD_FTYPE(driver_failure_eof) *driver_failure_eof;
162     WDD_FTYPE(erl_drv_busy_msgq_limits) *erl_drv_busy_msgq_limits;
163     WDD_FTYPE(driver_select) *driver_select;
164     void *REMOVED_driver_event;
165     WDD_FTYPE(driver_output) *driver_output;
166     WDD_FTYPE(driver_output2) *driver_output2;
167     WDD_FTYPE(driver_output_binary) *driver_output_binary;
168     WDD_FTYPE(driver_outputv) *driver_outputv;
169     WDD_FTYPE(driver_vec_to_buf) *driver_vec_to_buf;
170     WDD_FTYPE(driver_set_timer) *driver_set_timer;
171     WDD_FTYPE(driver_cancel_timer) *driver_cancel_timer;
172     WDD_FTYPE(driver_read_timer) *driver_read_timer;
173     WDD_FTYPE(erl_drv_consume_timeslice) *erl_drv_consume_timeslice;
174     WDD_FTYPE(erl_errno_id) *erl_errno_id;
175     WDD_FTYPE(set_busy_port)* set_busy_port;
176     WDD_FTYPE(set_port_control_flags) *set_port_control_flags;
177     WDD_FTYPE(get_port_flags) *get_port_flags;
178     WDD_FTYPE(driver_alloc_binary) *driver_alloc_binary;
179     WDD_FTYPE(driver_realloc_binary) *driver_realloc_binary;
180     WDD_FTYPE(driver_free_binary) *driver_free_binary;
181     WDD_FTYPE(driver_alloc) *driver_alloc;
182     WDD_FTYPE(driver_realloc) *driver_realloc;
183     WDD_FTYPE(driver_free) *driver_free;
184     WDD_FTYPE(driver_enq) *driver_enq;
185     WDD_FTYPE(driver_pushq) *driver_pushq;
186     WDD_FTYPE(driver_deq) *driver_deq;
187     WDD_FTYPE(driver_sizeq) *driver_sizeq;
188     WDD_FTYPE(driver_enq_bin)* driver_enq_bin;
189     WDD_FTYPE(driver_pushq_bin) *driver_pushq_bin;
190     WDD_FTYPE(driver_peekqv) *driver_peekqv;
191     WDD_FTYPE(driver_peekq) *driver_peekq;
192     WDD_FTYPE(driver_enqv) *driver_enqv;
193     WDD_FTYPE(driver_pushqv) *driver_pushqv;
194     WDD_FTYPE(add_driver_entry) *add_driver_entry;
195     WDD_FTYPE(remove_driver_entry) *remove_driver_entry;
196     WDD_FTYPE(driver_mk_atom) *driver_mk_atom;
197     WDD_FTYPE(driver_mk_port) *driver_mk_port;
198     WDD_FTYPE(driver_connected) *driver_connected;
199     WDD_FTYPE(driver_caller) *driver_caller;
200     WDD_FTYPE(driver_mk_term_nil) *driver_mk_term_nil;
201     WDD_FTYPE(erl_drv_output_term) *erl_drv_output_term;
202     WDD_FTYPE(driver_output_term) *driver_output_term;
203     WDD_FTYPE(erl_drv_send_term) *erl_drv_send_term;
204     WDD_FTYPE(driver_send_term) *driver_send_term;
205     WDD_FTYPE(driver_async_port_key) *driver_async_port_key;
206     WDD_FTYPE(driver_async) *driver_async;
207     WDD_FTYPE(driver_lock_driver) *driver_lock_driver;
208     WDD_FTYPE(driver_dl_open) *driver_dl_open;
209     WDD_FTYPE(driver_dl_sym) *driver_dl_sym;
210     WDD_FTYPE(driver_dl_close) *driver_dl_close;
211     WDD_FTYPE(driver_dl_error) *driver_dl_error;
212     WDD_FTYPE(erts_alc_test) *erts_alc_test;
213     WDD_FTYPE(driver_binary_get_refc) *driver_binary_get_refc;
214     WDD_FTYPE(driver_binary_inc_refc) *driver_binary_inc_refc;
215     WDD_FTYPE(driver_binary_dec_refc) *driver_binary_dec_refc;
216     WDD_FTYPE(driver_pdl_create) *driver_pdl_create;
217     WDD_FTYPE(driver_pdl_lock) *driver_pdl_lock;
218     WDD_FTYPE(driver_pdl_unlock) *driver_pdl_unlock;
219     WDD_FTYPE(driver_pdl_get_refc) *driver_pdl_get_refc;
220     WDD_FTYPE(driver_pdl_inc_refc) *driver_pdl_inc_refc;
221     WDD_FTYPE(driver_pdl_dec_refc) *driver_pdl_dec_refc;
222     WDD_FTYPE(driver_system_info) *driver_system_info;
223     WDD_FTYPE(driver_get_now) *driver_get_now;
224     WDD_FTYPE(erl_drv_monotonic_time) *erl_drv_monotonic_time;
225     WDD_FTYPE(erl_drv_time_offset) *erl_drv_time_offset;
226     WDD_FTYPE(erl_drv_convert_time_unit) *erl_drv_convert_time_unit;
227     WDD_FTYPE(driver_monitor_process) *driver_monitor_process;
228     WDD_FTYPE(driver_demonitor_process) *driver_demonitor_process;
229     WDD_FTYPE(driver_get_monitored_process) *driver_get_monitored_process;
230     WDD_FTYPE(driver_compare_monitors) *driver_compare_monitors;
231     WDD_FTYPE(erl_drv_mutex_create) *erl_drv_mutex_create;
232     WDD_FTYPE(erl_drv_mutex_destroy) *erl_drv_mutex_destroy;
233     WDD_FTYPE(erl_drv_mutex_trylock) *erl_drv_mutex_trylock;
234     WDD_FTYPE(erl_drv_mutex_lock) *erl_drv_mutex_lock;
235     WDD_FTYPE(erl_drv_mutex_unlock) *erl_drv_mutex_unlock;
236     WDD_FTYPE(erl_drv_cond_create) *erl_drv_cond_create;
237     WDD_FTYPE(erl_drv_cond_destroy) *erl_drv_cond_destroy;
238     WDD_FTYPE(erl_drv_cond_signal) *erl_drv_cond_signal;
239     WDD_FTYPE(erl_drv_cond_broadcast) *erl_drv_cond_broadcast;
240     WDD_FTYPE(erl_drv_cond_wait) *erl_drv_cond_wait;
241     WDD_FTYPE(erl_drv_rwlock_create) *erl_drv_rwlock_create;
242     WDD_FTYPE(erl_drv_rwlock_destroy) *erl_drv_rwlock_destroy;
243     WDD_FTYPE(erl_drv_rwlock_tryrlock) *erl_drv_rwlock_tryrlock;
244     WDD_FTYPE(erl_drv_rwlock_rlock) *erl_drv_rwlock_rlock;
245     WDD_FTYPE(erl_drv_rwlock_runlock) *erl_drv_rwlock_runlock;
246     WDD_FTYPE(erl_drv_rwlock_tryrwlock) *erl_drv_rwlock_tryrwlock;
247     WDD_FTYPE(erl_drv_rwlock_rwlock) *erl_drv_rwlock_rwlock;
248     WDD_FTYPE(erl_drv_rwlock_rwunlock) *erl_drv_rwlock_rwunlock;
249     WDD_FTYPE(erl_drv_tsd_key_create) *erl_drv_tsd_key_create;
250     WDD_FTYPE(erl_drv_tsd_key_destroy) *erl_drv_tsd_key_destroy;
251     WDD_FTYPE(erl_drv_tsd_set) *erl_drv_tsd_set;
252     WDD_FTYPE(erl_drv_tsd_get) *erl_drv_tsd_get;
253     WDD_FTYPE(erl_drv_thread_opts_create) *erl_drv_thread_opts_create;
254     WDD_FTYPE(erl_drv_thread_opts_destroy) *erl_drv_thread_opts_destroy;
255     WDD_FTYPE(erl_drv_thread_create) *erl_drv_thread_create;
256     WDD_FTYPE(erl_drv_thread_self) *erl_drv_thread_self;
257     WDD_FTYPE(erl_drv_equal_tids) *erl_drv_equal_tids;
258     WDD_FTYPE(erl_drv_thread_exit) *erl_drv_thread_exit;
259     WDD_FTYPE(erl_drv_thread_join) *erl_drv_thread_join;
260     WDD_FTYPE(erl_drv_putenv) *erl_drv_putenv;
261     WDD_FTYPE(erl_drv_getenv) *erl_drv_getenv;
262   /* Add new calls here */
263 } TWinDynDriverCallbacks;
264 
265 /* This header is included explicitly by the ddll static driver, it musn't define things then */
266 #ifndef STATIC_ERLANG_DRIVER
267 
268 extern TWinDynDriverCallbacks WinDynDriverCallbacks;
269 
270 #define null_func (WinDynDriverCallbacks.null_func)
271 #define driver_failure_atom (WinDynDriverCallbacks.driver_failure_atom)
272 #define driver_failure_posix (WinDynDriverCallbacks.driver_failure_posix)
273 #define driver_failure (WinDynDriverCallbacks.driver_failure)
274 #define driver_exit (WinDynDriverCallbacks.driver_exit)
275 #define driver_failure_eof (WinDynDriverCallbacks.driver_failure_eof)
276 #define erl_drv_busy_msgq_limits (WinDynDriverCallbacks.erl_drv_busy_msgq_limits)
277 #define driver_select (WinDynDriverCallbacks.driver_select)
278 #define driver_output (WinDynDriverCallbacks.driver_output)
279 #define driver_output2 (WinDynDriverCallbacks.driver_output2)
280 #define driver_output_binary (WinDynDriverCallbacks.driver_output_binary)
281 #define driver_outputv (WinDynDriverCallbacks.driver_outputv)
282 #define driver_vec_to_buf (WinDynDriverCallbacks.driver_vec_to_buf)
283 #define driver_set_timer (WinDynDriverCallbacks.driver_set_timer)
284 #define driver_cancel_timer (WinDynDriverCallbacks.driver_cancel_timer)
285 #define driver_read_timer (WinDynDriverCallbacks.driver_read_timer)
286 #define erl_drv_consume_timeslice (WinDynDriverCallbacks.erl_drv_consume_timeslice)
287 #define erl_errno_id (WinDynDriverCallbacks.erl_errno_id)
288 #define set_busy_port (WinDynDriverCallbacks.set_busy_port)
289 #define set_port_control_flags (WinDynDriverCallbacks.set_port_control_flags)
290 #define get_port_flags (WinDynDriverCallbacks.get_port_flags)
291 #define driver_alloc_binary (WinDynDriverCallbacks.driver_alloc_binary)
292 #define driver_realloc_binary (WinDynDriverCallbacks.driver_realloc_binary)
293 #define driver_free_binary (WinDynDriverCallbacks.driver_free_binary)
294 #define driver_alloc (WinDynDriverCallbacks.driver_alloc)
295 #define driver_realloc (WinDynDriverCallbacks.driver_realloc)
296 #define driver_free (WinDynDriverCallbacks.driver_free)
297 #define driver_enq (WinDynDriverCallbacks.driver_enq)
298 #define driver_pushq (WinDynDriverCallbacks.driver_pushq)
299 #define driver_deq (WinDynDriverCallbacks.driver_deq)
300 #define driver_sizeq (WinDynDriverCallbacks.driver_sizeq)
301 #define driver_enq_bin (WinDynDriverCallbacks.driver_enq_bin)
302 #define driver_pushq_bin (WinDynDriverCallbacks.driver_pushq_bin)
303 #define driver_peekqv (WinDynDriverCallbacks.driver_peekqv)
304 #define driver_peekq (WinDynDriverCallbacks.driver_peekq)
305 #define driver_enqv (WinDynDriverCallbacks.driver_enqv)
306 #define driver_pushqv (WinDynDriverCallbacks.driver_pushqv)
307 #define add_driver_entry (WinDynDriverCallbacks.add_driver_entry)
308 #define remove_driver_entry (WinDynDriverCallbacks.remove_driver_entry)
309 #define driver_mk_atom (WinDynDriverCallbacks.driver_mk_atom)
310 #define driver_mk_port (WinDynDriverCallbacks.driver_mk_port)
311 #define driver_connected (WinDynDriverCallbacks.driver_connected)
312 #define driver_caller (WinDynDriverCallbacks.driver_caller)
313 #define driver_mk_term_nil (WinDynDriverCallbacks.driver_mk_term_nil)
314 #define erl_drv_output_term (WinDynDriverCallbacks.erl_drv_output_term)
315 #define driver_output_term (WinDynDriverCallbacks.driver_output_term)
316 #define erl_drv_send_term (WinDynDriverCallbacks.erl_drv_send_term)
317 #define driver_send_term (WinDynDriverCallbacks.driver_send_term)
318 #define driver_async_port_key (WinDynDriverCallbacks.driver_async_port_key)
319 #define driver_async (WinDynDriverCallbacks.driver_async)
320 #define driver_lock_driver (WinDynDriverCallbacks.driver_lock_driver)
321 #define driver_dl_open (WinDynDriverCallbacks.driver_dl_open)
322 #define driver_dl_sym (WinDynDriverCallbacks.driver_dl_sym)
323 #define driver_dl_close (WinDynDriverCallbacks.driver_dl_close)
324 #define driver_dl_error (WinDynDriverCallbacks.driver_dl_error)
325 #define erts_alc_test (WinDynDriverCallbacks.erts_alc_test)
326 #define driver_binary_get_refc (WinDynDriverCallbacks.driver_binary_get_refc)
327 #define driver_binary_inc_refc (WinDynDriverCallbacks.driver_binary_inc_refc)
328 #define driver_binary_dec_refc (WinDynDriverCallbacks.driver_binary_dec_refc)
329 #define driver_pdl_create (WinDynDriverCallbacks.driver_pdl_create)
330 #define driver_pdl_lock (WinDynDriverCallbacks.driver_pdl_lock)
331 #define driver_pdl_unlock (WinDynDriverCallbacks.driver_pdl_unlock)
332 #define driver_pdl_get_refc (WinDynDriverCallbacks.driver_pdl_get_refc)
333 #define driver_pdl_inc_refc (WinDynDriverCallbacks.driver_pdl_inc_refc)
334 #define driver_pdl_dec_refc (WinDynDriverCallbacks.driver_pdl_dec_refc)
335 #define driver_system_info (WinDynDriverCallbacks.driver_system_info)
336 #define driver_get_now (WinDynDriverCallbacks.driver_get_now)
337 #define erl_drv_monotonic_time (WinDynDriverCallbacks.erl_drv_monotonic_time)
338 #define erl_drv_time_offset (WinDynDriverCallbacks.erl_drv_time_offset)
339 #define erl_drv_convert_time_unit (WinDynDriverCallbacks.erl_drv_convert_time_unit)
340 #define driver_monitor_process \
341 (WinDynDriverCallbacks.driver_monitor_process)
342 #define driver_demonitor_process \
343 (WinDynDriverCallbacks.driver_demonitor_process)
344 #define driver_get_monitored_process \
345 (WinDynDriverCallbacks.driver_get_monitored_process)
346 #define driver_compare_monitors \
347 (WinDynDriverCallbacks.driver_compare_monitors)
348 #define erl_drv_mutex_create (WinDynDriverCallbacks.erl_drv_mutex_create)
349 #define erl_drv_mutex_destroy (WinDynDriverCallbacks.erl_drv_mutex_destroy)
350 #define erl_drv_mutex_trylock (WinDynDriverCallbacks.erl_drv_mutex_trylock)
351 #define erl_drv_mutex_lock (WinDynDriverCallbacks.erl_drv_mutex_lock)
352 #define erl_drv_mutex_unlock (WinDynDriverCallbacks.erl_drv_mutex_unlock)
353 #define erl_drv_cond_create (WinDynDriverCallbacks.erl_drv_cond_create)
354 #define erl_drv_cond_destroy (WinDynDriverCallbacks.erl_drv_cond_destroy)
355 #define erl_drv_cond_signal (WinDynDriverCallbacks.erl_drv_cond_signal)
356 #define erl_drv_cond_broadcast (WinDynDriverCallbacks.erl_drv_cond_broadcast)
357 #define erl_drv_cond_wait (WinDynDriverCallbacks.erl_drv_cond_wait)
358 #define erl_drv_rwlock_create (WinDynDriverCallbacks.erl_drv_rwlock_create)
359 #define erl_drv_rwlock_destroy (WinDynDriverCallbacks.erl_drv_rwlock_destroy)
360 #define erl_drv_rwlock_tryrlock (WinDynDriverCallbacks.erl_drv_rwlock_tryrlock)
361 #define erl_drv_rwlock_rlock (WinDynDriverCallbacks.erl_drv_rwlock_rlock)
362 #define erl_drv_rwlock_runlock (WinDynDriverCallbacks.erl_drv_rwlock_runlock)
363 #define erl_drv_rwlock_tryrwlock \
364 (WinDynDriverCallbacks.erl_drv_rwlock_tryrwlock)
365 #define erl_drv_rwlock_rwlock (WinDynDriverCallbacks.erl_drv_rwlock_rwlock)
366 #define erl_drv_rwlock_rwunlock (WinDynDriverCallbacks.erl_drv_rwlock_rwunlock)
367 #define erl_drv_tsd_key_create (WinDynDriverCallbacks.erl_drv_tsd_key_create)
368 #define erl_drv_tsd_key_destroy (WinDynDriverCallbacks.erl_drv_tsd_key_destroy)
369 #define erl_drv_tsd_set (WinDynDriverCallbacks.erl_drv_tsd_set)
370 #define erl_drv_tsd_get (WinDynDriverCallbacks.erl_drv_tsd_get)
371 #define erl_drv_thread_opts_create \
372 (WinDynDriverCallbacks.erl_drv_thread_opts_create)
373 #define erl_drv_thread_opts_destroy \
374 (WinDynDriverCallbacks.erl_drv_thread_opts_destroy)
375 #define erl_drv_thread_create (WinDynDriverCallbacks.erl_drv_thread_create)
376 #define erl_drv_thread_self (WinDynDriverCallbacks.erl_drv_thread_self)
377 #define erl_drv_equal_tids (WinDynDriverCallbacks.erl_drv_equal_tids)
378 #define erl_drv_thread_exit (WinDynDriverCallbacks.erl_drv_thread_exit)
379 #define erl_drv_thread_join (WinDynDriverCallbacks.erl_drv_thread_join)
380 #define erl_drv_putenv (WinDynDriverCallbacks.erl_drv_putenv)
381 #define erl_drv_getenv (WinDynDriverCallbacks.erl_drv_getenv)
382 
383 /* The only variable in the interface... */
384 #define driver_term_nil (driver_mk_term_nil())
385 
386 #include <stdio.h>
387 #include <stdlib.h>
388 
389 #define DRIVER_INIT(DriverName)									\
390 ErlDrvEntry *erl_dyndriver_real_driver_init(void);									\
391 TWinDynDriverCallbacks WinDynDriverCallbacks;							\
392 __declspec(dllexport) ErlDrvEntry *driver_init(TWinDynDriverCallbacks *callbacks)	        \
393 {												\
394     memcpy(&WinDynDriverCallbacks,callbacks,sizeof(TWinDynDriverCallbacks));			\
395     return erl_dyndriver_real_driver_init();									\
396 }												\
397 ErlDrvEntry *erl_dyndriver_real_driver_init(void)
398 
399 /* This is to make erl_driver.h avoid changing what's done here */
400 #define ERL_DRIVER_TYPES_ONLY
401 
402 #else /* defined(STATIC_ERLANG_DRIVER) */
403 /* This is for the ddll driver */
404 
405 #define ERL_INIT_CALLBACK_STRUCTURE(W)			\
406 do {				                        \
407 ((W).null_func) = null_func;				\
408 ((W).driver_failure_atom) = driver_failure_atom;	\
409 ((W).driver_failure_posix) = driver_failure_posix;	\
410 ((W).driver_failure) = driver_failure;			\
411 ((W).driver_exit) = driver_exit;			\
412 ((W).driver_failure_eof) = driver_failure_eof;		\
413 ((W).erl_drv_busy_msgq_limits) = erl_drv_busy_msgq_limits;\
414 ((W).driver_select) = driver_select;			\
415 ((W).REMOVED_driver_event) = NULL;			\
416 ((W).driver_output) = driver_output;			\
417 ((W).driver_output2) = driver_output2;			\
418 ((W).driver_output_binary) = driver_output_binary;	\
419 ((W).driver_outputv) = driver_outputv;			\
420 ((W).driver_vec_to_buf) = driver_vec_to_buf;		\
421 ((W).driver_set_timer) = driver_set_timer;		\
422 ((W).driver_cancel_timer) = driver_cancel_timer;	\
423 ((W).driver_read_timer) = driver_read_timer;		\
424 ((W).erl_drv_consume_timeslice) = erl_drv_consume_timeslice;\
425 ((W).erl_errno_id) = erl_errno_id;			\
426 ((W).set_busy_port) = set_busy_port;			\
427 ((W).set_port_control_flags) = set_port_control_flags;	\
428 ((W).get_port_flags) = get_port_flags;			\
429 ((W).driver_alloc_binary) = driver_alloc_binary;	\
430 ((W).driver_realloc_binary) = driver_realloc_binary;	\
431 ((W).driver_free_binary) = driver_free_binary;		\
432 ((W).driver_alloc) = driver_alloc;			\
433 ((W).driver_realloc) = driver_realloc;			\
434 ((W).driver_free) = driver_free;			\
435 ((W).driver_enq) = driver_enq;				\
436 ((W).driver_pushq) = driver_pushq;			\
437 ((W).driver_deq) = driver_deq;				\
438 ((W).driver_sizeq) = driver_sizeq;			\
439 ((W).driver_enq_bin) = driver_enq_bin;			\
440 ((W).driver_pushq_bin) = driver_pushq_bin;		\
441 ((W).driver_peekqv) = driver_peekqv;			\
442 ((W).driver_peekq) = driver_peekq;			\
443 ((W).driver_enqv) = driver_enqv;			\
444 ((W).driver_pushqv) = driver_pushqv;			\
445 ((W).add_driver_entry) = add_driver_entry;		\
446 ((W).remove_driver_entry) = remove_driver_entry;	\
447 ((W).driver_mk_atom) = driver_mk_atom;			\
448 ((W).driver_mk_port) = driver_mk_port;			\
449 ((W).driver_connected) = driver_connected;		\
450 ((W).driver_caller) = driver_caller;			\
451 ((W).driver_mk_term_nil) = driver_mk_term_nil;		\
452 ((W).erl_drv_output_term) = erl_drv_output_term;	\
453 ((W).driver_output_term) = driver_output_term;		\
454 ((W).erl_drv_send_term) = erl_drv_send_term;		\
455 ((W).driver_send_term) = driver_send_term;		\
456 ((W).driver_async_port_key) = driver_async_port_key;	\
457 ((W).driver_async) = driver_async;			\
458 ((W).driver_lock_driver) = driver_lock_driver;	       	\
459 ((W).driver_dl_open) =  driver_dl_open;			\
460 ((W).driver_dl_sym) =  driver_dl_sym;			\
461 ((W).driver_dl_close) =  driver_dl_close;		\
462 ((W).driver_dl_error) =  driver_dl_error;		\
463 ((W).erts_alc_test) = erts_alc_test;			\
464 ((W).driver_binary_get_refc) = driver_binary_get_refc;	\
465 ((W).driver_binary_inc_refc) = driver_binary_inc_refc;	\
466 ((W).driver_binary_dec_refc) = driver_binary_dec_refc;	\
467 ((W).driver_pdl_create) = driver_pdl_create;		\
468 ((W).driver_pdl_lock) = driver_pdl_lock;		\
469 ((W).driver_pdl_unlock) = driver_pdl_unlock;		\
470 ((W).driver_pdl_get_refc) = driver_pdl_get_refc;	\
471 ((W).driver_pdl_inc_refc) = driver_pdl_inc_refc;	\
472 ((W).driver_pdl_dec_refc) = driver_pdl_dec_refc;	\
473 ((W).driver_system_info) = driver_system_info;		\
474 ((W).driver_get_now) = driver_get_now;		        \
475 ((W).erl_drv_monotonic_time) = erl_drv_monotonic_time;	\
476 ((W).erl_drv_time_offset) = erl_drv_time_offset;	\
477 ((W).erl_drv_convert_time_unit) = erl_drv_convert_time_unit; \
478 ((W).driver_monitor_process) = driver_monitor_process;    \
479 ((W).driver_demonitor_process) = driver_demonitor_process;  \
480 ((W).driver_get_monitored_process) = driver_get_monitored_process;      \
481 ((W).driver_compare_monitors) = driver_compare_monitors;\
482 ((W).erl_drv_mutex_create) = erl_drv_mutex_create;	\
483 ((W).erl_drv_mutex_destroy) = erl_drv_mutex_destroy;	\
484 ((W).erl_drv_mutex_trylock) = erl_drv_mutex_trylock;	\
485 ((W).erl_drv_mutex_lock) = erl_drv_mutex_lock;		\
486 ((W).erl_drv_mutex_unlock) = erl_drv_mutex_unlock;	\
487 ((W).erl_drv_cond_create) = erl_drv_cond_create;	\
488 ((W).erl_drv_cond_destroy) = erl_drv_cond_destroy;	\
489 ((W).erl_drv_cond_signal) = erl_drv_cond_signal;	\
490 ((W).erl_drv_cond_broadcast) = erl_drv_cond_broadcast;	\
491 ((W).erl_drv_cond_wait) = erl_drv_cond_wait;		\
492 ((W).erl_drv_rwlock_create) = erl_drv_rwlock_create;	\
493 ((W).erl_drv_rwlock_destroy) = erl_drv_rwlock_destroy;	\
494 ((W).erl_drv_rwlock_tryrlock) = erl_drv_rwlock_tryrlock;\
495 ((W).erl_drv_rwlock_rlock) = erl_drv_rwlock_rlock;	\
496 ((W).erl_drv_rwlock_runlock) = erl_drv_rwlock_runlock;	\
497 ((W).erl_drv_rwlock_tryrwlock) = erl_drv_rwlock_tryrwlock;\
498 ((W).erl_drv_rwlock_rwlock) = erl_drv_rwlock_rwlock;	\
499 ((W).erl_drv_rwlock_rwunlock) = erl_drv_rwlock_rwunlock;\
500 ((W).erl_drv_tsd_key_create) = erl_drv_tsd_key_create;	\
501 ((W).erl_drv_tsd_key_destroy) = erl_drv_tsd_key_destroy;\
502 ((W).erl_drv_tsd_set) = erl_drv_tsd_set;		\
503 ((W).erl_drv_tsd_get) = erl_drv_tsd_get;		\
504 ((W).erl_drv_thread_opts_create) = erl_drv_thread_opts_create;\
505 ((W).erl_drv_thread_opts_destroy) = erl_drv_thread_opts_destroy;\
506 ((W).erl_drv_thread_create) = erl_drv_thread_create;	\
507 ((W).erl_drv_thread_self) = erl_drv_thread_self;	\
508 ((W).erl_drv_equal_tids) = erl_drv_equal_tids;		\
509 ((W).erl_drv_thread_exit) = erl_drv_thread_exit;	\
510 ((W).erl_drv_thread_join) = erl_drv_thread_join;	\
511 ((W).erl_drv_putenv) = erl_drv_putenv;			\
512 ((W).erl_drv_getenv) = erl_drv_getenv;			\
513 } while (0)
514 
515 
516 
517 #endif /* STATIC_ERLANG_DRIVER */
518 #endif /* _ERL_WIN_DYN_DRIVER_H */
519