Do not hold self-references. This then avoids the problem of having to
[people/dverkamp/gpxe.git] / src / include / gpxe / interface.h
1 #ifndef _GPXE_INTERFACE_H
2 #define _GPXE_INTERFACE_H
3
4 /** @file
5  *
6  * Object communication interfaces
7  *
8  */
9
10 #include <gpxe/refcnt.h>
11
12 /** An object communication interface */
13 struct interface {
14         /** Destination interface
15          *
16          * When messages are sent via this interface, they will be
17          * delivered to the destination interface.
18          *
19          * This pointer may never be NULL.  When the interface is
20          * unplugged, it should point to a null interface.
21          */
22         struct interface *dest;
23         /** Reference counter
24          *
25          * If this interface is not part of a reference-counted
26          * object, this field may be NULL.
27          */
28         struct refcnt *refcnt;
29 };
30
31 /**
32  * Increment reference count on an interface
33  *
34  * @v intf              Interface
35  * @ret intf            Interface
36  */
37 static inline __attribute__ (( always_inline )) struct interface *
38 intf_get ( struct interface *intf ) {
39         ref_get ( intf->refcnt );
40         return intf;
41 }
42
43 /**
44  * Decrement reference count on an interface
45  *
46  * @v intf              Interface
47  */
48 static inline __attribute__ (( always_inline )) void
49 intf_put ( struct interface *intf ) {
50         ref_put ( intf->refcnt );
51 }
52
53 extern void plug ( struct interface *intf, struct interface *dest );
54 extern void plug_plug ( struct interface *a, struct interface *b );
55
56 #endif /* _GPXE_INTERFACE_H */