From b1755462ab344ff758c3a1e6ae0d10a729d96d1b Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 15 May 2007 16:53:46 +0000 Subject: Do not hold self-references. This then avoids the problem of having to ensure that we only drop our self-reference exactly once. To maintain the guarantee that an object won't go out of scope unexpectedly while one of its event handlers is being called, the event-calling functions now automatically obtain and drop extra references. --- src/core/xfer.c | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) (limited to 'src/core/xfer.c') diff --git a/src/core/xfer.c b/src/core/xfer.c index bfbf1ceda..f2783f5bd 100644 --- a/src/core/xfer.c +++ b/src/core/xfer.c @@ -33,10 +33,11 @@ * @v rc Reason for close */ void xfer_close ( struct xfer_interface *xfer, int rc ) { - struct xfer_interface *dest = xfer_dest ( xfer ); + struct xfer_interface *dest = xfer_get_dest ( xfer ); dest->op->close ( dest, rc ); xfer_unplug ( xfer ); + xfer_put ( dest ); } /** @@ -48,9 +49,12 @@ void xfer_close ( struct xfer_interface *xfer, int rc ) { * @ret rc Return status code */ int xfer_vredirect ( struct xfer_interface *xfer, int type, va_list args ) { - struct xfer_interface *dest = xfer_dest ( xfer ); + struct xfer_interface *dest = xfer_get_dest ( xfer ); + int rc; - return dest->op->vredirect ( dest, type, args ); + rc = dest->op->vredirect ( dest, type, args ); + xfer_put ( dest ); + return rc; } /** @@ -82,9 +86,12 @@ int xfer_redirect ( struct xfer_interface *xfer, int type, ... ) { */ int xfer_request ( struct xfer_interface *xfer, off_t offset, int whence, size_t len ) { - struct xfer_interface *dest = xfer_dest ( xfer ); + struct xfer_interface *dest = xfer_get_dest ( xfer ); + int rc; - return dest->op->request ( dest, offset, whence, len ); + rc = dest->op->request ( dest, offset, whence, len ); + xfer_put ( dest ); + return rc; } /** @@ -106,9 +113,12 @@ int xfer_request_all ( struct xfer_interface *xfer ) { * @ret rc Return status code */ int xfer_seek ( struct xfer_interface *xfer, off_t offset, int whence ) { - struct xfer_interface *dest = xfer_dest ( xfer ); + struct xfer_interface *dest = xfer_get_dest ( xfer ); + int rc; - return dest->op->seek ( dest, offset, whence ); + rc = dest->op->seek ( dest, offset, whence ); + xfer_put ( dest ); + return rc; } /** @@ -119,9 +129,12 @@ int xfer_seek ( struct xfer_interface *xfer, off_t offset, int whence ) { * @ret iobuf I/O buffer */ struct io_buffer * xfer_alloc_iob ( struct xfer_interface *xfer, size_t len ) { - struct xfer_interface *dest = xfer_dest ( xfer ); + struct xfer_interface *dest = xfer_get_dest ( xfer ); + struct io_buffer *iobuf; - return dest->op->alloc_iob ( dest, len ); + iobuf = dest->op->alloc_iob ( dest, len ); + xfer_put ( dest ); + return iobuf; } /** @@ -132,9 +145,12 @@ struct io_buffer * xfer_alloc_iob ( struct xfer_interface *xfer, size_t len ) { * @ret rc Return status code */ int xfer_deliver_iob ( struct xfer_interface *xfer, struct io_buffer *iobuf ) { - struct xfer_interface *dest = xfer_dest ( xfer ); + struct xfer_interface *dest = xfer_get_dest ( xfer ); + int rc; - return dest->op->deliver_iob ( dest, iobuf ); + rc = dest->op->deliver_iob ( dest, iobuf ); + xfer_put ( dest ); + return rc; } /** @@ -146,9 +162,12 @@ int xfer_deliver_iob ( struct xfer_interface *xfer, struct io_buffer *iobuf ) { */ int xfer_deliver_raw ( struct xfer_interface *xfer, const void *data, size_t len ) { - struct xfer_interface *dest = xfer_dest ( xfer ); + struct xfer_interface *dest = xfer_get_dest ( xfer ); + int rc; - return dest->op->deliver_raw ( dest, data, len ); + rc = dest->op->deliver_raw ( dest, data, len ); + xfer_put ( dest ); + return rc; } /**************************************************************************** -- cgit v1.2.3-55-g7522