diff --git a/sim_tape.c b/sim_tape.c index 7c2ffe2c..28d20619 100644 --- a/sim_tape.c +++ b/sim_tape.c @@ -322,10 +322,19 @@ sim_debug (ctx->dbit, ctx->dptr, "_tape_completion_dispatch(unit=%d, top=%d, cal if (ctx->io_top != TOP_DONE) abort(); /* horribly wrong, stop */ -if (ctx->callback && ctx->io_top == TOP_DONE) { +if (ctx->asynch_io) + pthread_mutex_lock (&ctx->io_lock); + +if (ctx->callback) { ctx->callback = NULL; + if (ctx->asynch_io) + pthread_mutex_unlock (&ctx->io_lock); callback (uptr, ctx->io_status); } +else { + if (ctx->asynch_io) + pthread_mutex_unlock (&ctx->io_lock); + } } static t_bool _tape_is_active (UNIT *uptr)