@@ -93,7 +93,7 @@ static erts_atomic64_t bytes_in;
9393static erts_atomic64_t bytes_out ;
9494
9595static 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 );
9797static void terminate_port (Port * p );
9898static void pdl_init (void );
9999static 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
75517557static 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