Do not hold self-references. This then avoids the problem of having to
[people/dverkamp/gpxe.git] / src / core / hw.c
index 80cac99..460ec58 100644 (file)
@@ -22,7 +22,6 @@ static const char hw_msg[] = "Hello world!\n";
 static void hw_finished ( struct hw *hw, int rc ) {
        xfer_nullify ( &hw->xfer );
        xfer_close ( &hw->xfer, rc );
-       ref_put ( &hw->refcnt );
 }
 
 static void hw_xfer_close ( struct xfer_interface *xfer, int rc ) {
@@ -31,13 +30,14 @@ static void hw_xfer_close ( struct xfer_interface *xfer, int rc ) {
        hw_finished ( hw, rc );
 }
 
-static int hw_xfer_request ( struct xfer_interface *xfer, off_t start __unused,
-                            int whence __unused, size_t len __unused ) {
+static void hw_xfer_request ( struct xfer_interface *xfer,
+                             off_t start __unused, int whence __unused,
+                             size_t len __unused ) {
        struct hw *hw = container_of ( xfer, struct hw, xfer );
+       int rc;
 
-       xfer_deliver_raw ( xfer, hw_msg, sizeof ( hw_msg ) );
-       hw_finished ( hw, 0 );
-       return 0;
+       rc = xfer_deliver_raw ( xfer, hw_msg, sizeof ( hw_msg ) );
+       hw_finished ( hw, rc );
 }
 
 static struct xfer_interface_operations hw_xfer_operations = {
@@ -52,13 +52,16 @@ static struct xfer_interface_operations hw_xfer_operations = {
 static int hw_open ( struct xfer_interface *xfer, struct uri *uri __unused ) {
        struct hw *hw;
 
+       /* Allocate and initialise structure */
        hw = malloc ( sizeof ( *hw ) );
        if ( ! hw )
                return -ENOMEM;
        memset ( hw, 0, sizeof ( *hw ) );
        xfer_init ( &hw->xfer, &hw_xfer_operations, &hw->refcnt );
 
+       /* Attach parent interface, mortalise self, and return */
        xfer_plug_plug ( &hw->xfer, xfer );
+       ref_put ( &hw->refcnt );
        return 0;
 }