From a03dd97e6b4c6d1d30ac9dc7e63f87402434d9bc Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 12 Jun 2008 21:47:19 +0100 Subject: [interface] Convert all job-control interfaces to generic interfaces Remove job-control as an interface type, and replace job-control interfaces with generic interfaces supporting the close() method. (Both done() and kill() are absorbed into the function of close(); kill() is merely close(-ECANCELED).) Signed-off-by: Michael Brown --- src/core/downloader.c | 69 ++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 39 deletions(-) (limited to 'src/core/downloader.c') diff --git a/src/core/downloader.c b/src/core/downloader.c index 5499ddaba..de5ea458c 100644 --- a/src/core/downloader.c +++ b/src/core/downloader.c @@ -41,7 +41,7 @@ struct downloader { struct refcnt refcnt; /** Job control interface */ - struct job_interface job; + struct interface job; /** Data transfer interface */ struct xfer_interface xfer; @@ -74,13 +74,14 @@ static void downloader_free ( struct refcnt *refcnt ) { */ static void downloader_finished ( struct downloader *downloader, int rc ) { - /* Block further incoming messages */ - job_nullify ( &downloader->job ); - xfer_nullify ( &downloader->xfer ); + /* Register image if download was successful */ + if ( rc == 0 ) + rc = downloader->register_image ( downloader->image ); - /* Free resources and close interfaces */ + /* Shut down interfaces */ + xfer_nullify ( &downloader->xfer ); xfer_close ( &downloader->xfer, rc ); - job_done ( &downloader->job, rc ); + intf_shutdown ( &downloader->job, rc ); } /** @@ -120,29 +121,14 @@ static int downloader_ensure_size ( struct downloader *downloader, * */ -/** - * Handle kill() event received via job control interface - * - * @v job Downloader job control interface - */ -static void downloader_job_kill ( struct job_interface *job ) { - struct downloader *downloader = - container_of ( job, struct downloader, job ); - - /* Terminate download */ - downloader_finished ( downloader, -ECANCELED ); -} - /** * Report progress of download job * - * @v job Downloader job control interface + * @v downloader Downloader * @v progress Progress report to fill in */ -static void downloader_job_progress ( struct job_interface *job, - struct job_progress *progress ) { - struct downloader *downloader = - container_of ( job, struct downloader, job ); +static void downloader_progress ( struct downloader *downloader, + struct job_progress *progress ) { /* This is not entirely accurate, since downloaded data may * arrive out of order (e.g. with multicast protocols), but @@ -152,13 +138,6 @@ static void downloader_job_progress ( struct job_interface *job, progress->total = downloader->image->len; } -/** Downloader job control interface operations */ -static struct job_interface_operations downloader_job_operations = { - .done = ignore_job_done, - .kill = downloader_job_kill, - .progress = downloader_job_progress, -}; - /**************************************************************************** * * Data transfer interface @@ -215,10 +194,6 @@ static void downloader_xfer_close ( struct xfer_interface *xfer, int rc ) { struct downloader *downloader = container_of ( xfer, struct downloader, xfer ); - /* Register image if download was successful */ - if ( rc == 0 ) - rc = downloader->register_image ( downloader->image ); - /* Terminate download */ downloader_finished ( downloader, rc ); } @@ -233,6 +208,22 @@ static struct xfer_interface_operations downloader_xfer_operations = { .deliver_raw = xfer_deliver_as_iob, }; +/**************************************************************************** + * + * Job control interface + * + */ + +/** Downloader job control interface operations */ +static struct interface_operation downloader_job_op[] = { + INTF_OP ( job_progress, struct downloader *, downloader_progress ), + INTF_OP ( intf_close, struct downloader *, downloader_finished ), +}; + +/** Downloader job control interface descriptor */ +static struct interface_descriptor downloader_job_desc = + INTF_DESC ( struct downloader, job, downloader_job_op ); + /**************************************************************************** * * Instantiator @@ -253,7 +244,7 @@ static struct xfer_interface_operations downloader_xfer_operations = { * the specified image object. If the download is successful, the * image registration routine @c register_image() will be called. */ -int create_downloader ( struct job_interface *job, struct image *image, +int create_downloader ( struct interface *job, struct image *image, int ( * register_image ) ( struct image *image ), int type, ... ) { struct downloader *downloader; @@ -265,8 +256,8 @@ int create_downloader ( struct job_interface *job, struct image *image, if ( ! downloader ) return -ENOMEM; ref_init ( &downloader->refcnt, downloader_free ); - job_init ( &downloader->job, &downloader_job_operations, - &downloader->refcnt ); + intf_init ( &downloader->job, &downloader_job_desc, + &downloader->refcnt ); xfer_init ( &downloader->xfer, &downloader_xfer_operations, &downloader->refcnt ); downloader->image = image_get ( image ); @@ -278,7 +269,7 @@ int create_downloader ( struct job_interface *job, struct image *image, goto err; /* Attach parent interface, mortalise self, and return */ - job_plug_plug ( &downloader->job, job ); + intf_plug_plug ( &downloader->job, job ); ref_put ( &downloader->refcnt ); va_end ( args ); return 0; -- cgit v1.2.3-55-g7522