etc/dlist: add simple userspace doubly-linked list abstraction
authorshefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 23 Apr 2009 19:06:12 +0000 (19:06 +0000)
committershefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 23 Apr 2009 19:06:12 +0000 (19:06 +0000)
Add a very simple implementation for managing a doubly-linked list.
This implementation uses only a 'list entry' structure for both the
list and items on the list, versus separate structures like complib.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2121 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

etc/user/dlist.c [new file with mode: 0644]
inc/user/dlist.h [new file with mode: 0644]

diff --git a/etc/user/dlist.c b/etc/user/dlist.c
new file mode 100644 (file)
index 0000000..5cf9479
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) 2009 Intel Corporation. All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ */\r
+\r
+#include <dlist.h>\r
+\r
+void DListInsertAfter(DLIST_ENTRY *pNew, DLIST_ENTRY *pHead)\r
+{\r
+       pNew->Next = pHead->Next;\r
+       pNew->Prev = pHead;\r
+       pHead->Next->Prev = pNew;\r
+       pHead->Next = pNew;\r
+}\r
+\r
+void DListRemove(DLIST_ENTRY *pEntry)\r
+{\r
+       pEntry->Prev->Next = pEntry->Next;\r
+       pEntry->Next->Prev = pEntry->Prev;\r
+}\r
diff --git a/inc/user/dlist.h b/inc/user/dlist.h
new file mode 100644 (file)
index 0000000..f1cd798
--- /dev/null
@@ -0,0 +1,71 @@
+/*\r
+ * Copyright (c) 2009 Intel Corporation. All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ */\r
+\r
+#ifndef _DLIST_H_\r
+#define _DLIST_H_\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+typedef struct _DLIST_ENTRY\r
+{\r
+       struct _DLIST_ENTRY     *Next;\r
+       struct _DLIST_ENTRY     *Prev;\r
+\r
+}      DLIST_ENTRY;\r
+\r
+static void DListInit(DLIST_ENTRY *pHead)\r
+{\r
+       pHead->Next = pHead;\r
+       pHead->Prev = pHead;\r
+}\r
+\r
+static int DListEmpty(DLIST_ENTRY *pHead)\r
+{\r
+       return pHead->Next == pHead;\r
+}\r
+\r
+void DListInsertAfter(DLIST_ENTRY *pNew, DLIST_ENTRY *pHead);\r
+\r
+static void DListInsertBefore(DLIST_ENTRY *pNew, DLIST_ENTRY *pHead)\r
+{\r
+       DListInsertAfter(pNew, pHead->Prev);\r
+}\r
+\r
+#define DListInsertHead DListInsertAfter\r
+#define DListInsertTail DListInsertBefore\r
+\r
+void DListRemove(DLIST_ENTRY *pEntry);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif // _DLIST_H_
\ No newline at end of file