From ff8528ea9a69ca2ef6cfbed0b7a1283e165aabe6 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 16 Jan 2007 08:10:54 +0000 Subject: Create and use async_block() macro; it cuts down on the visual overhead of blocking on asynchronous operations, when that isn't an important aspect of the code. --- src/include/gpxe/async.h | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'src/include/gpxe') diff --git a/src/include/gpxe/async.h b/src/include/gpxe/async.h index d3b075b92..b1ca1a1cc 100644 --- a/src/include/gpxe/async.h +++ b/src/include/gpxe/async.h @@ -167,4 +167,40 @@ static inline aid_t async_init_orphan ( struct async *async ) { return async_init ( async, &orphan_async_operations, NULL ); } +/** + * Execute and block on an asynchronous operation + * + * @v async_temp Temporary asynchronous operation structure to use + * @v START Code used to start the asynchronous operation + * @ret rc Return status code + * + * This is a notational shorthand for writing + * + * async_init_orphan ( &async_temp ); + * if ( ( rc = START ) == 0 ) + * async_wait ( &async_temp ); + * if ( rc != 0 ) { + * ...handle failure... + * } + * + * and allows you instead to write + * + * if ( ( rc = async_block ( &async_temp, START ) ) != 0 ) { + * ...handle failure... + * } + * + * The argument START is a code snippet; it should initiate an + * asynchronous operation as a child of @c async_temp and return an + * error status code if it failed to do so (e.g. due to malloc() + * failure). + */ +#define async_block( async_temp, START ) ( { \ + int rc; \ + \ + async_init_orphan ( async_temp ); \ + if ( ( rc = START ) == 0 ) \ + async_wait ( async_temp, &rc, 1 ); \ + rc; \ + } ) + #endif /* _GPXE_ASYNC_H */ -- cgit v1.2.3-55-g7522