From 745da63aa466177394e516b8657cedd1a6f86c3a Mon Sep 17 00:00:00 2001 From: Moi Ran Date: Fri, 17 Nov 2023 13:24:46 +0800 Subject: [PATCH 1/4] * ADD [linkedlist] Introduce linkedlist header file Signed-off-by: Moi Ran --- include/nng/supplemental/nanolib/linkedlist.h | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 include/nng/supplemental/nanolib/linkedlist.h diff --git a/include/nng/supplemental/nanolib/linkedlist.h b/include/nng/supplemental/nanolib/linkedlist.h new file mode 100644 index 000000000..18c14323a --- /dev/null +++ b/include/nng/supplemental/nanolib/linkedlist.h @@ -0,0 +1,33 @@ +#include +#include + +struct linkedListNode { + void *data; + unsigned long long expiredAt; + struct linkedListNode *next; + struct linkedListNode *prev; +}; + +struct linkedList { + unsigned int cap; + unsigned int size; + unsigned int overWrite; + unsigned long long expiredAt; + + struct linkedListNode *head; + struct linkedListNode *tail; +}; + +int linkedList_replace_head(struct linkedList *list, + void *data, + unsigned long long expiredAt); +int linkedList_init(struct linkedList **list, + unsigned int cap, + unsigned int overWrite, + unsigned long long expiredAt); +int linkedList_enqueue(struct linkedList *list, + void *data, + unsigned long long expiredAt); +int linkedList_dequeue(struct linkedList *list, + void **data); +int linkedList_release(struct linkedList *list); From 120152f7ffa8a427b94f3d7345e5ce9ffbc84075 Mon Sep 17 00:00:00 2001 From: Moi Ran Date: Fri, 17 Nov 2023 13:25:27 +0800 Subject: [PATCH 2/4] * ADD [linkedlist] Introduce linkedlist source file Signed-off-by: Moi Ran --- .../nanolib/linkedlist/linkedlist.c | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 src/supplemental/nanolib/linkedlist/linkedlist.c diff --git a/src/supplemental/nanolib/linkedlist/linkedlist.c b/src/supplemental/nanolib/linkedlist/linkedlist.c new file mode 100644 index 000000000..03a8300a4 --- /dev/null +++ b/src/supplemental/nanolib/linkedlist/linkedlist.c @@ -0,0 +1,138 @@ +#include "nng/supplemental/nanolib/linkedlist.h" + +int linkedList_replace_head(struct linkedList *list, + void *data, + unsigned long long expiredAt) +{ + if (list->size == 0) { + printf("linkedList_replace_head failed list is empty!\n"); + return -1; + } + + free(list->head->data); + + list->head->data = data; + list->head = list->head->next; + list->tail = list->tail->next; + + return 0; +} + +int linkedList_init(struct linkedList **list, + unsigned int cap, + unsigned int overWrite, + unsigned long long expiredAt) +{ + struct linkedList *newList; + + newList = (struct linkedList *)malloc(sizeof(struct linkedList)); + if (newList == NULL) { + printf("alloc new linkedList failed\n"); + return -1; + } + + newList->cap = cap; + newList->size = 0; + newList->overWrite = overWrite; + newList->expiredAt = expiredAt; + newList->head = NULL; + newList->tail = NULL; + + *list = newList; + + return 0; +} + +int linkedList_enqueue(struct linkedList *list, + void *data, + unsigned long long expiredAt) +{ + if (list->size == list->cap) { + if (list->overWrite == 0) { + printf("Linked list is full, and do not allow to overwrite!\n"); + return -1; + } else { + return linkedList_replace_head(list, data, expiredAt); + } + } + + struct linkedListNode *newNode = NULL; + newNode = (struct linkedListNode *)malloc(sizeof(struct linkedListNode)); + if (newNode == NULL) { + printf("Linked list alloc new node failed!\n"); + return -1; + } + newNode->data = data; + newNode->expiredAt = expiredAt; + + if (list->head == NULL) { + list->head = newNode; + list->tail = newNode; + } + + newNode->next = list->head; + newNode->prev = list->tail; + + list->tail->next = newNode; + list->head->prev = newNode; + list->tail = newNode; + list->size++; + + return 0; +} + +int linkedList_dequeue(struct linkedList *list, + void **data) +{ + if (list->size == 0) { + printf("Linked list is empty, dequeue failed!\n"); + return -1; + } + struct linkedListNode *node = list->head; + + *data = node->data; + + struct linkedListNode *tmp; + if (list->size == 1) { + tmp = list->head; + free(tmp); + list->head = NULL; + list->tail = NULL; + list->size = 0; + return 0; + } + + tmp = list->head; + + list->tail->next = list->head->next; + list->head->next->prev = list->tail; + list->head = list->head->next; + + free(tmp); + + list->size--; + + return 0; +} + +int linkedList_release(struct linkedList *list) +{ + int ret = 0; + if (list == NULL) { + return -1; + } + + while (list->size != 0) { + void *data; + ret = linkedList_dequeue(list, &data); + if (ret != 0) { + printf("linkedList_dequeue failed!\n"); + return -1; + } + free(data); + } + + free(list); + + return 0; +} From 46b7af512d79124797756472336ddd710027c1cb Mon Sep 17 00:00:00 2001 From: Moi Ran Date: Fri, 17 Nov 2023 13:26:18 +0800 Subject: [PATCH 3/4] * ADD [linkedlist] Add CMakeLists Signed-off-by: Moi Ran --- src/supplemental/nanolib/CMakeLists.txt | 3 +-- src/supplemental/nanolib/linkedlist/CMakeLists.txt | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 src/supplemental/nanolib/linkedlist/CMakeLists.txt diff --git a/src/supplemental/nanolib/CMakeLists.txt b/src/supplemental/nanolib/CMakeLists.txt index 897905b2c..8c80d2177 100644 --- a/src/supplemental/nanolib/CMakeLists.txt +++ b/src/supplemental/nanolib/CMakeLists.txt @@ -40,5 +40,4 @@ if (SUPP_RULE_ENGINE) nng_test(rule_test) endif (SUPP_RULE_ENGINE) - - +add_subdirectory(linkedlist) diff --git a/src/supplemental/nanolib/linkedlist/CMakeLists.txt b/src/supplemental/nanolib/linkedlist/CMakeLists.txt new file mode 100644 index 000000000..8a9a6db92 --- /dev/null +++ b/src/supplemental/nanolib/linkedlist/CMakeLists.txt @@ -0,0 +1,3 @@ +nng_sources( + linkedlist.c +) From 4c92629c2d48033ae0ab8e5a7b98711ccbe93a2b Mon Sep 17 00:00:00 2001 From: Moi Ran Date: Fri, 17 Nov 2023 14:19:07 +0800 Subject: [PATCH 4/4] * MDF [linkedlist] Adapt to NNG Signed-off-by: Moi Ran --- src/supplemental/nanolib/linkedlist/linkedlist.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/supplemental/nanolib/linkedlist/linkedlist.c b/src/supplemental/nanolib/linkedlist/linkedlist.c index 03a8300a4..176f02ab1 100644 --- a/src/supplemental/nanolib/linkedlist/linkedlist.c +++ b/src/supplemental/nanolib/linkedlist/linkedlist.c @@ -5,7 +5,7 @@ int linkedList_replace_head(struct linkedList *list, unsigned long long expiredAt) { if (list->size == 0) { - printf("linkedList_replace_head failed list is empty!\n"); + log_error("linkedList_replace_head failed list is empty!\n"); return -1; } @@ -25,9 +25,9 @@ int linkedList_init(struct linkedList **list, { struct linkedList *newList; - newList = (struct linkedList *)malloc(sizeof(struct linkedList)); + newList = (struct linkedList *)nni_alloc(sizeof(struct linkedList)); if (newList == NULL) { - printf("alloc new linkedList failed\n"); + log_error("alloc new linkedList failed\n"); return -1; } @@ -49,7 +49,7 @@ int linkedList_enqueue(struct linkedList *list, { if (list->size == list->cap) { if (list->overWrite == 0) { - printf("Linked list is full, and do not allow to overwrite!\n"); + log_error("Linked list is full, and do not allow to overwrite!\n"); return -1; } else { return linkedList_replace_head(list, data, expiredAt); @@ -57,9 +57,9 @@ int linkedList_enqueue(struct linkedList *list, } struct linkedListNode *newNode = NULL; - newNode = (struct linkedListNode *)malloc(sizeof(struct linkedListNode)); + newNode = (struct linkedListNode *)nni_alloc(sizeof(struct linkedListNode)); if (newNode == NULL) { - printf("Linked list alloc new node failed!\n"); + log_error("Linked list alloc new node failed!\n"); return -1; } newNode->data = data; @@ -85,7 +85,7 @@ int linkedList_dequeue(struct linkedList *list, void **data) { if (list->size == 0) { - printf("Linked list is empty, dequeue failed!\n"); + log_error("Linked list is empty, dequeue failed!\n"); return -1; } struct linkedListNode *node = list->head; @@ -126,7 +126,7 @@ int linkedList_release(struct linkedList *list) void *data; ret = linkedList_dequeue(list, &data); if (ret != 0) { - printf("linkedList_dequeue failed!\n"); + log_error("linkedList_dequeue failed!\n"); return -1; } free(data);