These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / ipxe / src / include / ipxe / pool.h
diff --git a/qemu/roms/ipxe/src/include/ipxe/pool.h b/qemu/roms/ipxe/src/include/ipxe/pool.h
new file mode 100644 (file)
index 0000000..27066e9
--- /dev/null
@@ -0,0 +1,127 @@
+#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 */