diff -Naur otp_src_R12B-3/erts/emulator/beam/io.c otp_src_R12B-3_OTP-7464/erts/emulator/beam/io.c --- otp_src_R12B-3/erts/emulator/beam/io.c 2008-06-10 14:47:22.000000000 +0200 +++ otp_src_R12B-3_OTP-7464/erts/emulator/beam/io.c 2008-08-04 16:52:15.000000000 +0200 @@ -302,13 +302,14 @@ #endif ErlDrvEntry *driver; + erts_smp_port_tab_lock(); + ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(prt)); driver = prt->drv_ptr; prt->drv_ptr = NULL; ASSERT(driver); #ifdef ERTS_SMP - erts_smp_port_tab_lock(); ASSERT(prt->status & ERTS_PORT_SFLG_FREE_SCHEDULED); ERTS_SMP_LC_ASSERT(erts_smp_atomic_read(&prt->refc) == 0); @@ -412,6 +413,8 @@ prt->status = ERTS_PORT_SFLG_CONNECTED | xstatus; old_name = prt->name; prt->name = new_name; + ASSERT(!prt->drv_ptr); + prt->drv_ptr = driver; erts_smp_port_tab_unlock(); erts_smp_tasks_unlock(); #ifdef ERTS_SMP @@ -423,8 +426,6 @@ prt->control_flags = 0; prt->connected = pid; - ASSERT(!prt->drv_ptr); - prt->drv_ptr = driver; prt->drv_data = (long) drv_data; prt->bytes_in = 0; prt->bytes_out = 0;