diff options
author | Michael Brown <mcb30@ipxe.org> | 2013-11-01 15:05:16 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2013-11-01 16:17:28 +0000 |
commit | 5674a3c087bf1bde65b61b6b0ca26035dd47baa3 (patch) | |
tree | e30dd88a260b22c9bf3919432e645544d1867294 | |
parent | a3346e35877db114d467c55fc14856334d2278ab (diff) | |
download | ipxe-5674a3c087bf1bde65b61b6b0ca26035dd47baa3.tar.gz |
[job] Allow job_progress() to return an ongoing job status code, if known
Some background jobs have a meaningful ongoing status code (e.g. the
current link status for a job waiting for a network link to come up).
Allow this to be exposed via the job_progress() method.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/core/downloader.c | 7 | ||||
-rw-r--r-- | src/core/job.c | 16 | ||||
-rw-r--r-- | src/include/ipxe/job.h | 6 |
3 files changed, 20 insertions, 9 deletions
diff --git a/src/core/downloader.c b/src/core/downloader.c index 4f3fc2c81..3927dfabf 100644 --- a/src/core/downloader.c +++ b/src/core/downloader.c @@ -131,9 +131,10 @@ static int downloader_ensure_size ( struct downloader *downloader, * * @v downloader Downloader * @v progress Progress report to fill in + * @ret ongoing_rc Ongoing job status code (if known) */ -static void downloader_progress ( struct downloader *downloader, - struct job_progress *progress ) { +static int 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 @@ -141,6 +142,8 @@ static void downloader_progress ( struct downloader *downloader, */ progress->completed = downloader->pos; progress->total = downloader->image->len; + + return 0; } /**************************************************************************** diff --git a/src/core/job.c b/src/core/job.c index 64d184ec3..674bec8b5 100644 --- a/src/core/job.c +++ b/src/core/job.c @@ -34,22 +34,30 @@ FILE_LICENCE ( GPL2_OR_LATER ); * * @v intf Object interface * @v progress Progress data to fill in + * @ret ongoing_rc Ongoing job status code (if known) */ -void job_progress ( struct interface *intf, struct job_progress *progress ) { +int job_progress ( struct interface *intf, struct job_progress *progress ) { struct interface *dest; job_progress_TYPE ( void * ) *op = intf_get_dest_op ( intf, job_progress, &dest ); void *object = intf_object ( dest ); + int ongoing_rc; DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT " job_progress\n", INTF_INTF_DBG ( intf, dest ) ); + /* Initialise progress to zero */ + memset ( progress, 0, sizeof ( *progress ) ); + if ( op ) { - op ( object, progress ); + ongoing_rc = op ( object, progress ); } else { - /* Default is to mark progress as zero */ - memset ( progress, 0, sizeof ( *progress ) ); + /* Default is to leave progress as zero and have no + * known return status code. + */ + ongoing_rc = 0; } intf_put ( dest ); + return ongoing_rc; } diff --git a/src/include/ipxe/job.h b/src/include/ipxe/job.h index c2232fc17..a2369f7c2 100644 --- a/src/include/ipxe/job.h +++ b/src/include/ipxe/job.h @@ -30,9 +30,9 @@ struct job_progress { unsigned long total; }; -extern void job_progress ( struct interface *intf, - struct job_progress *progress ); +extern int job_progress ( struct interface *intf, + struct job_progress *progress ); #define job_progress_TYPE( object_type ) \ - typeof ( void ( object_type, struct job_progress *progress ) ) + typeof ( int ( object_type, struct job_progress *progress ) ) #endif /* _IPXE_JOB_H */ |