* blocked during shutdown.
*/
void intf_restart ( struct interface *intf, int rc ) {
- struct interface_descriptor *desc = intf->desc;
/* Shut down the interface */
intf_shutdown ( intf, rc );
* infinite loop as the intf_close() operations on each side
* of the link call each other recursively.
*/
- intf->desc = desc;
+ intf_reinit ( intf );
}
/**
struct refcnt *refcnt;
/** Interface descriptor */
struct interface_descriptor *desc;
+ /** Original interface descriptor
+ *
+ * Used by intf_reinit().
+ */
+ struct interface_descriptor *original;
};
extern void intf_plug ( struct interface *intf, struct interface *dest );
intf->dest = &null_intf;
intf->refcnt = refcnt;
intf->desc = desc;
+ intf->original = desc;
}
/**
.dest = &null_intf, \
.refcnt = NULL, \
.desc = &(descriptor), \
+ .original = &(descriptor), \
}
/**
*/
#define INTF_INTF_DBG( intf, dest ) INTF_DBG ( intf ), INTF_DBG ( dest )
+/**
+ * Reinitialise an object interface
+ *
+ * @v intf Object interface
+ */
+static inline void intf_reinit ( struct interface *intf ) {
+
+ /* Restore original interface descriptor */
+ intf->desc = intf->original;
+}
+
#endif /* _IPXE_INTERFACE_H */
/* Restart content decoding interfaces (which may be attached
* to the same object).
*/
- intf_nullify ( &http->content );
- intf_nullify ( &http->transfer );
+ intf_nullify ( &http->transfer ); /* avoid potential loops */
intf_restart ( &http->content, http->response.rc );
intf_restart ( &http->transfer, http->response.rc );
- http->content.desc = &http_content_desc;
- http->transfer.desc = &http_transfer_desc;
intf_plug_plug ( &http->transfer, &http->content );
http->len = 0;
assert ( http->remaining == 0 );