diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/llist.c | 20 | ||||
-rw-r--r-- | src/llist.h | 1 | ||||
-rw-r--r-- | src/llist_ts.h | 1 |
3 files changed, 16 insertions, 6 deletions
diff --git a/src/llist.c b/src/llist.c index eeded6b..7611595 100644 --- a/src/llist.c +++ b/src/llist.c @@ -43,6 +43,7 @@ void llist_init (llist_t *l) { l->head = NULL; + l->tail = NULL; } /* @@ -60,6 +61,7 @@ llist_free (llist_t *l) } l->head = NULL; + l->tail = NULL; } /* @@ -128,7 +130,6 @@ void llist_add (llist_t *l, void *data) { llist_item_t *o = mem_malloc (sizeof (llist_item_t)); - llist_item_t *i; if (o) { @@ -136,12 +137,11 @@ llist_add (llist_t *l, void *data) o->next = NULL; if (!l->head) - l->head = o; + l->head = l->tail = o; else { - for (i = l->head; i->next; i = i->next) - ; - i->next = o; + l->tail->next = o; + l->tail = o; } } } @@ -161,7 +161,12 @@ llist_add_sorted (llist_t *l, void *data, llist_fn_cmp_t fn_cmp) o->next = NULL; if (!l->head) - l->head = o; + l->head = l->tail = o; + else if (fn_cmp(o->data, l->tail->data) >= 0) + { + l->tail->next = o; + l->tail = o; + } else if (fn_cmp(o->data, l->head->data) < 0) { o->next = l->head; @@ -198,6 +203,9 @@ llist_remove (llist_t *l, llist_item_t *i) { if (j) j->next = i->next; + if (i == l->tail) + l->tail = j; + mem_free (i); } } diff --git a/src/llist.h b/src/llist.h index d7e4249..cdab18d 100644 --- a/src/llist.h +++ b/src/llist.h @@ -44,6 +44,7 @@ struct llist_item { typedef struct llist llist_t; struct llist { struct llist_item *head; + struct llist_item *tail; }; typedef int (*llist_fn_cmp_t) (void *, void *); diff --git a/src/llist_ts.h b/src/llist_ts.h index 0f90024..e7a6b3c 100644 --- a/src/llist_ts.h +++ b/src/llist_ts.h @@ -38,6 +38,7 @@ typedef struct llist_ts llist_ts_t; struct llist_ts { llist_item_t *head; + llist_item_t *tail; pthread_mutex_t mutex; }; |