From 7e1840eb5f218527f5a09562a306485c424ecff8 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Mon, 7 Jan 2013 09:25:57 -0800 Subject: [PATCH] Fixed bugs in disk and tape operations when running without asynch disabled - bugs reported by Jordi Guillaumes i Pons --- sim_disk.c | 21 ++++++++++++++------- sim_tape.c | 21 ++++++++++++++------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/sim_disk.c b/sim_disk.c index 56132c04..2452458b 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -239,19 +239,26 @@ static t_bool _disk_is_active (UNIT *uptr) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; -sim_debug (ctx->dbit, ctx->dptr, "_disk_is_active(unit=%d, dop=%d)\n", uptr-ctx->dptr->units, ctx->io_dop); -return (ctx->io_dop != DOP_DONE); +if (ctx) { + sim_debug (ctx->dbit, ctx->dptr, "_disk_is_active(unit=%d, dop=%d)\n", uptr-ctx->dptr->units, ctx->io_dop); + return (ctx->io_dop != DOP_DONE); + } +return FALSE; } static void _disk_cancel (UNIT *uptr) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; -sim_debug (ctx->dbit, ctx->dptr, "_disk_cancel(unit=%d, dop=%d)\n", uptr-ctx->dptr->units, ctx->io_dop); -pthread_mutex_lock (&ctx->io_lock); -while (ctx->io_dop != DOP_DONE) - pthread_cond_wait (&ctx->io_done, &ctx->io_lock); -pthread_mutex_unlock (&ctx->io_lock); +if (ctx) { + sim_debug (ctx->dbit, ctx->dptr, "_disk_cancel(unit=%d, dop=%d)\n", uptr-ctx->dptr->units, ctx->io_dop); + if (ctx->asynch_io) { + pthread_mutex_lock (&ctx->io_lock); + while (ctx->io_dop != DOP_DONE) + pthread_cond_wait (&ctx->io_done, &ctx->io_lock); + pthread_mutex_unlock (&ctx->io_lock); + } + } } #else #define AIO_CALLSETUP diff --git a/sim_tape.c b/sim_tape.c index 08e377ae..813a5baa 100644 --- a/sim_tape.c +++ b/sim_tape.c @@ -314,19 +314,26 @@ static t_bool _tape_is_active (UNIT *uptr) { struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; -sim_debug (ctx->dbit, ctx->dptr, "_tape_is_active(unit=%d, top=%d)\n", uptr-ctx->dptr->units, ctx->io_top); -return (ctx->io_top != TOP_DONE); +if (ctx) { + sim_debug (ctx->dbit, ctx->dptr, "_tape_is_active(unit=%d, top=%d)\n", uptr-ctx->dptr->units, ctx->io_top); + return (ctx->io_top != TOP_DONE); + } +return FALSE; } static void _tape_cancel (UNIT *uptr) { struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; -sim_debug (ctx->dbit, ctx->dptr, "_tape_cancel(unit=%d, top=%d)\n", uptr-ctx->dptr->units, ctx->io_top); -pthread_mutex_lock (&ctx->io_lock); -while (ctx->io_top != TOP_DONE) - pthread_cond_wait (&ctx->io_done, &ctx->io_lock); -pthread_mutex_unlock (&ctx->io_lock); +if (ctx) { + sim_debug (ctx->dbit, ctx->dptr, "_tape_cancel(unit=%d, top=%d)\n", uptr-ctx->dptr->units, ctx->io_top); + if (ctx->asynch_io) { + pthread_mutex_lock (&ctx->io_lock); + while (ctx->io_top != TOP_DONE) + pthread_cond_wait (&ctx->io_done, &ctx->io_lock); + pthread_mutex_unlock (&ctx->io_lock); + } + } } #else #define AIO_CALLSETUP