diff --git a/src/utils/ufd.c b/src/utils/ufd.c index 9cf1af3..ed9f0c6 100644 --- a/src/utils/ufd.c +++ b/src/utils/ufd.c @@ -5,10 +5,10 @@ void ufd__init(struct ufd_t* ufd, struct context_entry_t* thread) { + TAILQ_INIT(&ufd->children); ufd->thread = thread; ufd->repr = ufd, ufd->parent = NULL; - ufd->child = NULL; } @@ -21,6 +21,7 @@ void ufd__join(struct ufd_t* th1, struct ufd_t* th2) { a->parent = th2; a->repr = b; + TAILQ_INSERT_TAIL(&a->repr->children, a, link); } } @@ -38,9 +39,10 @@ struct ufd_t* ufd__find(struct ufd_t* th) void ufd__delete(struct ufd_t* th) { - if (th->child != NULL) - { - th->child->parent = th->child; - th->child->repr = th->child; + struct ufd_t* child; + + TAILQ_FOREACH(child, &th->children, link) { + child->parent = NULL; + child->repr = child; } } diff --git a/src/utils/ufd.h b/src/utils/ufd.h index b7b0522..9ba2d38 100644 --- a/src/utils/ufd.h +++ b/src/utils/ufd.h @@ -2,15 +2,20 @@ #define _UNION_FIND_H_ #include +TAILQ_HEAD(ufd_children_t, ufd_t); + // union find delete data structure struct ufd_t { struct ufd_t* parent; struct ufd_t* repr; - struct ufd_t* child; struct context_entry_t* thread; + struct ufd_children_t children; + TAILQ_ENTRY(ufd_t) link; }; +struct ufd_t ufd__make_set(struct context_entry_t* thread); + void ufd__init(struct ufd_t* ufd, struct context_entry_t* thread); /*