From e71b83b22b3ce8ddb6b5ba91948c5a1b937ef0fb Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 12 Jun 2008 19:43:25 +0100 Subject: [interface] Expand object interface to allow for polymorphic interfaces We have several types of object interface at present (data-xfer, job control, name resolution), and there is some duplication of functionality between them. For example, job_done(), job_kill() and xfer_close() are almost isomorphic to each other. This updated version of the object interface mechanism allows for each interface to export an arbitrary list of supported operations. Advantages include: Operations methods now receive a pointer to the object, rather than a pointer to the interface. This allows an object to, for example, implement a single close() method that can handle close() operations from any of its exposed interfaces. The close() operation is implemented as a generic operation (rather than having specific variants for data-xfer, job control, etc.). This will allow functions such as monojob_wait() to be used to wait for e.g. a name resolution to complete. The amount of boilerplate code required in objects is reduced, not least because it is no longer necessary to include per-interface methods that simply use container_of() to derive a pointer to the object and then tail-call to a common per-object method. The cost of adding new operations is reduced; adding a new data-xfer operation such as stat() no longer incurs the penalty of adding a .stat member to the operations table of all existing data-xfer interfaces. The data-xfer, job control and name resolution interfaces have not yet been updated to use the new interface mechanism, but the code will still compile and run. Signed-off-by: Michael Brown --- src/include/ipxe/resolv.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/include/ipxe/resolv.h') diff --git a/src/include/ipxe/resolv.h b/src/include/ipxe/resolv.h index c7d61998a..767614bd2 100644 --- a/src/include/ipxe/resolv.h +++ b/src/include/ipxe/resolv.h @@ -94,7 +94,7 @@ resolv_put ( struct resolv_interface *resolv ) { */ static inline __attribute__ (( always_inline )) void resolv_plug ( struct resolv_interface *resolv, struct resolv_interface *dest ) { - plug ( &resolv->intf, &dest->intf ); + intf_plug ( &resolv->intf, &dest->intf ); } /** @@ -105,7 +105,7 @@ resolv_plug ( struct resolv_interface *resolv, struct resolv_interface *dest ) { */ static inline __attribute__ (( always_inline )) void resolv_plug_plug ( struct resolv_interface *a, struct resolv_interface *b ) { - plug_plug ( &a->intf, &b->intf ); + intf_plug_plug ( &a->intf, &b->intf ); } /** @@ -115,7 +115,7 @@ resolv_plug_plug ( struct resolv_interface *a, struct resolv_interface *b ) { */ static inline __attribute__ (( always_inline )) void resolv_unplug ( struct resolv_interface *resolv ) { - plug ( &resolv->intf, &null_resolv.intf ); + intf_plug ( &resolv->intf, &null_resolv.intf ); } /** -- cgit v1.2.3-55-g7522