1erl_driver(3) C Library Functions erl_driver(3)
2
3
4
6 erl_driver - API functions for an Erlang driver.
7
9 An Erlang driver is a library containing a set of native driver call‐
10 back functions that the Erlang Virtual Machine calls when certain
11 events occur. There can be multiple instances of a driver, each in‐
12 stance is associated with an Erlang port.
13
14 Warning:
15 Use this functionality with extreme care.
16
17 A driver callback is executed as a direct extension of the native code
18 of the VM. Execution is not made in a safe environment. The VM cannot
19 provide the same services as provided when executing Erlang code, such
20 as pre-emptive scheduling or memory protection. If the driver callback
21 function does not behave well, the whole VM will misbehave.
22
23 * A driver callback that crash will crash the whole VM.
24
25 * An erroneously implemented driver callback can cause a VM internal
26 state inconsistency, which can cause a crash of the VM, or miscel‐
27 laneous misbehaviors of the VM at any point after the call to the
28 driver callback.
29
30 * A driver callback doing lengthy work before returning degrades re‐
31 sponsiveness of the VM and can cause miscellaneous strange behav‐
32 iors. Such strange behaviors include, but are not limited to, ex‐
33 treme memory usage and bad load balancing between schedulers.
34 Strange behaviors that can occur because of lengthy work can also
35 vary between Erlang/OTP releases.
36
37 As from ERTS 5.5.3 the driver interface has been extended (see extended
38 marker). The extended interface introduces version management, the pos‐
39 sibility to pass capability flags (see driver_flags) to the runtime
40 system at driver initialization, and some new driver API functions.
41
42 Note:
43 As from ERTS 5.9 old drivers must be recompiled and use the extended
44 interface. They must also be adjusted to the 64-bit capable driver in‐
45 terface.
46
47
48 The driver calls back to the emulator, using the API functions declared
49 in erl_driver.h. They are used for outputting data from the driver, us‐
50 ing timers, and so on.
51
52 Each driver instance is associated with a port. Every port has a port
53 owner process. Communication with the port is normally done through the
54 port owner process. Most of the functions take the port handle as an
55 argument. This identifies the driver instance. Notice that this port
56 handle must be stored by the driver, it is not given when the driver is
57 called from the emulator (see driver_entry).
58
59 Some of the functions take a parameter of type ErlDrvBinary, a driver
60 binary. It is to be both allocated and freed by the caller. Using a bi‐
61 nary directly avoids one extra copying of data.
62
63 Many of the output functions have a "header buffer", with hbuf and hlen
64 parameters. This buffer is sent as a list before the binary (or list,
65 depending on port mode) that is sent. This is convenient when matching
66 on messages received from the port. (Although in the latest Erlang ver‐
67 sions there is the binary syntax, which enables you to match on the be‐
68 ginning of a binary.)
69
70 Drivers are locked either on driver level or port level (driver in‐
71 stance level). By default driver level locking will be used, that is,
72 only one emulator thread will execute code in the driver at a time. If
73 port level locking is used, multiple emulator threads can execute code
74 in the driver at the same time. Only one thread at a time will call
75 driver callbacks corresponding to the same port, though. To enable port
76 level locking, set the ERL_DRV_FLAG_USE_PORT_LOCKING driver flag in the
77 driver_entry used by the driver. When port level locking is used, the
78 driver writer is responsible for synchronizing all accesses to data
79 shared by the ports (driver instances).
80
81 Most drivers written before the runtime system with SMP support existed
82 can run in the runtime system with SMP support, without being rewrit‐
83 ten, if driver level locking is used.
84
85 Note:
86 It is assumed that drivers do not access other drivers. If drivers ac‐
87 cess each other, they must provide their own mechanism for thread-safe
88 synchronization. Such "inter-driver communication" is strongly discour‐
89 aged.
90
91
92 Note:
93 Regardless of locking scheme used, calls to driver callbacks can be
94 made from different threads.
95
96
97 Most functions in this API are not thread-safe, that is, they cannot be
98 called from arbitrary threads. Functions that are not documented as
99 thread-safe can only be called from driver callbacks or function calls
100 descending from a driver callback call. Notice that driver callbacks
101 can be called from different threads. This, however, is not a problem
102 for any function in this API, as the emulator has control over these
103 threads.
104
105 Warning:
106 Functions not explicitly documented as thread-safe are not thread safe.
107
108 A function not explicitly documented as thread-safe can, at some point
109 in time, have a thread-safe implementation in the runtime system. Such
110 an implementation can however change to a thread unsafe implementation
111 at any time without any notice.
112
113 Only use functions explicitly documented as thread-safe from arbitrary
114 threads.
115
116
117 As mentioned in the warning text at the beginning of this section, it
118 is of vital importance that a driver callback returns relatively fast.
119 It is difficult to give an exact maximum amount of time that a driver
120 callback is allowed to work, but usually a well-behaving driver call‐
121 back is to return within 1 millisecond. This can be achieved using dif‐
122 ferent approaches. If you have full control over the code to execute in
123 the driver callback, the best approach is to divide the work into mul‐
124 tiple chunks of work, and trigger multiple calls to the time-out call‐
125 back using zero time-outs. Function erl_drv_consume_timeslice can be
126 useful to determine when to trigger such time-out callback calls. How‐
127 ever, sometimes it cannot be implemented this way, for example when
128 calling third-party libraries. In this case, you typically want to dis‐
129 patch the work to another thread. Information about thread primitives
130 is provided below.
131
133 All functions that a driver needs to do with Erlang are performed
134 through driver API functions. Functions exist for the following func‐
135 tionality:
136
137 Timer functions:
138 Control the timer that a driver can use. The timer has the emulator
139 call the timeout entry function after a specified time. Only one
140 timer is available for each driver instance.
141
142 Queue handling:
143 Every driver instance has an associated queue. This queue is a Sys‐
144 IOVec, which works as a buffer. It is mostly used for the driver to
145 buffer data that is to be written to a device, it is a byte stream.
146 If the port owner process closes the driver, and the queue is not
147 empty, the driver is not closed. This enables the driver to flush
148 its buffers before closing.
149
150 The queue can be manipulated from any threads if a port data lock
151 is used. For more information, see ErlDrvPDL.
152
153 Output functions:
154 With these functions, the driver sends data back to the emulator.
155 The data is received as messages by the port owner process, see er‐
156 lang:open_port/2. The vector function and the function taking a
157 driver binary are faster, as they avoid copying the data buffer.
158 There is also a fast way of sending terms from the driver, without
159 going through the binary term format.
160
161 Failure:
162 The driver can exit and signal errors up to Erlang. This is only
163 for severe errors, when the driver cannot possibly keep open.
164
165 Asynchronous calls:
166 Erlang/OTP R7B and later versions have provision for asynchronous
167 function calls, using a thread pool provided by Erlang. There is
168 also a select call, which can be used for asynchronous drivers.
169
170 Multi-threading:
171 A POSIX thread like API for multi-threading is provided. The Erlang
172 driver thread API only provides a subset of the functionality pro‐
173 vided by the POSIX thread API. The subset provided is more or less
174 the basic functionality needed for multi-threaded programming:
175
176 * Threads
177
178 * Mutexes
179
180 *
181 Condition variables
182
183 *
184 Read/write locks
185
186 *
187 Thread-specific data
188
189 The Erlang driver thread API can be used in conjunction with the
190 POSIX thread API on UN-ices and with the Windows native thread API
191 on Windows. The Erlang driver thread API has the advantage of being
192 portable, but there can exist situations where you want to use
193 functionality from the POSIX thread API or the Windows native
194 thread API.
195
196 The Erlang driver thread API only returns error codes when it is
197 reasonable to recover from an error condition. If it is not reason‐
198 able to recover from an error condition, the whole runtime system
199 is terminated. For example, if a create mutex operation fails, an
200 error code is returned, but if a lock operation on a mutex fails,
201 the whole runtime system is terminated.
202
203 Notice that there is no "condition variable wait with time-out" in
204 the Erlang driver thread API. This because of issues with
205 pthread_cond_timedwait. When the system clock suddenly is changed,
206 it is not always guaranteed that you will wake up from the call as
207 expected. An Erlang runtime system must be able to cope with sudden
208 changes of the system clock. Therefore, we have omitted it from the
209 Erlang driver thread API. In the Erlang driver case, time-outs can
210 and are to be handled with the timer functionality of the Erlang
211 driver API.
212
213 Notice that many functions in the Erlang driver API are not thread-
214 safe. If a function is not documented as thread-safe, it is not
215 thread-safe.
216
217 Note:
218 When executing in an emulator thread, it is very important that you
219 unlock all locks you have locked before letting the thread out of
220 your control; otherwise you are very likely to deadlock the whole em‐
221 ulator.
222
223 If you need to use thread-specific data in an emulator thread, only
224 have the thread-specific data set while the thread is under your con‐
225 trol, and clear the thread-specific data before you let the thread
226 out of your control.
227
228
229 In the future, debug functionality will probably be integrated with
230 the Erlang driver thread API. All functions that create entities
231 take a name argument. Currently the name argument is unused, but it
232 will be used when the debug functionality is implemented. If you
233 name all entities created well, the debug functionality will be
234 able to give you better error reports.
235
236 Adding/removing drivers:
237 A driver can add and later remove drivers.
238
239 Monitoring processes:
240 A driver can monitor a process that does not own a port.
241
242 Version management:
243 Version management is enabled for drivers that have set the ex‐
244 tended_marker field of their driver_entry to ERL_DRV_EX‐
245 TENDED_MARKER. erl_driver.h defines:
246
247 * ERL_DRV_EXTENDED_MARKER
248
249 * ERL_DRV_EXTENDED_MAJOR_VERSION, which is incremented when driver
250 incompatible changes are made to the Erlang runtime system. Nor‐
251 mally it suffices to recompile drivers when ERL_DRV_EXTENDED_MA‐
252 JOR_VERSION has changed, but it can, under rare circumstances,
253 mean that drivers must be slightly modified. If so, this will of
254 course be documented.
255
256 * ERL_DRV_EXTENDED_MINOR_VERSION, which is incremented when new
257 features are added. The runtime system uses the minor version of
258 the driver to determine what features to use.
259
260 The runtime system normally refuses to load a driver if the major
261 versions differ, or if the major versions are equal and the minor
262 version used by the driver is greater than the one used by the run‐
263 time system. Old drivers with lower major versions are however al‐
264 lowed after a bump of the major version during a transition period
265 of two major releases. Such old drivers can, however, fail if dep‐
266 recated features are used.
267
268 The emulator refuses to load a driver that does not use the ex‐
269 tended driver interface, to allow for 64-bit capable drivers, as
270 incompatible type changes for the callbacks output, control, and
271 call were introduced in Erlang/OTP R15B. A driver written with the
272 old types would compile with warnings and when called return
273 garbage sizes to the emulator, causing it to read random memory and
274 create huge incorrect result blobs.
275
276 Therefore it is not enough to only recompile drivers written with
277 version management for pre R15B types; the types must be changed in
278 the driver suggesting other rewrites, especially regarding size
279 variables. Investigate all warnings when recompiling.
280
281 Also, the API driver functions driver_output* and
282 driver_vec_to_buf, driver_alloc/realloc*, and the driver_* queue
283 functions were changed to have larger length arguments and return
284 values. This is a lesser problem, as code that passes smaller types
285 gets them auto-converted in the calls, and as long as the driver
286 does not handle sizes that overflow an int, all will work as be‐
287 fore.
288
289 Time measurement:
290 Support for time measurement in drivers:
291
292 * ErlDrvTime
293
294 * ErlDrvTimeUnit
295
296 * erl_drv_monotonic_time
297
298 * erl_drv_time_offset
299
300 * erl_drv_convert_time_unit
301
303 ERTS 5.9 introduced two new integer types, ErlDrvSizeT and ErlDrvS‐
304 SizeT, which can hold 64-bit sizes if necessary.
305
306 To not update a driver and only recompile, it probably works when
307 building for a 32-bit machine creating a false sense of security. Hope‐
308 fully that will generate many important warnings. But when recompiling
309 the same driver later on for a 64-bit machine, there will be warnings
310 and almost certainly crashes. So it is a bad idea to postpone updating
311 the driver and not fixing the warnings.
312
313 When recompiling with gcc, use flag -Wstrict-prototypes to get better
314 warnings. Try to find a similar flag if you use another compiler.
315
316 The following is a checklist for rewriting a pre ERTS 5.9 driver, most
317 important first:
318
319 Return types for driver callbacks:
320 Rewrite driver callback control to use return type ErlDrvSSizeT in‐
321 stead of int.
322
323 Rewrite driver callback call to use return type ErlDrvSSizeT in‐
324 stead of int.
325
326 Note:
327 These changes are essential not to crash the emulator or worse cause
328 malfunction. Without them a driver can return garbage in the high 32
329 bits to the emulator, causing it to build a huge result from random
330 bytes, either crashing on memory allocation or succeeding with a ran‐
331 dom result from the driver call.
332
333
334 Arguments to driver callbacks:
335 Driver callback output now gets ErlDrvSizeT as 3rd argument instead
336 of previously int.
337
338 Driver callback control now gets ErlDrvSizeT as 4th and 6th argu‐
339 ments instead of previously int.
340
341 Driver callback call now gets ErlDrvSizeT as 4th and 6th arguments
342 instead of previously int.
343
344 Sane compiler's calling conventions probably make these changes
345 necessary only for a driver to handle data chunks that require
346 64-bit size fields (mostly larger than 2 GB, as that is what an int
347 of 32 bits can hold). But it is possible to think of non-sane call‐
348 ing conventions that would make the driver callbacks mix up the ar‐
349 guments causing malfunction.
350
351 Note:
352 The argument type change is from signed to unsigned. This can cause
353 problems for, for example, loop termination conditions or error con‐
354 ditions if you only change the types all over the place.
355
356
357 Larger size field in ErlIOVec:
358 The size field in ErlIOVec has been changed to ErlDrvSizeT from
359 int. Check all code that use that field.
360
361 Automatic type-casting probably makes these changes necessary only
362 for a driver that encounters sizes > 32 bits.
363
364 Note:
365 The size field changed from signed to unsigned. This can cause prob‐
366 lems for, for example, loop termination conditions or error condi‐
367 tions if you only change the types all over the place.
368
369
370 Arguments and return values in the driver API:
371 Many driver API functions have changed argument type and/or return
372 value to ErlDrvSizeT from mostly int. Automatic type-casting proba‐
373 bly makes these changes necessary only for a driver that encounters
374 sizes > 32 bits.
375
376 driver_output:
377 3rd argument
378
379 driver_output2:
380 3rd and 5th arguments
381
382 driver_output_binary:
383 3rd, 5th, and 6th arguments
384
385 driver_outputv:
386 3rd and 5th arguments
387
388 driver_vec_to_buf:
389 3rd argument and return value
390
391 driver_alloc:
392 1st argument
393
394 driver_realloc:
395 2nd argument
396
397 driver_alloc_binary:
398 1st argument
399
400 driver_realloc_binary:
401 2nd argument
402
403 driver_enq:
404 3rd argument
405
406 driver_pushq:
407 3rd argument
408
409 driver_deq:
410 2nd argument and return value
411
412 driver_sizeq:
413 Return value
414
415 driver_enq_bin:
416 3rd and 4th arguments
417
418 driver_pushq_bin:
419 3rd and 4th arguments
420
421 driver_enqv:
422 3rd argument
423
424 driver_pushqv:
425 3rd argument
426
427 driver_peekqv:
428 Return value
429
430 Note:
431 This is a change from signed to unsigned. This can cause problems
432 for, for example, loop termination conditions and error conditions if
433 you only change the types all over the place.
434
435
437 ErlDrvSizeT:
438 An unsigned integer type to be used as size_t.
439
440 ErlDrvSSizeT:
441 A signed integer type, the size of ErlDrvSizeT.
442
443 ErlDrvSysInfo:
444
445
446 typedef struct ErlDrvSysInfo {
447 int driver_major_version;
448 int driver_minor_version;
449 char *erts_version;
450 char *otp_release;
451 int thread_support;
452 int smp_support;
453 int async_threads;
454 int scheduler_threads;
455 int nif_major_version;
456 int nif_minor_version;
457 int dirty_scheduler_support;
458 } ErlDrvSysInfo;
459
460 The ErlDrvSysInfo structure is used for storage of information
461 about the Erlang runtime system. driver_system_info writes the sys‐
462 tem information when passed a reference to a ErlDrvSysInfo struc‐
463 ture. The fields in the structure are as follows:
464
465 driver_major_version:
466 The value of ERL_DRV_EXTENDED_MAJOR_VERSION when the runtime sys‐
467 tem was compiled. This value is the same as the value of
468 ERL_DRV_EXTENDED_MAJOR_VERSION used when compiling the driver;
469 otherwise the runtime system would have refused to load the
470 driver.
471
472 driver_minor_version:
473 The value of ERL_DRV_EXTENDED_MINOR_VERSION when the runtime sys‐
474 tem was compiled. This value can differ from the value of
475 ERL_DRV_EXTENDED_MINOR_VERSION used when compiling the driver.
476
477 erts_version:
478 A string containing the version number of the runtime system (the
479 same as returned by erlang:system_info(version)).
480
481 otp_release:
482 A string containing the OTP release number (the same as returned
483 by erlang:system_info(otp_release)).
484
485 thread_support:
486 A value != 0 if the runtime system has thread support; otherwise
487 0.
488
489 smp_support:
490 A value != 0 if the runtime system has SMP support; otherwise 0.
491
492 async_threads:
493 The number of async threads in the async thread pool used by
494 driver_async (the same as returned by erlang:sys‐
495 tem_info(thread_pool_size)).
496
497 scheduler_threads:
498 The number of scheduler threads used by the runtime system (the
499 same as returned by erlang:system_info(schedulers)).
500
501 nif_major_version:
502 The value of ERL_NIF_MAJOR_VERSION when the runtime system was
503 compiled.
504
505 nif_minor_version:
506 The value of ERL_NIF_MINOR_VERSION when the runtime system was
507 compiled.
508
509 dirty_scheduler_support:
510 A value != 0 if the runtime system has support for dirty sched‐
511 uler threads; otherwise 0.
512
513 ErlDrvBinary:
514
515
516 typedef struct ErlDrvBinary {
517 ErlDrvSint orig_size;
518 char orig_bytes[];
519 } ErlDrvBinary;
520
521 The ErlDrvBinary structure is a binary, as sent between the emula‐
522 tor and the driver. All binaries are reference counted; when
523 driver_binary_free is called, the reference count is decremented,
524 when it reaches zero, the binary is deallocated. orig_size is the
525 binary size and orig_bytes is the buffer. ErlDrvBinary has not a
526 fixed size, its size is orig_size + 2 * sizeof(int).
527
528 Note:
529 The refc field has been removed. The reference count of an ErlDrvBi‐
530 nary is now stored elsewhere. The reference count of an ErlDrvBinary
531 can be accessed through driver_binary_get_refc, driver_bi‐
532 nary_inc_refc, and driver_binary_dec_refc.
533
534
535 Some driver calls, such as driver_enq_binary, increment the driver
536 reference count, and others, such as driver_deq decrement it.
537
538 Using a driver binary instead of a normal buffer is often faster,
539 as the emulator needs not to copy the data, only the pointer is
540 used.
541
542 A driver binary allocated in the driver, with driver_alloc_binary,
543 is to be freed in the driver (unless otherwise stated) with
544 driver_free_binary. (Notice that this does not necessarily deallo‐
545 cate it, if the driver is still referred in the emulator, the ref-
546 count will not go to zero.)
547
548 Driver binaries are used in the driver_output2 and driver_outputv
549 calls, and in the queue. Also the driver callback outputv uses
550 driver binaries.
551
552 If the driver for some reason wants to keep a driver binary around,
553 for example in a static variable, the reference count is to be in‐
554 cremented, and the binary can later be freed in the stop callback,
555 with driver_free_binary.
556
557 Notice that as a driver binary is shared by the driver and the emu‐
558 lator. A binary received from the emulator or sent to the emulator
559 must not be changed by the driver.
560
561 Since ERTS 5.5 (Erlang/OTP R11B), orig_bytes is guaranteed to be
562 properly aligned for storage of an array of doubles (usually 8-byte
563 aligned).
564
565 ErlDrvData:
566 A handle to driver-specific data, passed to the driver callbacks.
567 It is a pointer, and is most often type cast to a specific pointer
568 in the driver.
569
570 SysIOVec:
571 A system I/O vector, as used by writev on Unix and WSASend on
572 Win32. It is used in ErlIOVec.
573
574 ErlIOVec:
575
576
577 typedef struct ErlIOVec {
578 int vsize;
579 ErlDrvSizeT size;
580 SysIOVec* iov;
581 ErlDrvBinary** binv;
582 } ErlIOVec;
583
584 The I/O vector used by the emulator and drivers is a list of bina‐
585 ries, with a SysIOVec pointing to the buffers of the binaries. It
586 is used in driver_outputv and the outputv driver callback. Also,
587 the driver queue is an ErlIOVec.
588
589 ErlDrvMonitor:
590 When a driver creates a monitor for a process, a ErlDrvMonitor is
591 filled in. This is an opaque data type that can be assigned to, but
592 not compared without using the supplied compare function (that is,
593 it behaves like a struct).
594
595 The driver writer is to provide the memory for storing the monitor
596 when calling driver_monitor_process. The address of the data is not
597 stored outside of the driver, so ErlDrvMonitor can be used as any
598 other data, it can be copied, moved in memory, forgotten, and so
599 on.
600
601 ErlDrvNowData:
602 The ErlDrvNowData structure holds a time stamp consisting of three
603 values measured from some arbitrary point in the past. The three
604 structure members are:
605
606 megasecs:
607 The number of whole megaseconds elapsed since the arbitrary point
608 in time
609
610 secs:
611 The number of whole seconds elapsed since the arbitrary point in
612 time
613
614 microsecs:
615 The number of whole microseconds elapsed since the arbitrary
616 point in time
617
618 ErlDrvPDL:
619 If certain port-specific data must be accessed from other threads
620 than those calling the driver callbacks, a port data lock can be
621 used to synchronize the operations on the data. Currently, the only
622 port-specific data that the emulator associates with the port data
623 lock is the driver queue.
624
625 Normally a driver instance has no port data lock. If the driver in‐
626 stance wants to use a port data lock, it must create the port data
627 lock by calling driver_pdl_create.
628
629 Note:
630 Once the port data lock has been created, every access to data asso‐
631 ciated with the port data lock must be done while the port data lock
632 is locked. The port data lock is locked and unlocked by
633 driver_pdl_lock, and driver_pdl_unlock, respectively.
634
635
636 A port data lock is reference counted, and when the reference count
637 reaches zero, it is destroyed. The emulator at least increments the
638 reference count once when the lock is created and decrements it
639 once the port associated with the lock terminates. The emulator
640 also increments the reference count when an async job is enqueued
641 and decrements it when an async job has been invoked. Also, the
642 driver is responsible for ensuring that the reference count does
643 not reach zero before the last use of the lock by the driver has
644 been made. The reference count can be read, incremented, and decre‐
645 mented by driver_pdl_get_refc, driver_pdl_inc_refc, and
646 driver_pdl_dec_refc, respectively.
647
648 ErlDrvTid:
649 Thread identifier.
650
651 See also erl_drv_thread_create, erl_drv_thread_exit,
652 erl_drv_thread_join, erl_drv_thread_self, and erl_drv_equal_tids.
653
654 ErlDrvThreadOpts:
655
656
657 int suggested_stack_size;
658
659 Thread options structure passed to erl_drv_thread_create. The fol‐
660 lowing field exists:
661
662 suggested_stack_size:
663 A suggestion, in kilowords, on how large a stack to use. A value
664 < 0 means default size.
665
666 See also erl_drv_thread_opts_create, erl_drv_thread_opts_destroy,
667 and erl_drv_thread_create.
668
669 ErlDrvMutex:
670 Mutual exclusion lock. Used for synchronizing access to shared
671 data. Only one thread at a time can lock a mutex.
672
673 See also erl_drv_mutex_create, erl_drv_mutex_destroy, erl_drv_mu‐
674 tex_lock, erl_drv_mutex_trylock, and erl_drv_mutex_unlock.
675
676 ErlDrvCond:
677 Condition variable. Used when threads must wait for a specific con‐
678 dition to appear before continuing execution. Condition variables
679 must be used with associated mutexes.
680
681 See also erl_drv_cond_create, erl_drv_cond_destroy,
682 erl_drv_cond_signal, erl_drv_cond_broadcast, and erl_drv_cond_wait.
683
684 ErlDrvRWLock:
685 Read/write lock. Used to allow multiple threads to read shared data
686 while only allowing one thread to write the same data. Multiple
687 threads can read lock an rwlock at the same time, while only one
688 thread can read/write lock an rwlock at a time.
689
690 See also erl_drv_rwlock_create, erl_drv_rwlock_destroy,
691 erl_drv_rwlock_rlock, erl_drv_rwlock_tryrlock, erl_drv_rwlock_run‐
692 lock, erl_drv_rwlock_rwlock, erl_drv_rwlock_tryrwlock, and
693 erl_drv_rwlock_rwunlock.
694
695 ErlDrvTSDKey:
696 Key that thread-specific data can be associated with.
697
698 See also erl_drv_tsd_key_create, erl_drv_tsd_key_destroy,
699 erl_drv_tsd_set, and erl_drv_tsd_get.
700
701 ErlDrvTime:
702 A signed 64-bit integer type for time representation.
703
704 ErlDrvTimeUnit:
705 An enumeration of time units supported by the driver API:
706
707 ERL_DRV_SEC:
708 Seconds
709
710 ERL_DRV_MSEC:
711 Milliseconds
712
713 ERL_DRV_USEC:
714 Microseconds
715
716 ERL_DRV_NSEC:
717 Nanoseconds
718
720 void add_driver_entry(ErlDrvEntry
721 *de)
722
723 Adds a driver entry to the list of drivers known by Erlang. The
724 init function of parameter de is called.
725
726 Note:
727 To use this function for adding drivers residing in dynamically
728 loaded code is dangerous. If the driver code for the added
729 driver resides in the same dynamically loaded module (that is,
730 .so file) as a normal dynamically loaded driver (loaded with the
731 erl_ddll interface), the caller is to call driver_lock_driver
732 before adding driver entries.
733
734 Use of this function is generally deprecated.
735
736
737 void *driver_alloc(ErlDrvSizeT size)
738
739 Allocates a memory block of the size specified in size, and re‐
740 turns it. This fails only on out of memory, in which case NULL
741 is returned. (This is most often a wrapper for malloc).
742
743 Memory allocated must be explicitly freed with a corresponding
744 call to driver_free (unless otherwise stated).
745
746 This function is thread-safe.
747
748 ErlDrvBinary *driver_alloc_binary(ErlDrvSizeT size)
749
750 Allocates a driver binary with a memory block of at least size
751 bytes, and returns a pointer to it, or NULL on failure (out of
752 memory). When a driver binary has been sent to the emulator, it
753 must not be changed. Every allocated binary is to be freed by a
754 corresponding call to driver_free_binary (unless otherwise
755 stated).
756
757 Notice that a driver binary has an internal reference counter.
758 This means that calling driver_free_binary, it may not actually
759 dispose of it. If it is sent to the emulator, it can be refer‐
760 enced there.
761
762 The driver binary has a field, orig_bytes, which marks the start
763 of the data in the binary.
764
765 This function is thread-safe.
766
767 long driver_async(ErlDrvPort port, unsigned
768 int* key, void (*async_invoke)(void*), void* async_data, void
769 (*async_free)(void*))
770
771 Performs an asynchronous call. The function async_invoke is in‐
772 voked in a thread separate from the emulator thread. This en‐
773 ables the driver to perform time-consuming, blocking operations
774 without blocking the emulator.
775
776 The async thread pool size can be set with command-line argument
777 +A in erl(1). If an async thread pool is unavailable, the call
778 is made synchronously in the thread calling driver_async. The
779 current number of async threads in the async thread pool can be
780 retrieved through driver_system_info.
781
782 If a thread pool is available, a thread is used. If argument key
783 is NULL, the threads from the pool are used in a round-robin
784 way, each call to driver_async uses the next thread in the pool.
785 With argument key set, this behavior is changed. The two same
786 values of *key always get the same thread.
787
788 To ensure that a driver instance always uses the same thread,
789 the following call can be used:
790
791 unsigned int myKey = driver_async_port_key(myPort);
792
793 r = driver_async(myPort, &myKey, myData, myFunc);
794
795 It is enough to initialize myKey once for each driver instance.
796
797 If a thread is already working, the calls are queued up and exe‐
798 cuted in order. Using the same thread for each driver instance
799 ensures that the calls are made in sequence.
800
801 The async_data is the argument to the functions async_invoke and
802 async_free. It is typically a pointer to a structure containing
803 a pipe or event that can be used to signal that the async opera‐
804 tion completed. The data is to be freed in async_free.
805
806 When the async operation is done, ready_async driver entry func‐
807 tion is called. If ready_async is NULL in the driver entry, the
808 async_free function is called instead.
809
810 The return value is -1 if the driver_async call fails.
811
812 Note:
813 As from ERTS 5.5.4.3 the default stack size for threads in the
814 async-thread pool is 16 kilowords, that is, 64 kilobyte on
815 32-bit architectures. This small default size has been chosen
816 because the amount of async-threads can be quite large. The de‐
817 fault stack size is enough for drivers delivered with Er‐
818 lang/OTP, but is possibly not sufficiently large for other dy‐
819 namically linked-in drivers that use the driver_async function‐
820 ality. A suggested stack size for threads in the async-thread
821 pool can be configured through command-line argument +a in
822 erl(1).
823
824
825 unsigned int driver_async_port_key(ErlDrvPort
826 port)
827
828 Calculates a key for later use in driver_async. The keys are
829 evenly distributed so that a fair mapping between port IDs and
830 async thread IDs is achieved.
831
832 Note:
833 Before Erlang/OTP R16, the port ID could be used as a key with
834 proper casting, but after the rewrite of the port subsystem,
835 this is no longer the case. With this function, you can achieve
836 the same distribution based on port IDs as before Erlang/OTP
837 R16.
838
839
840 long driver_binary_dec_refc(ErlDrvBinary *bin)
841
842 Decrements the reference count on bin and returns the reference
843 count reached after the decrement.
844
845 This function is thread-safe.
846
847 Note:
848 The reference count of driver binary is normally to be decre‐
849 mented by calling driver_free_binary.
850
851 driver_binary_dec_refc does not free the binary if the reference
852 count reaches zero. Only use driver_binary_dec_refc when you are
853 sure not to reach a reference count of zero.
854
855
856 long driver_binary_get_refc(ErlDrvBinary *bin)
857
858 Returns the current reference count on bin.
859
860 This function is thread-safe.
861
862 long driver_binary_inc_refc(ErlDrvBinary *bin)
863
864 Increments the reference count on bin and returns the reference
865 count reached after the increment.
866
867 This function is thread-safe.
868
869 ErlDrvTermData driver_caller(ErlDrvPort
870 port)
871
872 Returns the process ID of the process that made the current call
873 to the driver. The process ID can be used with driver_send_term
874 to send back data to the caller. driver_caller only returns
875 valid data when currently executing in one of the following
876 driver callbacks:
877
878 start:
879 Called from erlang:open_port/2.
880
881 output:
882 Called from erlang:send/2 and erlang:port_command/2.
883
884 outputv:
885 Called from erlang:send/2 and erlang:port_command/2.
886
887 control:
888 Called from erlang:port_control/3.
889
890 call:
891 Called from erlang:port_call/3.
892
893 Notice that this function is not thread-safe.
894
895 int driver_cancel_timer(ErlDrvPort port)
896
897 Cancels a timer set with driver_set_timer.
898
899 The return value is 0.
900
901 int driver_compare_monitors(const ErlDrvMonitor
902 *monitor1, const ErlDrvMonitor *monitor2)
903
904 Compares two ErlDrvMonitors. Can also be used to imply some ar‐
905 tificial order on monitors, for whatever reason.
906
907 Returns 0 if monitor1 and monitor2 are equal, < 0 if monitor1 <
908 monitor2, and > 0 if monitor1 > monitor2.
909
910 ErlDrvTermData driver_connected(ErlDrvPort
911 port)
912
913 Returns the port owner process.
914
915 Notice that this function is not thread-safe.
916
917 ErlDrvPort driver_create_port(ErlDrvPort port,
918 ErlDrvTermData owner_pid, char* name,
919 ErlDrvData drv_data)
920
921 Creates a new port executing the same driver code as the port
922 creating the new port.
923
924 port:
925 The port handle of the port (driver instance) creating the
926 new port.
927
928 owner_pid:
929 The process ID of the Erlang process to become owner of the
930 new port. This process will be linked to the new port. You
931 usually want to use driver_caller(port) as owner_pid.
932
933 name:
934 The port name of the new port. You usually want to use the
935 same port name as the driver name (driver_name field of the
936 driver_entry).
937
938 drv_data:
939 The driver-defined handle that is passed in later calls to
940 driver callbacks. Notice that the driver start callback is
941 not called for this new driver instance. The driver-defined
942 handle is normally created in the driver start callback when
943 a port is created through erlang:open_port/2.
944
945 The caller of driver_create_port is allowed to manipulate the
946 newly created port when driver_create_port has returned. When
947 port level locking is used, the creating port is only allowed to
948 manipulate the newly created port until the current driver call‐
949 back, which was called by the emulator, returns.
950
951 int driver_demonitor_process(ErlDrvPort port,
952 const ErlDrvMonitor *monitor)
953
954 Cancels a monitor created earlier.
955
956 Returns 0 if a monitor was removed and > 0 if the monitor no
957 longer exists.
958
959 ErlDrvSizeT driver_deq(ErlDrvPort port,
960 ErlDrvSizeT size)
961
962 Dequeues data by moving the head pointer forward in the driver
963 queue by size bytes. The data in the queue is deallocated.
964
965 Returns the number of bytes remaining in the queue on success,
966 otherwise -1.
967
968 This function can be called from any thread if a port data lock
969 associated with the port is locked by the calling thread during
970 the call.
971
972 int driver_enq(ErlDrvPort port, char* buf,
973 ErlDrvSizeT len)
974
975 Enqueues data in the driver queue. The data in buf is copied
976 (len bytes) and placed at the end of the driver queue. The
977 driver queue is normally used in a FIFO way.
978
979 The driver queue is available to queue output from the emulator
980 to the driver (data from the driver to the emulator is queued by
981 the emulator in normal Erlang message queues). This can be use‐
982 ful if the driver must wait for slow devices, and so on, and
983 wants to yield back to the emulator. The driver queue is imple‐
984 mented as an ErlIOVec.
985
986 When the queue contains data, the driver does not close until
987 the queue is empty.
988
989 The return value is 0.
990
991 This function can be called from any thread if a port data lock
992 associated with the port is locked by the calling thread during
993 the call.
994
995 int driver_enq_bin(ErlDrvPort port,
996 ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len)
997
998 Enqueues a driver binary in the driver queue. The data in bin at
999 offset with length len is placed at the end of the queue. This
1000 function is most often faster than driver_enq, because no data
1001 must be copied.
1002
1003 This function can be called from any thread if a port data lock
1004 associated with the port is locked by the calling thread during
1005 the call.
1006
1007 The return value is 0.
1008
1009 int driver_enqv(ErlDrvPort port, ErlIOVec *ev,
1010 ErlDrvSizeT skip)
1011
1012 Enqueues the data in ev, skipping the first skip bytes of it, at
1013 the end of the driver queue. It is faster than driver_enq, be‐
1014 cause no data must be copied.
1015
1016 The return value is 0.
1017
1018 This function can be called from any thread if a port data lock
1019 associated with the port is locked by the calling thread during
1020 the call.
1021
1022 int driver_failure(ErlDrvPort port, int
1023 error)
1024 int driver_failure_atom(ErlDrvPort port, char
1025 *string)
1026 int driver_failure_posix(ErlDrvPort port, int
1027 error)
1028
1029 Signals to Erlang that the driver has encountered an error and
1030 is to be closed. The port is closed and the tuple {'EXIT', er‐
1031 ror, Err} is sent to the port owner process, where error is an
1032 error atom (driver_failure_atom and driver_failure_posix) or an
1033 integer (driver_failure).
1034
1035 The driver is to fail only when in severe error situations, when
1036 the driver cannot possibly keep open, for example, buffer allo‐
1037 cation gets out of memory. For normal errors it is more appro‐
1038 priate to send error codes with driver_output.
1039
1040 The return value is 0.
1041
1042 int driver_failure_eof(ErlDrvPort
1043 port)
1044
1045 Signals to Erlang that the driver has encountered an EOF and is
1046 to be closed, unless the port was opened with option eof, in
1047 which case eof is sent to the port. Otherwise the port is closed
1048 and an 'EXIT' message is sent to the port owner process.
1049
1050 The return value is 0.
1051
1052 void driver_free(void *ptr)
1053
1054 Frees the memory pointed to by ptr. The memory is to have been
1055 allocated with driver_alloc. All allocated memory is to be de‐
1056 allocated, only once. There is no garbage collection in drivers.
1057
1058 This function is thread-safe.
1059
1060 void driver_free_binary(ErlDrvBinary *bin)
1061
1062 Frees a driver binary bin, allocated previously with driver_al‐
1063 loc_binary. As binaries in Erlang are reference counted, the bi‐
1064 nary can still be around.
1065
1066 This function is thread-safe.
1067
1068 ErlDrvTermData driver_get_monitored_process(ErlDrvPort port, const
1069 ErlDrvMonitor *monitor)
1070
1071 Returns the process ID associated with a living monitor. It can
1072 be used in the process_exit callback to get the process identi‐
1073 fication for the exiting process.
1074
1075 Returns driver_term_nil if the monitor no longer exists.
1076
1077 int driver_get_now(ErlDrvNowData *now)
1078
1079 Warning:
1080 This function is deprecated. Do not use it. Use erl_drv_mono‐
1081 tonic_time (perhaps in combination with erl_drv_time_offset) in‐
1082 stead.
1083
1084
1085 Reads a time stamp into the memory pointed to by parameter now.
1086 For information about specific fields, see ErlDrvNowData.
1087
1088 The return value is 0, unless the now pointer is invalid, in
1089 which case it is < 0.
1090
1091 int driver_lock_driver(ErlDrvPort
1092 port)
1093
1094 Locks the driver used by the port port in memory for the rest of
1095 the emulator process' lifetime. After this call, the driver be‐
1096 haves as one of Erlang's statically linked-in drivers.
1097
1098 ErlDrvTermData driver_mk_atom(char*
1099 string)
1100
1101 Returns an atom given a name string. The atom is created and
1102 does not change, so the return value can be saved and reused,
1103 which is faster than looking up the atom several times.
1104
1105 Notice that this function is not thread-safe.
1106
1107 ErlDrvTermData driver_mk_port(ErlDrvPort
1108 port)
1109
1110 Converts a port handle to the Erlang term format, usable in
1111 erl_drv_output_term and erl_drv_send_term.
1112
1113 Notice that this function is not thread-safe.
1114
1115 int driver_monitor_process(ErlDrvPort port,
1116 ErlDrvTermData process, ErlDrvMonitor *monitor)
1117
1118 Starts monitoring a process from a driver. When a process is
1119 monitored, a process exit results in a call to the provided
1120 process_exit callback in the ErlDrvEntry structure. The ErlDrv‐
1121 Monitor structure is filled in, for later removal or compare.
1122
1123 Parameter process is to be the return value of an earlier call
1124 to driver_caller or driver_connected call.
1125
1126 Returns 0 on success, < 0 if no callback is provided, and > 0 if
1127 the process is no longer alive.
1128
1129 int driver_output(ErlDrvPort port, char *buf,
1130 ErlDrvSizeT len)
1131
1132 Sends data from the driver up to the emulator. The data is re‐
1133 ceived as terms or binary data, depending on how the driver port
1134 was opened.
1135
1136 The data is queued in the port owner process' message queue. No‐
1137 tice that this does not yield to the emulator (as the driver and
1138 the emulator run in the same thread).
1139
1140 Parameter buf points to the data to send, and len is the number
1141 of bytes.
1142
1143 The return value for all output functions is 0 for normal use.
1144 If the driver is used for distribution, it can fail and return
1145 -1.
1146
1147 int driver_output_binary(ErlDrvPort port, char
1148 *hbuf, ErlDrvSizeT hlen, ErlDrvBinary* bin, ErlDrvSizeT offset,
1149 ErlDrvSizeT len)
1150
1151 Sends data to a port owner process from a driver binary. It has
1152 a header buffer (hbuf and hlen) just like driver_output2. Param‐
1153 eter hbuf can be NULL.
1154
1155 Parameter offset is an offset into the binary and len is the
1156 number of bytes to send.
1157
1158 Driver binaries are created with driver_alloc_binary.
1159
1160 The data in the header is sent as a list and the binary as an
1161 Erlang binary in the tail of the list.
1162
1163 For example, if hlen is 2, the port owner process receives [H1,
1164 H2 | <<T>>].
1165
1166 The return value is 0 for normal use.
1167
1168 Notice that, using the binary syntax in Erlang, the driver ap‐
1169 plication can match the header directly from the binary, so the
1170 header can be put in the binary, and hlen can be set to 0.
1171
1172 int driver_output_term(ErlDrvPort port,
1173 ErlDrvTermData* term, int n)
1174
1175 Warning:
1176 This function is deprecated. Use erl_drv_output_terminstead.
1177
1178
1179 Parameters term and n work as in erl_drv_output_term.
1180
1181 Notice that this function is not thread-safe.
1182
1183 int driver_output2(ErlDrvPort port, char *hbuf,
1184 ErlDrvSizeT hlen, char *buf, ErlDrvSizeT len)
1185
1186 First sends hbuf (length in hlen) data as a list, regardless of
1187 port settings. Then sends buf as a binary or list. For example,
1188 if hlen is 3, the port owner process receives [H1, H2, H3 | T].
1189
1190 The point of sending data as a list header, is to facilitate
1191 matching on the data received.
1192
1193 The return value is 0 for normal use.
1194
1195 int driver_outputv(ErlDrvPort port, char* hbuf,
1196 ErlDrvSizeT hlen, ErlIOVec *ev, ErlDrvSizeT skip)
1197
1198 Sends data from an I/O vector, ev, to the port owner process. It
1199 has a header buffer (hbuf and hlen), just like driver_output2.
1200
1201 Parameter skip is a number of bytes to skip of the ev vector
1202 from the head.
1203
1204 You get vectors of ErlIOVec type from the driver queue (see be‐
1205 low), and the outputv driver entry function. You can also make
1206 them yourself, if you want to send several ErlDrvBinary buffers
1207 at once. Often it is faster to use driver_output or .
1208
1209 For example, if hlen is 2 and ev points to an array of three bi‐
1210 naries, the port owner process receives [H1, H2, <<B1>>, <<B2>>
1211 | <<B3>>].
1212
1213 The return value is 0 for normal use.
1214
1215 The comment for driver_output_binary also applies for
1216 driver_outputv.
1217
1218 ErlDrvPDL driver_pdl_create(ErlDrvPort port)
1219
1220 Creates a port data lock associated with the port.
1221
1222 Note:
1223 Once a port data lock has been created, it must be locked during
1224 all operations on the driver queue of the port.
1225
1226
1227 Returns a newly created port data lock on success, otherwise
1228 NULL. The function fails if port is invalid or if a port data
1229 lock already has been associated with the port.
1230
1231 long driver_pdl_dec_refc(ErlDrvPDL
1232 pdl)
1233
1234 Decrements the reference count of the port data lock passed as
1235 argument (pdl).
1236
1237 The current reference count after the decrement has been per‐
1238 formed is returned.
1239
1240 This function is thread-safe.
1241
1242 long driver_pdl_get_refc(ErlDrvPDL pdl)
1243
1244 Returns the current reference count of the port data lock passed
1245 as argument (pdl).
1246
1247 This function is thread-safe.
1248
1249 long driver_pdl_inc_refc(ErlDrvPDL pdl)
1250
1251 Increments the reference count of the port data lock passed as
1252 argument (pdl).
1253
1254 The current reference count after the increment has been per‐
1255 formed is returned.
1256
1257 This function is thread-safe.
1258
1259 void driver_pdl_lock(ErlDrvPDL pdl)
1260
1261 Locks the port data lock passed as argument (pdl).
1262
1263 This function is thread-safe.
1264
1265 void driver_pdl_unlock(ErlDrvPDL pdl)
1266
1267 Unlocks the port data lock passed as argument (pdl).
1268
1269 This function is thread-safe.
1270
1271 SysIOVec *driver_peekq(ErlDrvPort port, int
1272 *vlen)
1273
1274 Retrieves the driver queue as a pointer to an array of Sys‐
1275 IOVecs. It also returns the number of elements in vlen. This is
1276 one of two ways to get data out of the queue.
1277
1278 Nothing is removed from the queue by this function, that must be
1279 done with driver_deq.
1280
1281 The returned array is suitable to use with the Unix system call
1282 writev.
1283
1284 This function can be called from any thread if a port data lock
1285 associated with the port is locked by the calling thread during
1286 the call.
1287
1288 ErlDrvSizeT driver_peekqv(ErlDrvPort port,
1289 ErlIOVec *ev)
1290
1291 Retrieves the driver queue into a supplied ErlIOVec ev. It also
1292 returns the queue size. This is one of two ways to get data out
1293 of the queue.
1294
1295 If ev is NULL, all ones that is -1 type cast to ErlDrvSizeT are
1296 returned.
1297
1298 Nothing is removed from the queue by this function, that must be
1299 done with driver_deq.
1300
1301 This function can be called from any thread if a port data lock
1302 associated with the port is locked by the calling thread during
1303 the call.
1304
1305 int driver_pushq(ErlDrvPort port, char* buf,
1306 ErlDrvSizeT len)
1307
1308 Puts data at the head of the driver queue. The data in buf is
1309 copied (len bytes) and placed at the beginning of the queue.
1310
1311 The return value is 0.
1312
1313 This function can be called from any thread if a port data lock
1314 associated with the port is locked by the calling thread during
1315 the call.
1316
1317 int driver_pushq_bin(ErlDrvPort port,
1318 ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len)
1319
1320 Puts data in the binary bin, at offset with length len at the
1321 head of the driver queue. It is most often faster than
1322 driver_pushq, because no data must be copied.
1323
1324 This function can be called from any thread if a port data lock
1325 associated with the port is locked by the calling thread during
1326 the call.
1327
1328 The return value is 0.
1329
1330 int driver_pushqv(ErlDrvPort port, ErlIOVec
1331 *ev, ErlDrvSizeT skip)
1332
1333 Puts the data in ev, skipping the first skip bytes of it, at the
1334 head of the driver queue. It is faster than driver_pushq, be‐
1335 cause no data must be copied.
1336
1337 The return value is 0.
1338
1339 This function can be called from any thread if a port data lock
1340 associated with the port is locked by the calling thread during
1341 the call.
1342
1343 int driver_read_timer(ErlDrvPort port, unsigned
1344 long *time_left)
1345
1346 Reads the current time of a timer, and places the result in
1347 time_left. This is the time in milliseconds, before the time-out
1348 occurs.
1349
1350 The return value is 0.
1351
1352 void *driver_realloc(void *ptr, ErlDrvSizeT size)
1353
1354 Resizes a memory block, either in place, or by allocating a new
1355 block, copying the data, and freeing the old block. A pointer is
1356 returned to the reallocated memory. On failure (out of memory),
1357 NULL is returned. (This is most often a wrapper for realloc.)
1358
1359 This function is thread-safe.
1360
1361 ErlDrvBinary *driver_realloc_binary(ErlDrvBinary *bin, ErlDrvSizeT
1362 size)
1363
1364
1365 Resizes a driver binary, while keeping the data.
1366
1367 Returns the resized driver binary on success. Returns NULL on
1368 failure (out of memory).
1369
1370 This function is thread-safe.
1371
1372 int driver_select(ErlDrvPort port, ErlDrvEvent
1373 event, int mode, int on)
1374
1375 This function is used by drivers to provide the emulator with
1376 events to check for. This enables the emulator to call the
1377 driver when something has occurred asynchronously.
1378
1379 Parameter event identifies an OS-specific event object. On Unix
1380 systems, the functions select/poll are used. The event object
1381 must be a socket or pipe (or other object that select/poll can
1382 use). On Windows, the Win32 API function WaitForMultipleObjects
1383 is used. This places other restrictions on the event object; see
1384 the Win32 SDK documentation.
1385
1386 Parameter on is to be 1 for setting events and 0 for clearing
1387 them.
1388
1389 Parameter mode is a bitwise OR combination of ERL_DRV_READ,
1390 ERL_DRV_WRITE, and ERL_DRV_USE. The first two specify whether to
1391 wait for read events and/or write events. A fired read event
1392 calls ready_input and a fired write event calls ready_output.
1393
1394 Note:
1395 Some OS (Windows) do not differentiate between read and write
1396 events. The callback for a fired event then only depends on the
1397 value of mode.
1398
1399
1400 ERL_DRV_USE specifies if we are using the event object or if we
1401 want to close it. It is not safe to clear all events and then
1402 close the event object after driver_select has returned. Another
1403 thread can still be using the event object internally. To safely
1404 close an event object, call driver_select with ERL_DRV_USE and
1405 on==0, which clears all events and then either calls stop_select
1406 or schedules it to be called when it is safe to close the event
1407 object. ERL_DRV_USE is to be set together with the first event
1408 for an event object. It is harmless to set ERL_DRV_USE even if
1409 it already has been done. Clearing all events but keeping
1410 ERL_DRV_USE set indicates that we are using the event object and
1411 probably will set events for it again.
1412
1413 Note:
1414 ERL_DRV_USE was added in Erlang/OTP R13. Old drivers still work
1415 as before, but it is recommended to update them to use
1416 ERL_DRV_USE and stop_select to ensure that event objects are
1417 closed in a safe way.
1418
1419
1420 The return value is 0, unless ready_input/ready_output is NULL,
1421 in which case it is -1.
1422
1423 int driver_send_term(ErlDrvPort port,
1424 ErlDrvTermData receiver, ErlDrvTermData* term, int n)
1425
1426 Warning:
1427 This function is deprecated. Use erl_drv_send_term instead.
1428
1429
1430 Note:
1431 The parameters of this function cannot be properly checked by
1432 the runtime system when executed by arbitrary threads. This can
1433 cause the function not to fail when it should.
1434
1435
1436 Parameters term and n work as in erl_drv_output_term.
1437
1438 This function is thread-safe.
1439
1440 int driver_set_timer(ErlDrvPort port, unsigned
1441 long time)
1442
1443 Sets a timer on the driver, which will count down and call the
1444 driver when it is timed out. Parameter time is the time in mil‐
1445 liseconds before the timer expires.
1446
1447 When the timer reaches 0 and expires, the driver entry function
1448 timeout is called.
1449
1450 Notice that only one timer exists on each driver instance; set‐
1451 ting a new timer replaces an older one.
1452
1453 Return value is 0, unless the timeout driver function is NULL,
1454 in which case it is -1.
1455
1456 ErlDrvSizeT driver_sizeq(ErlDrvPort port)
1457
1458 Returns the number of bytes currently in the driver queue.
1459
1460 This function can be called from any thread if a port data lock
1461 associated with the port is locked by the calling thread during
1462 the call.
1463
1464 void driver_system_info(ErlDrvSysInfo
1465 *sys_info_ptr, size_t size)
1466
1467 Writes information about the Erlang runtime system into the Erl‐
1468 DrvSysInfo structure referred to by the first argument. The sec‐
1469 ond argument is to be the size of the ErlDrvSysInfo structure,
1470 that is, sizeof(ErlDrvSysInfo).
1471
1472 For information about specific fields, see ErlDrvSysInfo.
1473
1474 ErlDrvSizeT driver_vec_to_buf(ErlIOVec *ev,
1475 char *buf, ErlDrvSizeT len)
1476
1477 Collects several segments of data, referenced by ev, by copying
1478 them in order to the buffer buf, of the size len.
1479
1480 If the data is to be sent from the driver to the port owner
1481 process, it is faster to use driver_outputv.
1482
1483 The return value is the space left in the buffer, that is, if ev
1484 contains less than len bytes it is the difference, and if ev
1485 contains len bytes or more, it is 0. This is faster if there is
1486 more than one header byte, as the binary syntax can construct
1487 integers directly from the binary.
1488
1489 void erl_drv_busy_msgq_limits(ErlDrvPort port,
1490 ErlDrvSizeT *low, ErlDrvSizeT *high)
1491
1492 Sets and gets limits that will be used for controlling the busy
1493 state of the port message queue.
1494
1495 The port message queue is set into a busy state when the amount
1496 of command data queued on the message queue reaches the high
1497 limit. The port message queue is set into a not busy state when
1498 the amount of command data queued on the message queue falls be‐
1499 low the low limit. Command data is in this context data passed
1500 to the port using either Port ! {Owner, {command, Data}} or
1501 port_command/[2,3]. Notice that these limits only concerns com‐
1502 mand data that have not yet reached the port. The busy port fea‐
1503 ture can be used for data that has reached the port.
1504
1505 Valid limits are values in the range [ERL_DRV_BUSY_MSGQ_LIM_MIN,
1506 ERL_DRV_BUSY_MSGQ_LIM_MAX]. Limits are automatically adjusted to
1507 be sane. That is, the system adjusts values so that the low
1508 limit used is lower than or equal to the high limit used. By de‐
1509 fault the high limit is 8 kB and the low limit is 4 kB.
1510
1511 By passing a pointer to an integer variable containing the value
1512 ERL_DRV_BUSY_MSGQ_READ_ONLY, the currently used limit is read
1513 and written back to the integer variable. A new limit can be set
1514 by passing a pointer to an integer variable containing a valid
1515 limit. The passed value is written to the internal limit. The
1516 internal limit is then adjusted. After this the adjusted limit
1517 is written back to the integer variable from which the new value
1518 was read. Values are in bytes.
1519
1520 The busy message queue feature can be disabled either by setting
1521 the ERL_DRV_FLAG_NO_BUSY_MSGQ driver flag in the driver_entry
1522 used by the driver, or by calling this function with
1523 ERL_DRV_BUSY_MSGQ_DISABLED as a limit (either low or high). When
1524 this feature has been disabled, it cannot be enabled again. When
1525 reading the limits, both are ERL_DRV_BUSY_MSGQ_DISABLED if this
1526 feature has been disabled.
1527
1528 Processes sending command data to the port are suspended if ei‐
1529 ther the port is busy or if the port message queue is busy. Sus‐
1530 pended processes are resumed when neither the port or the port
1531 message queue is busy.
1532
1533 For information about busy port functionality, see
1534 set_busy_port.
1535
1536 void erl_drv_cond_broadcast(ErlDrvCond
1537 *cnd)
1538
1539 Broadcasts on a condition variable. That is, if other threads
1540 are waiting on the condition variable being broadcast on, all of
1541 them are woken.
1542
1543 cnd is a pointer to a condition variable to broadcast on.
1544
1545 This function is thread-safe.
1546
1547 ErlDrvCond *erl_drv_cond_create(char
1548 *name)
1549
1550 Creates a condition variable and returns a pointer to it.
1551
1552 name is a string identifying the created condition variable. It
1553 is used to identify the condition variable in planned future de‐
1554 bug functionality.
1555
1556 Returns NULL on failure. The driver creating the condition vari‐
1557 able is responsible for destroying it before the driver is un‐
1558 loaded.
1559
1560 This function is thread-safe.
1561
1562 void erl_drv_cond_destroy(ErlDrvCond
1563 *cnd)
1564
1565 Destroys a condition variable previously created by
1566 erl_drv_cond_create.
1567
1568 cnd is a pointer to a condition variable to destroy.
1569
1570 This function is thread-safe.
1571
1572 char *erl_drv_cond_name(ErlDrvCond
1573 *cnd)
1574
1575 Returns a pointer to the name of the condition.
1576
1577 cnd is a pointer to an initialized condition.
1578
1579 Note:
1580 This function is intended for debugging purposes only.
1581
1582
1583 void erl_drv_cond_signal(ErlDrvCond
1584 *cnd)
1585
1586 Signals on a condition variable. That is, if other threads are
1587 waiting on the condition variable being signaled, one of them is
1588 woken.
1589
1590 cnd is a pointer to a condition variable to signal on.
1591
1592 This function is thread-safe.
1593
1594 void erl_drv_cond_wait(ErlDrvCond *cnd,
1595 ErlDrvMutex *mtx)
1596
1597 Waits on a condition variable. The calling thread is blocked un‐
1598 til another thread wakes it by signaling or broadcasting on the
1599 condition variable. Before the calling thread is blocked, it un‐
1600 locks the mutex passed as argument. When the calling thread is
1601 woken, it locks the same mutex before returning. That is, the
1602 mutex currently must be locked by the calling thread when call‐
1603 ing this function.
1604
1605 cnd is a pointer to a condition variable to wait on. mtx is a
1606 pointer to a mutex to unlock while waiting.
1607
1608 Note:
1609 erl_drv_cond_wait can return even if no one has signaled or
1610 broadcast on the condition variable. Code calling
1611 erl_drv_cond_wait is always to be prepared for erl_drv_cond_wait
1612 returning even if the condition that the thread was waiting for
1613 has not occurred. That is, when returning from
1614 erl_drv_cond_wait, always check if the condition has occurred,
1615 and if not call erl_drv_cond_wait again.
1616
1617
1618 This function is thread-safe.
1619
1620 int erl_drv_consume_timeslice(ErlDrvPort port,
1621 int percent)
1622
1623 Gives the runtime system a hint about how much CPU time the cur‐
1624 rent driver callback call has consumed since the last hint, or
1625 since the the start of the callback if no previous hint has been
1626 given.
1627
1628 port:
1629 Port handle of the executing port.
1630
1631 percent:
1632 Approximate consumed fraction of a full time-slice in per‐
1633 cent.
1634
1635 The time is specified as a fraction, in percent, of a full time-
1636 slice that a port is allowed to execute before it is to surren‐
1637 der the CPU to other runnable ports or processes. Valid range is
1638 [1, 100]. The scheduling time-slice is not an exact entity, but
1639 can usually be approximated to about 1 millisecond.
1640
1641 Notice that it is up to the runtime system to determine if and
1642 how to use this information. Implementations on some platforms
1643 can use other means to determine the consumed fraction of the
1644 time-slice. Lengthy driver callbacks should, regardless of this,
1645 frequently call this function to determine if it is allowed to
1646 continue execution or not.
1647
1648 This function returns a non-zero value if the time-slice has
1649 been exhausted, and zero if the callback is allowed to continue
1650 execution. If a non-zero value is returned, the driver callback
1651 is to return as soon as possible in order for the port to be
1652 able to yield.
1653
1654 This function is provided to better support co-operative sched‐
1655 uling, improve system responsiveness, and to make it easier to
1656 prevent misbehaviors of the VM because of a port monopolizing a
1657 scheduler thread. It can be used when dividing lengthy work into
1658 some repeated driver callback calls, without the need to use
1659 threads.
1660
1661 See also the important warning text at the beginning of this
1662 manual page.
1663
1664 ErlDrvTime erl_drv_convert_time_unit(ErlDrvTime
1665 val, ErlDrvTimeUnit from, ErlDrvTimeUnit to)
1666
1667 Converts the val value of time unit from to the corresponding
1668 value of time unit to. The result is rounded using the floor
1669 function.
1670
1671 val:
1672 Value to convert time unit for.
1673
1674 from:
1675 Time unit of val.
1676
1677 to:
1678 Time unit of returned value.
1679
1680 Returns ERL_DRV_TIME_ERROR if called with an invalid time unit
1681 argument.
1682
1683 See also ErlDrvTime and ErlDrvTimeUnit.
1684
1685 int erl_drv_equal_tids(ErlDrvTid tid1,
1686 ErlDrvTid tid2)
1687
1688 Compares two thread identifiers, tid1 and tid2, for equality.
1689
1690 Returns 0 it they are not equal, and a value not equal to 0 if
1691 they are equal.
1692
1693 Note:
1694 A thread identifier can be reused very quickly after a thread
1695 has terminated. Therefore, if a thread corresponding to one of
1696 the involved thread identifiers has terminated since the thread
1697 identifier was saved, the result of erl_drv_equal_tids does pos‐
1698 sibly not give the expected result.
1699
1700
1701 This function is thread-safe.
1702
1703 int erl_drv_getenv(const char *key, char
1704 *value, size_t *value_size)
1705
1706 Retrieves the value of an environment variable.
1707
1708 key:
1709 A NULL-terminated string containing the name of the environ‐
1710 ment variable.
1711
1712 value:
1713 A pointer to an output buffer.
1714
1715 value_size:
1716 A pointer to an integer. The integer is used both for pass‐
1717 ing input and output sizes (see below).
1718
1719 When this function is called, *value_size is to contain the size
1720 of the value buffer.
1721
1722 On success, 0 is returned, the value of the environment variable
1723 has been written to the value buffer, and *value_size contains
1724 the string length (excluding the terminating NULL character) of
1725 the value written to the value buffer.
1726
1727 On failure, that is, no such environment variable was found, a
1728 value < 0 is returned. When the size of the value buffer is too
1729 small, a value > 0 is returned and *value_size has been set to
1730 the buffer size needed.
1731
1732 Warning:
1733 This function reads the emulated environment used by os:getenv/1
1734 and not the environment used by libc's getenv(3) or similar.
1735 Drivers that require that these are in sync will need to do so
1736 themselves, but keep in mind that they are segregated for a rea‐
1737 son; getenv(3) and its friends are not thread-safe and may cause
1738 unrelated code to misbehave or crash the emulator.
1739
1740
1741 This function is thread-safe.
1742
1743 void erl_drv_init_ack(ErlDrvPort port,
1744 ErlDrvData res)
1745
1746 Acknowledges the start of the port.
1747
1748 port:
1749 The port handle of the port (driver instance) doing the ac‐
1750 knowledgment.
1751
1752 res:
1753 The result of the port initialization. Can be the same val‐
1754 ues as the return value of start, that is, any of the error
1755 codes or the ErlDrvData that is to be used for this port.
1756
1757 When this function is called the initiating erlang:open_port
1758 call is returned as if the start function had just been called.
1759 It can only be used when flag ERL_DRV_FLAG_USE_INIT_ACK has been
1760 set on the linked-in driver.
1761
1762 ErlDrvTime erl_drv_monotonic_time(ErlDrvTimeUnit time_unit)
1763
1764 Returns Erlang monotonic time. Notice that negative values are
1765 not uncommon.
1766
1767 time_unit is time unit of returned value.
1768
1769 Returns ERL_DRV_TIME_ERROR if called with an invalid time unit
1770 argument, or if called from a thread that is not a scheduler
1771 thread.
1772
1773 See also ErlDrvTime and ErlDrvTimeUnit.
1774
1775 ErlDrvMutex *erl_drv_mutex_create(char
1776 *name)
1777
1778 Creates a mutex and returns a pointer to it.
1779
1780 name is a string identifying the created mutex. It is used to
1781 identify the mutex in debug functionality (see note).
1782
1783 Returns NULL on failure. The driver creating the mutex is re‐
1784 sponsible for destroying it before the driver is unloaded.
1785
1786 This function is thread-safe.
1787
1788 Note:
1789 One such debug functionality is the lock checker, which can de‐
1790 tect locking order violations and thereby potential deadlock
1791 bugs. For the lock checker to work the name should be on the
1792 format "App.Type" or "App.Type[Instance]", where App is the name
1793 of the application, Type is the name of the lock type and In‐
1794 stance is optional information about each lock instance.
1795 "App.Type" should be a unique name for the lock checker to de‐
1796 tect lock order violations between locks of different types. The
1797 Instance information is currently ignored.
1798
1799 For example, if we have mutexes of types "myapp.xtable" and
1800 "myapp.xitem" then the lock checker will make sure either
1801 "myapp.xtable" locks are never locked after "myapp.xitem" locks
1802 or vice versa.
1803
1804
1805 void erl_drv_mutex_destroy(ErlDrvMutex
1806 *mtx)
1807
1808 Destroys a mutex previously created by erl_drv_mutex_create. The
1809 mutex must be in an unlocked state before it is destroyed.
1810
1811 mtx is a pointer to a mutex to destroy.
1812
1813 This function is thread-safe.
1814
1815 void erl_drv_mutex_lock(ErlDrvMutex
1816 *mtx)
1817
1818 Locks a mutex. The calling thread is blocked until the mutex has
1819 been locked. A thread that has currently locked the mutex cannot
1820 lock the same mutex again.
1821
1822 mtx is a pointer to a mutex to lock.
1823
1824 Warning:
1825 If you leave a mutex locked in an emulator thread when you let
1826 the thread out of your control, you will very likely deadlock
1827 the whole emulator.
1828
1829
1830 This function is thread-safe.
1831
1832 char *erl_drv_mutex_name(ErlDrvMutex
1833 *mtx)
1834
1835 Returns a pointer to the mutex name.
1836
1837 mtx is a pointer to an initialized mutex.
1838
1839 Note:
1840 This function is intended for debugging purposes only.
1841
1842
1843 int erl_drv_mutex_trylock(ErlDrvMutex
1844 *mtx)
1845
1846 Tries to lock a mutex. A thread that has currently locked the
1847 mutex cannot try to lock the same mutex again.
1848
1849 mtx is a pointer to a mutex to try to lock.
1850
1851 Returns 0 on success, otherwise EBUSY.
1852
1853 Warning:
1854 If you leave a mutex locked in an emulator thread when you let
1855 the thread out of your control, you will very likely deadlock
1856 the whole emulator.
1857
1858
1859 This function is thread-safe.
1860
1861 void erl_drv_mutex_unlock(ErlDrvMutex
1862 *mtx)
1863
1864 Unlocks a mutex. The mutex currently must be locked by the call‐
1865 ing thread.
1866
1867 mtx is a pointer to a mutex to unlock.
1868
1869 This function is thread-safe.
1870
1871 int erl_drv_output_term(ErlDrvTermData port,
1872 ErlDrvTermData* term, int n)
1873
1874 Sends data in the special driver term format to the port owner
1875 process. This is a fast way to deliver term data from a driver.
1876 It needs no binary conversion, so the port owner process re‐
1877 ceives data as normal Erlang terms. The erl_drv_send_term func‐
1878 tions can be used for sending to any process on the local node.
1879
1880 Note:
1881 Parameter port is not an ordinary port handle, but a port handle
1882 converted using driver_mk_port.
1883
1884
1885 Parameter term points to an array of ErlDrvTermData with n ele‐
1886 ments. This array contains terms described in the driver term
1887 format. Every term consists of 1-4 elements in the array. The
1888 first term has a term type and then arguments. Parameter port
1889 specifies the sending port.
1890
1891 Tuples, maps, and lists (except strings, see below) are built in
1892 reverse polish notation, so that to build a tuple, the elements
1893 are specified first, and then the tuple term, with a count.
1894 Likewise for lists and maps.
1895
1896 * A tuple must be specified with the number of elements. (The
1897 elements precede the ERL_DRV_TUPLE term.)
1898
1899 * A map must be specified with the number of key-value pairs
1900 N. The key-value pairs must precede the ERL_DRV_MAP in this
1901 order: key1,value1,key2,value2,...,keyN,valueN. Duplicate
1902 keys are not allowed.
1903
1904 * A list must be specified with the number of elements, in‐
1905 cluding the tail, which is the last term preceding
1906 ERL_DRV_LIST.
1907
1908 The special term ERL_DRV_STRING_CONS is used to "splice" in a
1909 string in a list, a string specified this way is not a list in
1910 itself, but the elements are elements of the surrounding list.
1911
1912 Term type Arguments
1913 --------- ---------
1914 ERL_DRV_NIL
1915 ERL_DRV_ATOM ErlDrvTermData atom (from driver_mk_atom(char *string))
1916 ERL_DRV_INT ErlDrvSInt integer
1917 ERL_DRV_UINT ErlDrvUInt integer
1918 ERL_DRV_INT64 ErlDrvSInt64 *integer_ptr
1919 ERL_DRV_UINT64 ErlDrvUInt64 *integer_ptr
1920 ERL_DRV_PORT ErlDrvTermData port (from driver_mk_port(ErlDrvPort port))
1921 ERL_DRV_BINARY ErlDrvBinary *bin, ErlDrvUInt len, ErlDrvUInt offset
1922 ERL_DRV_BUF2BINARY char *buf, ErlDrvUInt len
1923 ERL_DRV_STRING char *str, int len
1924 ERL_DRV_TUPLE int sz
1925 ERL_DRV_LIST int sz
1926 ERL_DRV_PID ErlDrvTermData pid (from driver_connected(ErlDrvPort port)
1927 or driver_caller(ErlDrvPort port))
1928 ERL_DRV_STRING_CONS char *str, int len
1929 ERL_DRV_FLOAT double *dbl
1930 ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
1931 ERL_DRV_MAP int sz
1932
1933 The unsigned integer data type ErlDrvUInt and the signed integer
1934 data type ErlDrvSInt are 64 bits wide on a 64-bit runtime system
1935 and 32 bits wide on a 32-bit runtime system. They were intro‐
1936 duced in ERTS 5.6 and replaced some of the int arguments in the
1937 list above.
1938
1939 The unsigned integer data type ErlDrvUInt64 and the signed inte‐
1940 ger data type ErlDrvSInt64 are always 64 bits wide. They were
1941 introduced in ERTS 5.7.4.
1942
1943 To build the tuple {tcp, Port, [100 | Binary]}, the following
1944 call can be made.
1945
1946 ErlDrvBinary* bin = ...
1947 ErlDrvPort port = ...
1948 ErlDrvTermData spec[] = {
1949 ERL_DRV_ATOM, driver_mk_atom("tcp"),
1950 ERL_DRV_PORT, driver_mk_port(drvport),
1951 ERL_DRV_INT, 100,
1952 ERL_DRV_BINARY, bin, 50, 0,
1953 ERL_DRV_LIST, 2,
1954 ERL_DRV_TUPLE, 3,
1955 };
1956 erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));
1957
1958 Here bin is a driver binary of length at least 50 and drvport is
1959 a port handle. Notice that ERL_DRV_LIST comes after the elements
1960 of the list, likewise ERL_DRV_TUPLE.
1961
1962 The ERL_DRV_STRING_CONS term is a way to construct strings. It
1963 works differently from how ERL_DRV_STRING works.
1964 ERL_DRV_STRING_CONS builds a string list in reverse order (as
1965 opposed to how ERL_DRV_LIST works), concatenating the strings
1966 added to a list. The tail must be specified before
1967 ERL_DRV_STRING_CONS.
1968
1969 ERL_DRV_STRING constructs a string, and ends it. (So it is the
1970 same as ERL_DRV_NIL followed by ERL_DRV_STRING_CONS.)
1971
1972 /* to send [x, "abc", y] to the port: */
1973 ErlDrvTermData spec[] = {
1974 ERL_DRV_ATOM, driver_mk_atom("x"),
1975 ERL_DRV_STRING, (ErlDrvTermData)"abc", 3,
1976 ERL_DRV_ATOM, driver_mk_atom("y"),
1977 ERL_DRV_NIL,
1978 ERL_DRV_LIST, 4
1979 };
1980 erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));
1981
1982 /* to send "abc123" to the port: */
1983 ErlDrvTermData spec[] = {
1984 ERL_DRV_NIL, /* with STRING_CONS, the tail comes first */
1985 ERL_DRV_STRING_CONS, (ErlDrvTermData)"123", 3,
1986 ERL_DRV_STRING_CONS, (ErlDrvTermData)"abc", 3,
1987 };
1988 erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));
1989
1990 The ERL_DRV_EXT2TERM term type is used for passing a term en‐
1991 coded with the external format, that is, a term that has been
1992 encoded by erlang:term_to_binary, erl_interface:ei(3), and so
1993 on. For example, if binp is a pointer to an ErlDrvBinary that
1994 contains term {17, 4711} encoded with the external format, and
1995 you want to wrap it in a two-tuple with the tag my_tag, that is,
1996 {my_tag, {17, 4711}}, you can do as follows:
1997
1998 ErlDrvTermData spec[] = {
1999 ERL_DRV_ATOM, driver_mk_atom("my_tag"),
2000 ERL_DRV_EXT2TERM, (ErlDrvTermData) binp->orig_bytes, binp->orig_size
2001 ERL_DRV_TUPLE, 2,
2002 };
2003 erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));
2004
2005 To build the map #{key1 => 100, key2 => {200, 300}}, the follow‐
2006 ing call can be made.
2007
2008 ErlDrvPort port = ...
2009 ErlDrvTermData spec[] = {
2010 ERL_DRV_ATOM, driver_mk_atom("key1"),
2011 ERL_DRV_INT, 100,
2012 ERL_DRV_ATOM, driver_mk_atom("key2"),
2013 ERL_DRV_INT, 200,
2014 ERL_DRV_INT, 300,
2015 ERL_DRV_TUPLE, 2,
2016 ERL_DRV_MAP, 2
2017 };
2018 erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));
2019
2020 If you want to pass a binary and do not already have the content
2021 of the binary in an ErlDrvBinary, you can benefit from using
2022 ERL_DRV_BUF2BINARY instead of creating an ErlDrvBinary through
2023 driver_alloc_binary and then pass the binary through ERL_DRV_BI‐
2024 NARY. The runtime system often allocates binaries smarter if
2025 ERL_DRV_BUF2BINARY is used. However, if the content of the bi‐
2026 nary to pass already resides in an ErlDrvBinary, it is normally
2027 better to pass the binary using ERL_DRV_BINARY and the ErlDrvBi‐
2028 nary in question.
2029
2030 The ERL_DRV_UINT, ERL_DRV_BUF2BINARY, and ERL_DRV_EXT2TERM term
2031 types were introduced in ERTS 5.6.
2032
2033 This function is thread-safe.
2034
2035 int erl_drv_putenv(const char *key, char
2036 *value)
2037
2038 Sets the value of an environment variable.
2039
2040 key is a NULL-terminated string containing the name of the envi‐
2041 ronment variable.
2042
2043 value is a NULL-terminated string containing the new value of
2044 the environment variable.
2045
2046 Returns 0 on success, otherwise a value != 0.
2047
2048 Note:
2049 The result of passing the empty string ("") as a value is plat‐
2050 form-dependent. On some platforms the variable value is set to
2051 the empty string, on others the environment variable is removed.
2052
2053
2054 Warning:
2055 This function modifies the emulated environment used by
2056 os:putenv/2 and not the environment used by libc's putenv(3) or
2057 similar. Drivers that require that these are in sync will need
2058 to do so themselves, but keep in mind that they are segregated
2059 for a reason; putenv(3) and its friends are not thread-safe and
2060 may cause unrelated code to misbehave or crash the emulator.
2061
2062
2063 This function is thread-safe.
2064
2065 ErlDrvRWLock *erl_drv_rwlock_create(char
2066 *name)
2067
2068 Creates an rwlock and returns a pointer to it.
2069
2070 name is a string identifying the created rwlock. It is used to
2071 identify the rwlock in debug functionality (see note about the
2072 lock checker).
2073
2074 Returns NULL on failure. The driver creating the rwlock is re‐
2075 sponsible for destroying it before the driver is unloaded.
2076
2077 This function is thread-safe.
2078
2079 void erl_drv_rwlock_destroy(ErlDrvRWLock
2080 *rwlck)
2081
2082 Destroys an rwlock previously created by erl_drv_rwlock_create.
2083 The rwlock must be in an unlocked state before it is destroyed.
2084
2085 rwlck is a pointer to an rwlock to destroy.
2086
2087 This function is thread-safe.
2088
2089 char *erl_drv_rwlock_name(ErlDrvRWLock
2090 *rwlck)
2091
2092 Returns a pointer to the name of the rwlock.
2093
2094 rwlck is a pointer to an initialized rwlock.
2095
2096 Note:
2097 This function is intended for debugging purposes only.
2098
2099
2100 void erl_drv_rwlock_rlock(ErlDrvRWLock
2101 *rwlck)
2102
2103 Read locks an rwlock. The calling thread is blocked until the
2104 rwlock has been read locked. A thread that currently has read or
2105 read/write locked the rwlock cannot lock the same rwlock again.
2106
2107 rwlck is a pointer to the rwlock to read lock.
2108
2109 Warning:
2110 If you leave an rwlock locked in an emulator thread when you let
2111 the thread out of your control, you will very likely deadlock
2112 the whole emulator.
2113
2114
2115 This function is thread-safe.
2116
2117 void erl_drv_rwlock_runlock(ErlDrvRWLock
2118 *rwlck)
2119
2120 Read unlocks an rwlock. The rwlock currently must be read locked
2121 by the calling thread.
2122
2123 rwlck is a pointer to an rwlock to read unlock.
2124
2125 This function is thread-safe.
2126
2127 void erl_drv_rwlock_rwlock(ErlDrvRWLock
2128 *rwlck)
2129
2130 Read/write locks an rwlock. The calling thread is blocked until
2131 the rwlock has been read/write locked. A thread that currently
2132 has read or read/write locked the rwlock cannot lock the same
2133 rwlock again.
2134
2135 rwlck is a pointer to an rwlock to read/write lock.
2136
2137 Warning:
2138 If you leave an rwlock locked in an emulator thread when you let
2139 the thread out of your control, you will very likely deadlock
2140 the whole emulator.
2141
2142
2143 This function is thread-safe.
2144
2145 void erl_drv_rwlock_rwunlock(ErlDrvRWLock
2146 *rwlck)
2147
2148 Read/write unlocks an rwlock. The rwlock currently must be
2149 read/write locked by the calling thread.
2150
2151 rwlck is a pointer to an rwlock to read/write unlock.
2152
2153 This function is thread-safe.
2154
2155 int erl_drv_rwlock_tryrlock(ErlDrvRWLock
2156 *rwlck)
2157
2158 Tries to read lock an rwlock.
2159
2160 rwlck is a pointer to an rwlock to try to read lock.
2161
2162 Returns 0 on success, otherwise EBUSY. A thread that currently
2163 has read or read/write locked the rwlock cannot try to lock the
2164 same rwlock again.
2165
2166 Warning:
2167 If you leave an rwlock locked in an emulator thread when you let
2168 the thread out of your control, you will very likely deadlock
2169 the whole emulator.
2170
2171
2172 This function is thread-safe.
2173
2174 int erl_drv_rwlock_tryrwlock(ErlDrvRWLock
2175 *rwlck)
2176
2177 Tries to read/write lock an rwlock. A thread that currently has
2178 read or read/write locked the rwlock cannot try to lock the same
2179 rwlock again.
2180
2181 rwlckis pointer to an rwlock to try to read/write lock.
2182
2183 Returns 0 on success, otherwise EBUSY.
2184
2185 Warning:
2186 If you leave an rwlock locked in an emulator thread when you let
2187 the thread out of your control, you will very likely deadlock
2188 the whole emulator.
2189
2190
2191 This function is thread-safe.
2192
2193 int erl_drv_send_term(ErlDrvTermData port,
2194 ErlDrvTermData receiver, ErlDrvTermData* term, int n)
2195
2196 This function is the only way for a driver to send data to other
2197 processes than the port owner process. Parameter receiver speci‐
2198 fies the process to receive the data.
2199
2200 Note:
2201 Parameter port is not an ordinary port handle, but a port handle
2202 converted using driver_mk_port.
2203
2204
2205 Parameters port, term, and n work as in erl_drv_output_term.
2206
2207 This function is thread-safe.
2208
2209 void erl_drv_set_os_pid(ErlDrvPort port,
2210 ErlDrvSInt pid)
2211
2212 Sets the os_pid seen when doing erlang:port_info/2 on this port.
2213
2214 port is the port handle of the port (driver instance) to set the
2215 pid on. pidis the pid to set.
2216
2217 int erl_drv_thread_create(char *name, ErlDrvTid
2218 *tid, void * (*func)(void *), void *arg, ErlDrvThreadOpts
2219 *opts)
2220
2221 Creates a new thread.
2222
2223 name:
2224 A string identifying the created thread. It is used to iden‐
2225 tify the thread in planned future debug functionality.
2226
2227 tid:
2228 A pointer to a thread identifier variable.
2229
2230 func:
2231 A pointer to a function to execute in the created thread.
2232
2233 arg:
2234 A pointer to argument to the func function.
2235
2236 opts:
2237 A pointer to thread options to use or NULL.
2238
2239 Returns 0 on success, otherwise an errno value is returned to
2240 indicate the error. The newly created thread begins executing in
2241 the function pointed to by func, and func is passed arg as argu‐
2242 ment. When erl_drv_thread_create returns, the thread identifier
2243 of the newly created thread is available in *tid. opts can be
2244 either a NULL pointer, or a pointer to an ErlDrvThreadOpts
2245 structure. If opts is a NULL pointer, default options are used,
2246 otherwise the passed options are used.
2247
2248 Warning:
2249 You are not allowed to allocate the ErlDrvThreadOpts structure
2250 by yourself. It must be allocated and initialized by
2251 erl_drv_thread_opts_create.
2252
2253
2254 The created thread terminates either when func returns or if
2255 erl_drv_thread_exit is called by the thread. The exit value of
2256 the thread is either returned from func or passed as argument to
2257 erl_drv_thread_exit. The driver creating the thread is responsi‐
2258 ble for joining the thread, through erl_drv_thread_join, before
2259 the driver is unloaded. "Detached" threads cannot be created,
2260 that is, threads that do not need to be joined.
2261
2262 Warning:
2263 All created threads must be joined by the driver before it is
2264 unloaded. If the driver fails to join all threads created before
2265 it is unloaded, the runtime system most likely crashes when the
2266 driver code is unloaded.
2267
2268
2269 This function is thread-safe.
2270
2271 void erl_drv_thread_exit(void
2272 *exit_value)
2273
2274 Terminates the calling thread with the exit value passed as ar‐
2275 gument. exit_value is a pointer to an exit value or NULL.
2276
2277 You are only allowed to terminate threads created with
2278 erl_drv_thread_create.
2279
2280 The exit value can later be retrieved by another thread through
2281 erl_drv_thread_join.
2282
2283 This function is thread-safe.
2284
2285 int erl_drv_thread_join(ErlDrvTid tid, void
2286 **exit_value)
2287
2288 Joins the calling thread with another thread, that is, the call‐
2289 ing thread is blocked until the thread identified by tid has
2290 terminated.
2291
2292 tid is the thread identifier of the thread to join. exit_value
2293 is a pointer to a pointer to an exit value, or NULL.
2294
2295 Returns 0 on success, otherwise an errno value is returned to
2296 indicate the error.
2297
2298 A thread can only be joined once. The behavior of joining more
2299 than once is undefined, an emulator crash is likely. If
2300 exit_value == NULL, the exit value of the terminated thread is
2301 ignored, otherwise the exit value of the terminated thread is
2302 stored at *exit_value.
2303
2304 This function is thread-safe.
2305
2306 char *erl_drv_thread_name(ErlDrvTid
2307 tid)
2308
2309 Returns a pointer to the name of the thread.
2310
2311 tid is a thread identifier.
2312
2313 Note:
2314 This function is intended for debugging purposes only.
2315
2316
2317 ErlDrvThreadOpts *erl_drv_thread_opts_create(char *name)
2318
2319 Allocates and initializes a thread option structure.
2320
2321 name is a string identifying the created thread options. It is
2322 used to identify the thread options in planned future debug
2323 functionality.
2324
2325 Returns NULL on failure. A thread option structure is used for
2326 passing options to erl_drv_thread_create. If the structure is
2327 not modified before it is passed to erl_drv_thread_create, the
2328 default values are used.
2329
2330 Warning:
2331 You are not allowed to allocate the ErlDrvThreadOpts structure
2332 by yourself. It must be allocated and initialized by
2333 erl_drv_thread_opts_create.
2334
2335
2336 This function is thread-safe.
2337
2338 void erl_drv_thread_opts_destroy(ErlDrvThreadOpts *opts)
2339
2340 Destroys thread options previously created by
2341 erl_drv_thread_opts_create.
2342
2343 opts is a pointer to thread options to destroy.
2344
2345 This function is thread-safe.
2346
2347 ErlDrvTid erl_drv_thread_self(void)
2348
2349 Returns the thread identifier of the calling thread.
2350
2351 This function is thread-safe.
2352
2353 ErlDrvTime erl_drv_time_offset(ErlDrvTimeUnit
2354 time_unit)
2355
2356 Returns the current time offset between Erlang monotonic time
2357 and Erlang system time converted into the time_unit passed as
2358 argument.
2359
2360 time_unit is time unit of returned value.
2361
2362 Returns ERL_DRV_TIME_ERROR if called with an invalid time unit
2363 argument, or if called from a thread that is not a scheduler
2364 thread.
2365
2366 See also ErlDrvTime and ErlDrvTimeUnit.
2367
2368 void *erl_drv_tsd_get(ErlDrvTSDKey
2369 key)
2370
2371 Returns the thread-specific data associated with key for the
2372 calling thread.
2373
2374 key is a thread-specific data key.
2375
2376 Returns NULL if no data has been associated with key for the
2377 calling thread.
2378
2379 This function is thread-safe.
2380
2381 int erl_drv_tsd_key_create(char *name,
2382 ErlDrvTSDKey *key)
2383
2384 Creates a thread-specific data key.
2385
2386 name is a string identifying the created key. It is used to
2387 identify the key in planned future debug functionality.
2388
2389 key is a pointer to a thread-specific data key variable.
2390
2391 Returns 0 on success, otherwise an errno value is returned to
2392 indicate the error. The driver creating the key is responsible
2393 for destroying it before the driver is unloaded.
2394
2395 This function is thread-safe.
2396
2397 void erl_drv_tsd_key_destroy(ErlDrvTSDKey
2398 key)
2399
2400 Destroys a thread-specific data key previously created by
2401 erl_drv_tsd_key_create. All thread-specific data using this key
2402 in all threads must be cleared (see erl_drv_tsd_set) before the
2403 call to erl_drv_tsd_key_destroy.
2404
2405 key is a thread-specific data key to destroy.
2406
2407 Warning:
2408 A destroyed key is very likely to be reused soon. Therefore, if
2409 you fail to clear the thread-specific data using this key in a
2410 thread before destroying the key, you will very likely get unex‐
2411 pected errors in other parts of the system.
2412
2413
2414 This function is thread-safe.
2415
2416 void erl_drv_tsd_set(ErlDrvTSDKey key, void
2417 *data)
2418
2419 Sets thread-specific data associated with key for the calling
2420 thread. You are only allowed to set thread-specific data for
2421 threads while they are fully under your control. For example, if
2422 you set thread-specific data in a thread calling a driver call‐
2423 back function, it must be cleared, that is, set to NULL, before
2424 returning from the driver callback function.
2425
2426 key is a thread-specific data key.
2427
2428 data is a pointer to data to associate with key in the calling
2429 thread.
2430
2431 Warning:
2432 If you fail to clear thread-specific data in an emulator thread
2433 before letting it out of your control, you might never be able
2434 to clear this data with later unexpected errors in other parts
2435 of the system as a result.
2436
2437
2438 This function is thread-safe.
2439
2440 char *erl_errno_id(int error)
2441
2442 Returns the atom name of the Erlang error, given the error num‐
2443 ber in error. The error atoms are einval, enoent, and so on. It
2444 can be used to make error terms from the driver.
2445
2446 int remove_driver_entry(ErlDrvEntry
2447 *de)
2448
2449 Removes a driver entry de previously added with add_driver_en‐
2450 try.
2451
2452 Driver entries added by the erl_ddll Erlang interface cannot be
2453 removed by using this interface.
2454
2455 void set_busy_port(ErlDrvPort port, int
2456 on)
2457
2458 Sets and unsets the busy state of the port. If on is non-zero,
2459 the port is set to busy. If it is zero, the port is set to not
2460 busy. You typically want to combine this feature with the busy
2461 port message queue functionality.
2462
2463 Processes sending command data to the port are suspended if ei‐
2464 ther the port or the port message queue is busy. Suspended pro‐
2465 cesses are resumed when neither the port or the port message
2466 queue is busy. Command data is in this context data passed to
2467 the port using either Port ! {Owner, {command, Data}} or
2468 port_command/[2,3].
2469
2470 If the ERL_DRV_FLAG_SOFT_BUSY has been set in the driver_entry,
2471 data can be forced into the driver through erlang:port_com‐
2472 mand(Port, Data, [force]) even if the driver has signaled that
2473 it is busy.
2474
2475 For information about busy port message queue functionality, see
2476 erl_drv_busy_msgq_limits.
2477
2478 void set_port_control_flags(ErlDrvPort port,
2479 int flags)
2480
2481 Sets flags for how the control driver entry function will return
2482 data to the port owner process. (The control function is called
2483 from erlang:port_control/3.)
2484
2485 Currently there are only two meaningful values for flags: 0
2486 means that data is returned in a list, and PORT_CONTROL_FLAG_BI‐
2487 NARY means data is returned as a binary from control.
2488
2490 driver_entry(3), erlang(3), erl_ddll(3), section How to Implement an
2491 Alternative Carrier for the Erlang Distribution in the User's Guide
2492
2493
2494
2495Ericsson AB erts 13.2.2.4 erl_driver(3)