From e4c4c3dd87c182bd8aee79ab6b431efa3164ff41 Mon Sep 17 00:00:00 2001 From: OmniMan <209760780+OmniManAintGotNothingOnMe@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:34:18 +0400 Subject: [PATCH] Clean up: remove test, skip list, and local config files; add assertion to uxListRemove --- list.c | 1 + skip_list.c | 77 -------------------------------------------- skip_list.h | 32 ------------------ test_empty_file.txt | 0 test_skip_list.c | 62 ----------------------------------- test_skip_list.exe | Bin 59981 -> 0 bytes 6 files changed, 1 insertion(+), 171 deletions(-) delete mode 100644 skip_list.c delete mode 100644 skip_list.h delete mode 100644 test_empty_file.txt delete mode 100644 test_skip_list.c delete mode 100644 test_skip_list.exe diff --git a/list.c b/list.c index 0c0f3676e..bdea0f6ee 100644 --- a/list.c +++ b/list.c @@ -216,6 +216,7 @@ void vListInsert( List_t * const pxList, UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) { + configASSERT( pxItemToRemove->pxContainer != NULL ); /* The list item knows which list it is in. Obtain the list from the list * item. */ List_t * const pxList = pxItemToRemove->pxContainer; diff --git a/skip_list.c b/skip_list.c deleted file mode 100644 index 6d1cfb867..000000000 --- a/skip_list.c +++ /dev/null @@ -1,77 +0,0 @@ -#include "skip_list.h" -#include - -static int xRandomLevel(void) { - int level = 1; - while ((rand() & 0x1) && level < SKIP_LIST_MAX_LEVEL) - level++; - return level; -} - -void vSkipListInit(SkipList_t *list) { - list->level = 1; - list->header = (SkipListNode_t *)calloc(1, sizeof(SkipListNode_t)); - for (int i = 0; i < SKIP_LIST_MAX_LEVEL; i++) - list->header->forward[i] = NULL; -} - -void vSkipListInsert(SkipList_t *list, TickType_t key, void *value) { - SkipListNode_t *update[SKIP_LIST_MAX_LEVEL]; - SkipListNode_t *x = list->header; - for (int i = list->level - 1; i >= 0; i--) { - while (x->forward[i] && x->forward[i]->key < key) - x = x->forward[i]; - update[i] = x; - } - x = x->forward[0]; - if (x && x->key == key) { - x->value = value; - return; - } - int lvl = xRandomLevel(); - if (lvl > list->level) { - for (int i = list->level; i < lvl; i++) - update[i] = list->header; - list->level = lvl; - } - x = (SkipListNode_t *)calloc(1, sizeof(SkipListNode_t)); - x->key = key; - x->value = value; - for (int i = 0; i < lvl; i++) { - x->forward[i] = update[i]->forward[i]; - update[i]->forward[i] = x; - } -} - -void vSkipListRemove(SkipList_t *list, TickType_t key) { - SkipListNode_t *update[SKIP_LIST_MAX_LEVEL]; - SkipListNode_t *x = list->header; - for (int i = list->level - 1; i >= 0; i--) { - while (x->forward[i] && x->forward[i]->key < key) - x = x->forward[i]; - update[i] = x; - } - x = x->forward[0]; - if (x && x->key == key) { - for (int i = 0; i < list->level; i++) { - if (update[i]->forward[i] != x) - break; - update[i]->forward[i] = x->forward[i]; - } - free(x); - while (list->level > 1 && list->header->forward[list->level - 1] == NULL) - list->level--; - } -} - -void *pvSkipListSearch(SkipList_t *list, TickType_t key) { - SkipListNode_t *x = list->header; - for (int i = list->level - 1; i >= 0; i--) { - while (x->forward[i] && x->forward[i]->key < key) - x = x->forward[i]; - } - x = x->forward[0]; - if (x && x->key == key) - return x->value; - return NULL; -} diff --git a/skip_list.h b/skip_list.h deleted file mode 100644 index 737855cff..000000000 --- a/skip_list.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef FREERTOS_SKIP_LIST_H -#define FREERTOS_SKIP_LIST_H - -#include -#include - -#ifndef TickType_t -typedef unsigned int TickType_t; -#endif - -#ifndef SKIP_LIST_MAX_LEVEL -#define SKIP_LIST_MAX_LEVEL 4 // Tunable for memory/complexity tradeoff -#endif - -// Forward declaration -typedef struct SkipListNode { - TickType_t key; - void *value; - struct SkipListNode *forward[SKIP_LIST_MAX_LEVEL]; -} SkipListNode_t; - -typedef struct SkipList { - SkipListNode_t *header; - int level; -} SkipList_t; - -void vSkipListInit(SkipList_t *list); -void vSkipListInsert(SkipList_t *list, TickType_t key, void *value); -void vSkipListRemove(SkipList_t *list, TickType_t key); -void *pvSkipListSearch(SkipList_t *list, TickType_t key); - -#endif // FREERTOS_SKIP_LIST_H diff --git a/test_empty_file.txt b/test_empty_file.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/test_skip_list.c b/test_skip_list.c deleted file mode 100644 index c141ea00d..000000000 --- a/test_skip_list.c +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include -#include "skip_list.h" - -void print_skip_list(SkipList_t *list) { - printf("Skip List: "); - SkipListNode_t *node = list->header->forward[0]; - while (node) { - printf("(%u, %p) ", node->key, node->value); - node = node->forward[0]; - } - printf("\n"); -} - -int main(void) { - SkipList_t list; - vSkipListInit(&list); - - // Insert test - printf("Inserting values...\n"); - for (TickType_t i = 10; i > 0; --i) { - int *val = (int *)malloc(sizeof(int)); - *val = i * 100; - vSkipListInsert(&list, i, val); - } - print_skip_list(&list); - - // Search test - printf("Searching for key 5...\n"); - int *found = (int *)pvSkipListSearch(&list, 5); - if (found) { - printf("Found key 5 with value %d\n", *found); - } else { - printf("Key 5 not found!\n"); - } - - printf("Searching for key 42...\n"); - found = (int *)pvSkipListSearch(&list, 42); - if (found) { - printf("Found key 42 with value %d\n", *found); - } else { - printf("Key 42 not found!\n"); - } - - // Remove test - printf("Removing key 5...\n"); - vSkipListRemove(&list, 5); - print_skip_list(&list); - found = (int *)pvSkipListSearch(&list, 5); - if (!found) { - printf("Key 5 successfully removed.\n"); - } - - // Cleanup - for (TickType_t i = 1; i <= 10; ++i) { - int *val = (int *)pvSkipListSearch(&list, i); - if (val) free(val); - } - // Free header node - free(list.header); - return 0; -} diff --git a/test_skip_list.exe b/test_skip_list.exe deleted file mode 100644 index c1fb49fad466516630e43874da3b57f1b5ce3c51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59981 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