diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/downloader.c | 1 | ||||
-rw-r--r-- | src/core/hw.c | 3 | ||||
-rw-r--r-- | src/core/posix_io.c | 1 | ||||
-rw-r--r-- | src/core/resolv.c | 17 | ||||
-rw-r--r-- | src/core/xfer.c | 43 |
5 files changed, 49 insertions, 16 deletions
diff --git a/src/core/downloader.c b/src/core/downloader.c index 4a74589f..3726c6e1 100644 --- a/src/core/downloader.c +++ b/src/core/downloader.c @@ -228,6 +228,7 @@ static struct xfer_interface_operations downloader_xfer_operations = { .close = downloader_xfer_close, .vredirect = xfer_vopen, .seek = downloader_xfer_seek, + .window = unlimited_xfer_window, .deliver_iob = xfer_deliver_as_raw, .deliver_raw = downloader_xfer_deliver_raw, }; diff --git a/src/core/hw.c b/src/core/hw.c index 2cb912b1..3502dbfb 100644 --- a/src/core/hw.c +++ b/src/core/hw.c @@ -37,6 +37,7 @@ static struct xfer_interface_operations hw_xfer_operations = { .close = hw_xfer_close, .vredirect = ignore_xfer_vredirect, .seek = ignore_xfer_seek, + .window = unlimited_xfer_window, .deliver_iob = xfer_deliver_as_raw, .deliver_raw = ignore_xfer_deliver_raw, }; @@ -45,7 +46,7 @@ static void hw_step ( struct process *process ) { struct hw *hw = container_of ( process, struct hw, process ); int rc; - if ( xfer_ready ( &hw->xfer ) == 0 ) { + if ( xfer_window ( &hw->xfer ) ) { rc = xfer_deliver_raw ( &hw->xfer, hw_msg, sizeof ( hw_msg ) ); hw_finished ( hw, rc ); } diff --git a/src/core/posix_io.c b/src/core/posix_io.c index 03d440a6..21f818bf 100644 --- a/src/core/posix_io.c +++ b/src/core/posix_io.c @@ -160,6 +160,7 @@ static struct xfer_interface_operations posix_file_xfer_operations = { .close = posix_file_xfer_close, .vredirect = xfer_vopen, .seek = posix_file_xfer_seek, + .window = unlimited_xfer_window, .alloc_iob = default_xfer_alloc_iob, .deliver_iob = posix_file_xfer_deliver_iob, .deliver_raw = xfer_deliver_as_iob, diff --git a/src/core/resolv.c b/src/core/resolv.c index 7ca62cd8..5c25ddb1 100644 --- a/src/core/resolv.c +++ b/src/core/resolv.c @@ -308,25 +308,12 @@ struct named_socket { int have_local; }; -/** - * Handle seek() event - * - * @v xfer Data transfer interface - * @v offset Offset to new position - * @v whence Basis for new position - * @ret rc Return status code - */ -static int resolv_xfer_seek ( struct xfer_interface *xfer __unused, - off_t offset __unused, int whence __unused ) { - /* Never ready to accept data */ - return -EAGAIN; -} - /** Named socket opener data transfer interface operations */ static struct xfer_interface_operations named_xfer_ops = { .close = ignore_xfer_close, .vredirect = ignore_xfer_vredirect, - .seek = resolv_xfer_seek, + .seek = ignore_xfer_seek, + .window = no_xfer_window, .alloc_iob = default_xfer_alloc_iob, .deliver_iob = xfer_deliver_as_raw, .deliver_raw = ignore_xfer_deliver_raw, diff --git a/src/core/xfer.c b/src/core/xfer.c index 3e55ebaf..3e6b7eb6 100644 --- a/src/core/xfer.c +++ b/src/core/xfer.c @@ -111,6 +111,22 @@ int xfer_seek ( struct xfer_interface *xfer, off_t offset, int whence ) { } /** + * Check flow control window + * + * @v xfer Data transfer interface + * @ret len Length of window + */ +size_t xfer_window ( struct xfer_interface *xfer ) { + struct xfer_interface *dest = xfer_get_dest ( xfer ); + size_t len; + + len = dest->op->window ( dest ); + + xfer_put ( dest ); + return len; +} + +/** * Test to see if interface is ready to accept data * * @v xfer Data transfer interface @@ -298,6 +314,32 @@ int ignore_xfer_seek ( struct xfer_interface *xfer __unused, } /** + * Unlimited flow control window + * + * @v xfer Data transfer interface + * @ret len Length of window + * + * This handler indicates that the interface is always ready to accept + * data. + */ +size_t unlimited_xfer_window ( struct xfer_interface *xfer __unused ) { + return ~( ( size_t ) 0 ); +} + +/** + * No flow control window + * + * @v xfer Data transfer interface + * @ret len Length of window + * + * This handler indicates that the interface is never ready to accept + * data. + */ +size_t no_xfer_window ( struct xfer_interface *xfer __unused ) { + return 0; +} + +/** * Allocate I/O buffer * * @v xfer Data transfer interface @@ -374,6 +416,7 @@ struct xfer_interface_operations null_xfer_ops = { .close = ignore_xfer_close, .vredirect = ignore_xfer_vredirect, .seek = ignore_xfer_seek, + .window = unlimited_xfer_window, .alloc_iob = default_xfer_alloc_iob, .deliver_iob = xfer_deliver_as_raw, .deliver_raw = ignore_xfer_deliver_raw, |