| #ifndef __XREF_H__ |
| #define __XREF_H__ |
| |
| /* xref is used to create relation between two elements. |
| * Once an element is released, it breaks the relation. If the |
| * relation is already broken, it frees the xref struct. |
| * The pointer between two elements is sort of a refcount with |
| * max value 1. The relation is only between two elements. |
| * The pointer and the type of elements a and b are conventional. |
| */ |
| |
| struct xref { |
| struct xref *peer; |
| }; |
| |
| static inline void xref_create(struct xref *xref_a, struct xref *xref_b) |
| { |
| xref_a->peer = xref_b; |
| xref_b->peer = xref_a; |
| } |
| |
| static inline struct xref *xref_get_peer(struct xref *xref) |
| { |
| if (!xref->peer) |
| return NULL; |
| return xref->peer; |
| } |
| |
| static inline void xref_disconnect(struct xref *xref) |
| { |
| if (!xref->peer) |
| return; |
| |
| xref->peer->peer = NULL; |
| xref->peer = NULL; |
| } |
| |
| #endif /* __XREF_H__ */ |