From 92c56e129bae6dd054c89a6077009e25da5b7e29 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Fri, 1 Nov 2013 01:56:33 +0000 Subject: [PATCH] [cmdline] Rewrite "sync" command to use monojob_wait() Signed-off-by: Michael Brown --- src/core/pending.c | 20 +--------- src/hci/commands/sync_cmd.c | 4 +- src/include/ipxe/pending.h | 16 ++++++-- src/include/usr/sync.h | 14 +++++++ src/usr/sync.c | 74 +++++++++++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 25 deletions(-) create mode 100644 src/include/usr/sync.h create mode 100644 src/usr/sync.c diff --git a/src/core/pending.c b/src/core/pending.c index c2671a688..7bb0c2e00 100644 --- a/src/core/pending.c +++ b/src/core/pending.c @@ -31,7 +31,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); */ /** Total count of pending operations */ -static int pending_total; +int pending_total; /** * Mark an operation as pending @@ -60,21 +60,3 @@ void pending_put ( struct pending_operation *pending ) { pending, pending->count, pending_total ); } } - -/** - * Wait for pending operations to complete - * - * @v timeout Timeout period, in ticks (0=indefinite) - * @ret rc Return status code - */ -int pending_wait ( unsigned long timeout ) { - unsigned long start = currticks(); - - do { - if ( pending_total == 0 ) - return 0; - step(); - } while ( ( timeout == 0 ) || ( ( currticks() - start ) < timeout ) ); - - return -ETIMEDOUT; -} diff --git a/src/hci/commands/sync_cmd.c b/src/hci/commands/sync_cmd.c index ee932939c..3c9ef2a4d 100644 --- a/src/hci/commands/sync_cmd.c +++ b/src/hci/commands/sync_cmd.c @@ -24,7 +24,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include -#include +#include /** @file * @@ -65,7 +65,7 @@ static int sync_exec ( int argc, char **argv ) { return rc; /* Wait for pending operations to complete */ - if ( ( rc = pending_wait ( opts.timeout ) ) != 0 ) { + if ( ( rc = sync ( opts.timeout ) ) != 0 ) { printf ( "Operations did not complete: %s\n", strerror ( rc ) ); return rc; } diff --git a/src/include/ipxe/pending.h b/src/include/ipxe/pending.h index 51afb4370..e6a369813 100644 --- a/src/include/ipxe/pending.h +++ b/src/include/ipxe/pending.h @@ -9,8 +9,6 @@ FILE_LICENCE ( GPL2_OR_LATER ); -#include - /** A pending operation */ struct pending_operation { /** Pending count */ @@ -21,14 +19,24 @@ struct pending_operation { * Check if an operation is pending * * @v pending Pending operation - * @v is_pending Operation is pending + * @ret is_pending Operation is pending */ static inline int is_pending ( struct pending_operation *pending ) { return ( pending->count != 0 ); } +extern int pending_total; + +/** + * Check if any operations are pending + * + * @ret have_pending Some operations are pending + */ +static inline int have_pending ( void ) { + return ( pending_total != 0 ); +} + extern void pending_get ( struct pending_operation *pending ); extern void pending_put ( struct pending_operation *pending ); -extern int pending_wait ( unsigned long timeout ); #endif /* _IPXE_PENDING_H */ diff --git a/src/include/usr/sync.h b/src/include/usr/sync.h new file mode 100644 index 000000000..0047d4ed9 --- /dev/null +++ b/src/include/usr/sync.h @@ -0,0 +1,14 @@ +#ifndef _USR_SYNC_H +#define _USR_SYNC_H + +/** @file + * + * Wait for pending operations to complete + * + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +extern int sync ( unsigned long timeout ); + +#endif /* _USR_SYNC_H */ diff --git a/src/usr/sync.c b/src/usr/sync.c new file mode 100644 index 000000000..f7a04c44c --- /dev/null +++ b/src/usr/sync.c @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2012 Michael Brown . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#include +#include +#include +#include +#include + +/** @file + * + * Wait for pending operations to complete + * + */ + +/** + * Report progress + * + * @v intf Interface + * @v progress Progress report to fill in + * @ret ongoing_rc Ongoing job status code (if known) + */ +static int sync_progress ( struct interface *intf, + struct job_progress *progress __unused ) { + + /* Terminate successfully if no pending operations remain */ + if ( ! have_pending() ) + intf_close ( intf, 0 ); + + return 0; +} + +/** Synchroniser interface operations */ +static struct interface_operation sync_intf_op[] = { + INTF_OP ( job_progress, struct interface *, sync_progress ), +}; + +/** Synchroniser interface descriptor */ +static struct interface_descriptor sync_intf_desc = + INTF_DESC_PURE ( sync_intf_op ); + +/** Synchroniser */ +static struct interface sync_intf = INTF_INIT ( sync_intf_desc ); + +/** + * Wait for pending operations to complete + * + * @v timeout Timeout period, in ticks (0=indefinite) + * @ret rc Return status code + */ +int sync ( unsigned long timeout ) { + + /* Attach synchroniser and wait for completion */ + intf_plug_plug ( &monojob, &sync_intf ); + return monojob_wait ( NULL, timeout ); +}