#ifndef _IPXE_POOL_H #define _IPXE_POOL_H /** @file * * Pooled connections * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include /** 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 */