Fiddling with llist to make memory management easier. Specifically, the option to delete the contents of the list when we delete the list is a good thing.
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -477,8 +477,8 @@ typedef struct llist_s { | |
| } llist_t; | |
| extern llist_t *llist_add_to(llist_t *old_head, char *new_item); | |
| extern llist_t *llist_add_to_end(llist_t *list_head, char *data); | |
| - | extern llist_t *llist_free_one(llist_t *elm); |
| - | extern void llist_free(llist_t *elm); |
| + | extern void *llist_pop(llist_t **elm); |
| + | extern void llist_free(llist_t *elm, void (*freeit)(void *data)); |
| extern void print_login_issue(const char *issue_file, const char *tty); | |
| extern void print_login_prompt(void); | |
| @@ -101,7 +101,7 @@ $(LIBBB_MOBJ5):$(LIBBB_MSRC5) | |
| $(compile.c) -DL_$(notdir $*) | |
| LIBBB_MSRC6:=$(srcdir)/llist.c | |
| - | LIBBB_MOBJ6:=llist_add_to.o llist_add_to_end.o llist_free_one.o llist_free.o |
| + | LIBBB_MOBJ6:=llist_add_to.o llist_add_to_end.o llist_pop.o llist_free.o |
| LIBBB_MOBJ6:=$(patsubst %,$(LIBBB_DIR)/%, $(LIBBB_MOBJ6)) | |
| $(LIBBB_MOBJ6):$(LIBBB_MSRC6) | |
| $(compile.c) -DL_$(notdir $*) | |
| @@ -47,21 +47,32 @@ llist_t *llist_add_to_end(llist_t *list_head, char *data) | |
| } | |
| #endif | |
| - | #ifdef L_llist_free_one |
| - | /* Free the current list element and advance to the next entry in the list. |
| - | * Returns a pointer to the next element. */ |
| - | llist_t *llist_free_one(llist_t *elm) |
| + | #ifdef L_llist_pop |
| + | /* Remove first element from the list and return it */ |
| + | void *llist_pop(llist_t **head) |
| { | |
| - | llist_t *next = elm ? elm->link : NULL; |
| - | free(elm); |
| - | return next; |
| + | void *data; |
| + | |
| + | if(!*head) data = *head; |
| + | else { |
| + | void *next = (*head)->link; |
| + | data = (*head)->data; |
| + | *head = (*head)->link; |
| + | free(next); |
| + | } |
| + | |
| + | return data; |
| } | |
| #endif | |
| #ifdef L_llist_free | |
| - | /* Recursively free all elements in the linked list. */ |
| - | void llist_free(llist_t *elm) |
| + | /* Recursively free all elements in the linked list. If freeit != NULL |
| + | * call it on each datum in the list */ |
| + | void llist_free(llist_t *elm, void (*freeit)(void *data)) |
| { | |
| - | while ((elm = llist_free_one(elm))); |
| + | while (elm) { |
| + | void *data = llist_pop(&elm); |
| + | if (freeit) freeit(data); |
| + | } |
| } | |
| #endif | |
| @@ -65,7 +65,7 @@ int pidof_main(int argc, char **argv) | |
| while (omits_p) { | |
| /* are we asked to exclude the parent's process ID? */ | |
| if (!strncmp(omits_p->data, "%PPID", 5)) { | |
| - | omits_p = llist_free_one(omits_p); |
| + | llist_pop(&omits_p); |
| snprintf(getppid_str, sizeof(getppid_str), "%d", getppid()); | |
| omits_p = llist_add_to(omits_p, getppid_str); | |
| #if 0 | |
| @@ -117,7 +117,7 @@ int pidof_main(int argc, char **argv) | |
| #if ENABLE_FEATURE_PIDOF_OMIT | |
| if (ENABLE_FEATURE_CLEAN_UP) | |
| - | llist_free(omits); |
| + | llist_free(omits, NULL); |
| #endif | |
| return fail ? EXIT_FAILURE : EXIT_SUCCESS; | |
| } | |
| @@ -182,7 +182,7 @@ llist_t *fslist = 0; | |
| #if ENABLE_FEATURE_CLEAN_UP | |
| static void delete_block_backed_filesystems(void) | |
| { | |
| - | llist_free(fslist); |
| + | llist_free(fslist, free); |
| } | |
| #else | |
| void delete_block_backed_filesystems(void); | |