123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #ifndef _IPXE_POOL_H
- #define _IPXE_POOL_H
-
- /** @file
- *
- * Pooled connections
- *
- */
-
- FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
-
- #include <ipxe/interface.h>
- #include <ipxe/list.h>
- #include <ipxe/retry.h>
-
- /** A pooled connection */
- struct pooled_connection {
- /** List of pooled connections
- *
- * Note that each connecton in the pool has a running expiry
- * timer which holds a reference to the connection. We
- * therefore do not require the connection pool list to hold a
- * reference for each pooled connection.
- */
- struct list_head list;
- /** Expiry timer */
- struct retry_timer timer;
- /** Close expired pooled connection
- *
- * @v pool Pooled connection
- */
- void ( * expired ) ( struct pooled_connection *pool );
- /** Flags */
- unsigned int flags;
- };
-
- /** Pooled connection flags */
- enum pooled_connection_flags {
- /** Connection should be recycled after closing */
- POOL_RECYCLABLE = 0x0001,
- /** Connection has been recycled */
- POOL_RECYCLED = 0x0002,
- /** Connection is known to be alive */
- POOL_ALIVE = 0x0004,
- };
-
- extern void pool_add ( struct pooled_connection *pool, struct list_head *list,
- unsigned long expiry );
- extern void pool_del ( struct pooled_connection *pool );
- extern void pool_expired ( struct retry_timer *timer, int over );
-
- /**
- * Initialise a pooled connection
- *
- * @v pool Pooled connection
- * @v expired Close expired pooled connection method
- * @v refcnt Containing object reference counter
- */
- static inline __attribute__ (( always_inline )) void
- pool_init ( struct pooled_connection *pool,
- void ( * expired ) ( struct pooled_connection *pool ),
- struct refcnt *refcnt ) {
-
- INIT_LIST_HEAD ( &pool->list );
- timer_init ( &pool->timer, pool_expired, refcnt );
- pool->expired = expired;
- }
-
- /**
- * Mark pooled connection as recyclable
- *
- * @v pool Pooled connection
- */
- static inline __attribute__ (( always_inline )) void
- pool_recyclable ( struct pooled_connection *pool ) {
-
- pool->flags |= POOL_RECYCLABLE;
- }
-
- /**
- * Mark pooled connection as alive
- *
- * @v pool Pooled connection
- */
- static inline __attribute__ (( always_inline )) void
- pool_alive ( struct pooled_connection *pool ) {
-
- pool->flags |= POOL_ALIVE;
- }
-
- /**
- * Check if pooled connection is recyclable
- *
- * @v pool Pooled connection
- * @ret recyclable Pooled connection is recyclable
- */
- static inline __attribute__ (( always_inline )) int
- pool_is_recyclable ( struct pooled_connection *pool ) {
-
- return ( pool->flags & POOL_RECYCLABLE );
- }
-
- /**
- * Check if pooled connection is reopenable
- *
- * @v pool Pooled connection
- * @ret reopenable Pooled connection is reopenable
- */
- static inline __attribute__ (( always_inline )) int
- pool_is_reopenable ( struct pooled_connection *pool ) {
-
- /* A connection is reopenable if it has been recycled but is
- * not yet known to be alive.
- */
- return ( ( pool->flags & POOL_RECYCLED ) &&
- ( ! ( pool->flags & POOL_ALIVE ) ) );
- }
-
- extern void pool_recycle ( struct interface *intf );
- #define pool_recycle_TYPE( object_type ) \
- typeof ( void ( object_type ) )
-
- extern void pool_reopen ( struct interface *intf );
- #define pool_reopen_TYPE( object_type ) \
- typeof ( void ( object_type ) )
-
- #endif /* _IPXE_POOL_H */
|