mirror of https://github.com/ipxe/ipxe.git
[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>pull/17/head
parent
a3346e3587
commit
5674a3c087
|
@ -131,9 +131,10 @@ static int downloader_ensure_size ( struct downloader *downloader,
|
||||||
*
|
*
|
||||||
* @v downloader Downloader
|
* @v downloader Downloader
|
||||||
* @v progress Progress report to fill in
|
* @v progress Progress report to fill in
|
||||||
|
* @ret ongoing_rc Ongoing job status code (if known)
|
||||||
*/
|
*/
|
||||||
static void downloader_progress ( struct downloader *downloader,
|
static int downloader_progress ( struct downloader *downloader,
|
||||||
struct job_progress *progress ) {
|
struct job_progress *progress ) {
|
||||||
|
|
||||||
/* This is not entirely accurate, since downloaded data may
|
/* This is not entirely accurate, since downloaded data may
|
||||||
* arrive out of order (e.g. with multicast protocols), but
|
* 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->completed = downloader->pos;
|
||||||
progress->total = downloader->image->len;
|
progress->total = downloader->image->len;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|
|
@ -34,22 +34,30 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
*
|
*
|
||||||
* @v intf Object interface
|
* @v intf Object interface
|
||||||
* @v progress Progress data to fill in
|
* @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;
|
struct interface *dest;
|
||||||
job_progress_TYPE ( void * ) *op =
|
job_progress_TYPE ( void * ) *op =
|
||||||
intf_get_dest_op ( intf, job_progress, &dest );
|
intf_get_dest_op ( intf, job_progress, &dest );
|
||||||
void *object = intf_object ( dest );
|
void *object = intf_object ( dest );
|
||||||
|
int ongoing_rc;
|
||||||
|
|
||||||
DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT " job_progress\n",
|
DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT " job_progress\n",
|
||||||
INTF_INTF_DBG ( intf, dest ) );
|
INTF_INTF_DBG ( intf, dest ) );
|
||||||
|
|
||||||
|
/* Initialise progress to zero */
|
||||||
|
memset ( progress, 0, sizeof ( *progress ) );
|
||||||
|
|
||||||
if ( op ) {
|
if ( op ) {
|
||||||
op ( object, progress );
|
ongoing_rc = op ( object, progress );
|
||||||
} else {
|
} else {
|
||||||
/* Default is to mark progress as zero */
|
/* Default is to leave progress as zero and have no
|
||||||
memset ( progress, 0, sizeof ( *progress ) );
|
* known return status code.
|
||||||
|
*/
|
||||||
|
ongoing_rc = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
intf_put ( dest );
|
intf_put ( dest );
|
||||||
|
return ongoing_rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,9 +30,9 @@ struct job_progress {
|
||||||
unsigned long total;
|
unsigned long total;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void job_progress ( struct interface *intf,
|
extern int job_progress ( struct interface *intf,
|
||||||
struct job_progress *progress );
|
struct job_progress *progress );
|
||||||
#define job_progress_TYPE( object_type ) \
|
#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 */
|
#endif /* _IPXE_JOB_H */
|
||||||
|
|
Loading…
Reference in New Issue