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