iPXE
pool.h
Go to the documentation of this file.
1 #ifndef _IPXE_POOL_H
2 #define _IPXE_POOL_H
3 
4 /** @file
5  *
6  * Pooled connections
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 
12 #include <ipxe/interface.h>
13 #include <ipxe/list.h>
14 #include <ipxe/retry.h>
15 
16 /** A pooled connection */
18  /** List of pooled connections
19  *
20  * Note that each connecton in the pool has a running expiry
21  * timer which holds a reference to the connection. We
22  * therefore do not require the connection pool list to hold a
23  * reference for each pooled connection.
24  */
25  struct list_head list;
26  /** Expiry timer */
28  /** Close expired pooled connection
29  *
30  * @v pool Pooled connection
31  */
32  void ( * expired ) ( struct pooled_connection *pool );
33  /** Flags */
34  unsigned int flags;
35 };
36 
37 /** Pooled connection flags */
39  /** Connection should be recycled after closing */
40  POOL_RECYCLABLE = 0x0001,
41  /** Connection has been recycled */
42  POOL_RECYCLED = 0x0002,
43  /** Connection is known to be alive */
44  POOL_ALIVE = 0x0004,
45 };
46 
47 extern void pool_add ( struct pooled_connection *pool, struct list_head *list,
48  unsigned long expiry );
49 extern void pool_del ( struct pooled_connection *pool );
50 extern void pool_expired ( struct retry_timer *timer, int over );
51 
52 /**
53  * Initialise a pooled connection
54  *
55  * @v pool Pooled connection
56  * @v expired Close expired pooled connection method
57  * @v refcnt Containing object reference counter
58  */
59 static inline __attribute__ (( always_inline )) void
60 pool_init ( struct pooled_connection *pool,
61  void ( * expired ) ( struct pooled_connection *pool ),
62  struct refcnt *refcnt ) {
63 
64  INIT_LIST_HEAD ( &pool->list );
65  timer_init ( &pool->timer, pool_expired, refcnt );
66  pool->expired = expired;
67 }
68 
69 /**
70  * Mark pooled connection as recyclable
71  *
72  * @v pool Pooled connection
73  */
74 static inline __attribute__ (( always_inline )) void
75 pool_recyclable ( struct pooled_connection *pool ) {
76 
77  pool->flags |= POOL_RECYCLABLE;
78 }
79 
80 /**
81  * Mark pooled connection as alive
82  *
83  * @v pool Pooled connection
84  */
85 static inline __attribute__ (( always_inline )) void
86 pool_alive ( struct pooled_connection *pool ) {
87 
88  pool->flags |= POOL_ALIVE;
89 }
90 
91 /**
92  * Check if pooled connection is recyclable
93  *
94  * @v pool Pooled connection
95  * @ret recyclable Pooled connection is recyclable
96  */
97 static inline __attribute__ (( always_inline )) int
98 pool_is_recyclable ( struct pooled_connection *pool ) {
99 
100  return ( pool->flags & POOL_RECYCLABLE );
101 }
102 
103 /**
104  * Check if pooled connection is reopenable
105  *
106  * @v pool Pooled connection
107  * @ret reopenable Pooled connection is reopenable
108  */
109 static inline __attribute__ (( always_inline )) int
110 pool_is_reopenable ( struct pooled_connection *pool ) {
111 
112  /* A connection is reopenable if it has been recycled but is
113  * not yet known to be alive.
114  */
115  return ( ( pool->flags & POOL_RECYCLED ) &&
116  ( ! ( pool->flags & POOL_ALIVE ) ) );
117 }
118 
119 extern void pool_recycle ( struct interface *intf );
120 #define pool_recycle_TYPE( object_type ) \
121  typeof ( void ( object_type ) )
122 
123 extern void pool_reopen ( struct interface *intf );
124 #define pool_reopen_TYPE( object_type ) \
125  typeof ( void ( object_type ) )
126 
127 #endif /* _IPXE_POOL_H */
static void(* expired)(struct pooled_connection *pool)
Definition: pool.h:61
timer_init & pool
Definition: pool.h:65
static __attribute__((always_inline)) void pool_init(struct pooled_connection *pool
Initialise a pooled connection.
Definition: pool.h:74
Retry timers.
void pool_reopen(struct interface *intf)
Reopen a defunct connection.
Definition: pool.c:51
void pool_recycle(struct interface *intf)
Recycle this connection after closing.
Definition: pool.c:41
A retry timer.
Definition: retry.h:21
unsigned int flags
Flags.
Definition: pool.h:34
A pooled connection.
Definition: pool.h:17
A doubly-linked list entry (or list head)
Definition: list.h:18
A reference counter.
Definition: refcnt.h:26
A timer.
Definition: timer.h:28
pooled_connection_flags
Pooled connection flags.
Definition: pool.h:38
Connection has been recycled.
Definition: pool.h:42
An object interface.
Definition: interface.h:124
void pool_add(struct pooled_connection *pool, struct list_head *list, unsigned long expiry)
Add connection to pool.
Definition: pool.c:63
Object interfaces.
void pool_expired(struct retry_timer *timer, int over)
Close expired pooled connection.
Definition: pool.c:101
struct list_head list
List of pooled connections.
Definition: pool.h:25
Connection should be recycled after closing.
Definition: pool.h:40
Linked lists.
Connection is known to be alive.
Definition: pool.h:44
void(* expired)(struct pooled_connection *pool)
Close expired pooled connection.
Definition: pool.h:32
void pool_del(struct pooled_connection *pool)
Remove connection from pool.
Definition: pool.c:82
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)