diff options
author | Daniel Hellstrom <daniel@gaisler.com> | 2011-11-28 09:52:03 +0100 |
---|---|---|
committer | Daniel Hellstrom <daniel@gaisler.com> | 2015-04-17 01:10:16 +0200 |
commit | e7fade3ac4559214ab0508dc54a71a3d1f522afb (patch) | |
tree | 13e32728a3b6adccd3f435db73091a8233d5dadf /cpukit/libdrvmgr/drvmgr_list.c | |
parent | LIBPCI: added PCI shell command (diff) | |
download | rtems-e7fade3ac4559214ab0508dc54a71a3d1f522afb.tar.bz2 |
DRVMGR: added driver manager to cpukit/libdrvmgr
Diffstat (limited to 'cpukit/libdrvmgr/drvmgr_list.c')
-rw-r--r-- | cpukit/libdrvmgr/drvmgr_list.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/cpukit/libdrvmgr/drvmgr_list.c b/cpukit/libdrvmgr/drvmgr_list.c new file mode 100644 index 0000000000..dc1665f645 --- /dev/null +++ b/cpukit/libdrvmgr/drvmgr_list.c @@ -0,0 +1,67 @@ +/* Driver Manager List Interface Implementation. + * + * COPYRIGHT (c) 2009. + * Cobham Gaisler AB. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#include <stdlib.h> +#include <drvmgr/drvmgr_list.h> + +/* LIST interface */ + +void drvmgr_list_init(struct drvmgr_list *list, int offset) +{ + list->head = list->tail = NULL; + list->ofs = offset; +} + +void drvmgr_list_empty(struct drvmgr_list *list) +{ + list->head = list->tail = NULL; +} + +void drvmgr_list_add_head(struct drvmgr_list *list, void *entry) +{ + LIST_FIELD(list, entry) = list->head; + if (list->head == NULL) + list->tail = entry; + list->head = entry; +} + +void drvmgr_list_add_tail(struct drvmgr_list *list, void *entry) +{ + if (list->tail == NULL) + list->head = entry; + else + LIST_FIELD(list, list->tail) = entry; + LIST_FIELD(list, entry) = NULL; + list->tail = entry; +} + +void drvmgr_list_remove_head(struct drvmgr_list *list) +{ + list->head = LIST_FIELD(list, list->head); + if (list->head == NULL) + list->tail = NULL; +} + +void drvmgr_list_remove(struct drvmgr_list *list, void *entry) +{ + void **prevptr = &list->head; + void *curr, *prev; + + prev = NULL; + curr = list->head; + while (curr != entry) { + prev = curr; + prevptr = &LIST_FIELD(list, curr); + curr = LIST_FIELD(list, curr); + } + *prevptr = LIST_FIELD(list, entry); + if (list->tail == entry) + list->tail = prev; +} |