Skip to content

Commit 50d69f7

Browse files
authored
Merge PR-11435 from sverker/erts/driver-start-args
OTP-20299
2 parents 6dc78b2 + 0e6ef38 commit 50d69f7

3 files changed

Lines changed: 27 additions & 17 deletions

File tree

erts/doc/references/driver_entry.md

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,8 @@ typedef struct erl_drv_entry {
114114
int (*init)(void); /* Called at system startup for statically
115115
linked drivers, and after loading for
116116
dynamically loaded drivers */
117-
#ifndef ERL_SYS_DRV
118117
ErlDrvData (*start)(ErlDrvPort port, char *command);
119-
/* Called when open_port/2 is invoked,
120-
return value -1 means failure */
121-
#else
122-
ErlDrvData (*start)(ErlDrvPort port, char *command, SysDriverOpts* opts);
123-
/* Special options, only for system driver */
124-
#endif
118+
/* Called when open_port/2 is invoked */
125119
void (*stop)(ErlDrvData drv_data);
126120
/* Called when port is closed, and when the
127121
emulator is halted */

erts/emulator/beam/global.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,9 @@ struct erts_driver_t_ {
225225
DE_Handle *handle;
226226
erts_mtx_t *lock;
227227
ErlDrvEntry *entry;
228-
ErlDrvData (*start)(ErlDrvPort port, char *command, SysDriverOpts* opts);
228+
ErlDrvData (*start)(ErlDrvPort port, char *command);
229+
ErlDrvData (*start_sys_drv)(ErlDrvPort port, char *command,
230+
SysDriverOpts* opts);
229231
void (*stop)(ErlDrvData drv_data);
230232
void (*finish)(void);
231233
void (*flush)(ErlDrvData drv_data);

erts/emulator/beam/io.c

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ static erts_atomic64_t bytes_in;
9393
static erts_atomic64_t bytes_out;
9494

9595
static void deliver_result(Port *p, Eterm sender, Eterm pid, Eterm res);
96-
static int init_driver(erts_driver_t *, ErlDrvEntry *, DE_Handle *);
96+
static int init_driver(erts_driver_t *, ErlDrvEntry *, DE_Handle *, bool);
9797
static void terminate_port(Port *p);
9898
static void pdl_init(void);
9999
static int driver_failure_term(ErlDrvPort ix, Eterm term, int eof);
@@ -685,7 +685,7 @@ erts_open_driver(erts_driver_t* driver, /* Pointer to driver. */
685685
&opts->high_msgq_watermark);
686686

687687
error_number = error_type = 0;
688-
if (driver->start) {
688+
if (driver->start || driver->start_sys_drv) {
689689
ERTS_MSACC_PUSH_STATE_M();
690690
if (ERTS_IS_P_TRACED_FL(port, F_TRACE_SCHED_PORTS)) {
691691
trace_sched_ports_where(port, am_in, am_open);
@@ -710,7 +710,13 @@ erts_open_driver(erts_driver_t* driver, /* Pointer to driver. */
710710
}
711711
#endif
712712

713-
drv_data = (*driver->start)(ERTS_Port2ErlDrvPort(port), name, opts);
713+
if (driver->start_sys_drv) {
714+
drv_data = (*driver->start_sys_drv)(ERTS_Port2ErlDrvPort(port),
715+
name, opts);
716+
}
717+
else {
718+
drv_data = (*driver->start)(ERTS_Port2ErlDrvPort(port), name);
719+
}
714720
if (((SWord) drv_data) == -1)
715721
error_type = -1;
716722
else if (((SWord) drv_data) == -2) {
@@ -3026,10 +3032,10 @@ void erts_init_io(int port_tab_size,
30263032
erts_tsd_set(driver_list_lock_status_key, (void *) 1);
30273033
erts_rwmtx_rwlock(&erts_driver_list_lock);
30283034

3029-
init_driver(&fd_driver, &fd_driver_entry, NULL);
3030-
init_driver(&spawn_driver, &spawn_driver_entry, NULL);
3035+
init_driver(&fd_driver, &fd_driver_entry, NULL, true);
3036+
init_driver(&spawn_driver, &spawn_driver_entry, NULL, true);
30313037
#ifndef __WIN32__
3032-
init_driver(&forker_driver, &forker_driver_entry, NULL);
3038+
init_driver(&forker_driver, &forker_driver_entry, NULL, true);
30333039
#endif
30343040
erts_init_static_drivers();
30353041
for (dp = driver_tab; dp->de != NULL; dp++)
@@ -7549,7 +7555,8 @@ no_stop_select_callback(ErlDrvEvent event, void* private)
75497555
((DE)->major_version == (MAJOR) && (DE)->minor_version >= (MINOR)))
75507556

75517557
static int
7552-
init_driver(erts_driver_t *drv, ErlDrvEntry *de, DE_Handle *handle)
7558+
init_driver(erts_driver_t *drv, ErlDrvEntry *de, DE_Handle *handle,
7559+
bool is_system_driver)
75537560
{
75547561
drv->name_atom = erts_atom_put((byte*)de->driver_name,
75557562
sys_strlen(de->driver_name),
@@ -7572,7 +7579,14 @@ init_driver(erts_driver_t *drv, ErlDrvEntry *de, DE_Handle *handle)
75727579
}
75737580
drv->entry = de;
75747581

7575-
drv->start = de->start;
7582+
if (is_system_driver) {
7583+
drv->start = NULL;
7584+
drv->start_sys_drv = de->start;
7585+
}
7586+
else {
7587+
drv->start = (ErlDrvData (*)(ErlDrvPort, char *)) de->start;
7588+
drv->start_sys_drv = NULL;
7589+
}
75767590
drv->stop = de->stop;
75777591
drv->finish = de->finish;
75787592
drv->flush = de->flush;
@@ -7653,7 +7667,7 @@ int erts_add_driver_entry(ErlDrvEntry *de, DE_Handle *handle,
76537667
}
76547668

76557669
if (!err) {
7656-
err = init_driver(dp, de, handle);
7670+
err = init_driver(dp, de, handle, false);
76577671

76587672
if (taint) {
76597673
erts_add_taint(dp->name_atom);

0 commit comments

Comments
 (0)