b1755462ab
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.
57 lines
1.2 KiB
C
57 lines
1.2 KiB
C
#ifndef _GPXE_INTERFACE_H
|
|
#define _GPXE_INTERFACE_H
|
|
|
|
/** @file
|
|
*
|
|
* Object communication interfaces
|
|
*
|
|
*/
|
|
|
|
#include <gpxe/refcnt.h>
|
|
|
|
/** An object communication interface */
|
|
struct interface {
|
|
/** Destination interface
|
|
*
|
|
* When messages are sent via this interface, they will be
|
|
* delivered to the destination interface.
|
|
*
|
|
* This pointer may never be NULL. When the interface is
|
|
* unplugged, it should point to a null interface.
|
|
*/
|
|
struct interface *dest;
|
|
/** Reference counter
|
|
*
|
|
* If this interface is not part of a reference-counted
|
|
* object, this field may be NULL.
|
|
*/
|
|
struct refcnt *refcnt;
|
|
};
|
|
|
|
/**
|
|
* Increment reference count on an interface
|
|
*
|
|
* @v intf Interface
|
|
* @ret intf Interface
|
|
*/
|
|
static inline __attribute__ (( always_inline )) struct interface *
|
|
intf_get ( struct interface *intf ) {
|
|
ref_get ( intf->refcnt );
|
|
return intf;
|
|
}
|
|
|
|
/**
|
|
* Decrement reference count on an interface
|
|
*
|
|
* @v intf Interface
|
|
*/
|
|
static inline __attribute__ (( always_inline )) void
|
|
intf_put ( struct interface *intf ) {
|
|
ref_put ( intf->refcnt );
|
|
}
|
|
|
|
extern void plug ( struct interface *intf, struct interface *dest );
|
|
extern void plug_plug ( struct interface *a, struct interface *b );
|
|
|
|
#endif /* _GPXE_INTERFACE_H */
|