diff options
author | Rickard Green <[email protected]> | 2012-12-18 14:57:35 +0100 |
---|---|---|
committer | Rickard Green <[email protected]> | 2012-12-18 14:57:35 +0100 |
commit | 955d2f9dad5cedc25afb8dd7893f697f4f6f26a9 (patch) | |
tree | 0e5963cf6f5af6ce48da50f4109f1334c3ff9b25 /erts/emulator/beam/io.c | |
parent | 5b1e008c8a02d670e07d9eaccd80b28a22bdbc65 (diff) | |
parent | fe6cac45c744ed2937e9905f779244d93142f2db (diff) | |
download | otp-955d2f9dad5cedc25afb8dd7893f697f4f6f26a9.tar.gz otp-955d2f9dad5cedc25afb8dd7893f697f4f6f26a9.tar.bz2 otp-955d2f9dad5cedc25afb8dd7893f697f4f6f26a9.zip |
Merge branch 'rickard/r16/port-optimizations/OTP-10336'
* rickard/r16/port-optimizations/OTP-10336:
Fix driver_monitor_process() ASSERT
Fix scheduled port link operation
Fix aborts of port tasks when terminating ports
Diffstat (limited to 'erts/emulator/beam/io.c')
-rw-r--r-- | erts/emulator/beam/io.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c index be094862d4..e466f0e299 100644 --- a/erts/emulator/beam/io.c +++ b/erts/emulator/beam/io.c @@ -82,9 +82,11 @@ static void pdl_init(void); #ifdef ERTS_SMP static void driver_monitor_lock_pdl(Port *p); static void driver_monitor_unlock_pdl(Port *p); +#define DRV_MONITOR_LOOKUP_PORT_LOCK_PDL(Port) erts_thr_drvport2port_raw((Port), 1) #define DRV_MONITOR_LOCK_PDL(Port) driver_monitor_lock_pdl(Port) #define DRV_MONITOR_UNLOCK_PDL(Port) driver_monitor_unlock_pdl(Port) #else +#define DRV_MONITOR_LOOKUP_PORT_LOCK_PDL(Port) erts_thr_drvport2port_raw((Port), 0) #define DRV_MONITOR_LOCK_PDL(Port) /* nothing */ #define DRV_MONITOR_UNLOCK_PDL(Port) /* nothing */ #endif @@ -95,7 +97,7 @@ static void driver_monitor_unlock_pdl(Port *p); static ERTS_INLINE ErlIOQueue* drvport2ioq(ErlDrvPort drvport) { - Port *prt = erts_thr_drvport2port_raw(drvport); + Port *prt = erts_thr_drvport2port_raw(drvport, 0); erts_aint32_t state = erts_atomic32_read_nob(&prt->state); if (state & ERTS_PORT_SFLGS_INVALID_DRIVER_LOOKUP) return NULL; @@ -2534,6 +2536,8 @@ port_link_failure(Eterm port_id, Eterm linker) if (IS_TRACED_FL(rp, F_TRACE_PROCS)) trace_proc(NULL, rp, am_getting_unlinked, port_id); } + if (rp_locks) + erts_smp_proc_unlock(rp, rp_locks); } } } @@ -6737,9 +6741,7 @@ int driver_monitor_process(ErlDrvPort drvport, ErtsSchedulerData *sched = erts_get_scheduler_data(); #endif - prt = erts_thr_drvport2port_raw(drvport); - - DRV_MONITOR_LOCK_PDL(prt); + prt = DRV_MONITOR_LOOKUP_PORT_LOCK_PDL(drvport); state = erts_atomic32_read_nob(&prt->state); @@ -6818,9 +6820,7 @@ int driver_demonitor_process(ErlDrvPort drvport, ErtsSchedulerData *sched = erts_get_scheduler_data(); #endif - prt = erts_thr_drvport2port_raw(drvport); - - DRV_MONITOR_LOCK_PDL(prt); + prt = DRV_MONITOR_LOOKUP_PORT_LOCK_PDL(drvport); state = erts_atomic32_read_nob(&prt->state); @@ -6881,9 +6881,7 @@ ErlDrvTermData driver_get_monitored_process(ErlDrvPort drvport, ErtsSchedulerData *sched = erts_get_scheduler_data(); #endif - prt = erts_thr_drvport2port_raw(drvport); - - DRV_MONITOR_LOCK_PDL(prt); + prt = DRV_MONITOR_LOOKUP_PORT_LOCK_PDL(drvport); state = erts_atomic32_read_nob(&prt->state); if (state & ERTS_PORT_SFLGS_INVALID_DRIVER_LOOKUP) { |