From 2da6c57302f03f7fd34e52cdef25ccb7c92591d2 Mon Sep 17 00:00:00 2001 From: Hizenberg Date: Thu, 14 Mar 2024 23:02:57 +0530 Subject: [PATCH] Threads --- Hello_World_Thread/cleaner.sh | 1 + Hello_World_Thread/compile.sh | 3 + Hello_World_Thread/hello_world_thread.c | 87 +++++++ Hello_World_Thread/hello_world_thread.exe | Bin 0 -> 18520 bytes Joinable_Detached_thread/cleaner.sh | 1 + Joinable_Detached_thread/compile_joinable.sh | 3 + Joinable_Detached_thread/joinable_example.c | 111 +++++++++ Joinable_Detached_thread/joinable_example.exe | Bin 0 -> 19288 bytes NFC/clearner.sh | 1 + NFC/compile.sh | 7 + NFC/glthread/.glthread.h.un~ | Bin 0 -> 723 bytes NFC/glthread/cleaner.sh | 1 + NFC/glthread/glthread.c | 196 ++++++++++++++++ NFC/glthread/glthread.h | 95 ++++++++ NFC/glthread/glthread.h~ | 95 ++++++++ NFC/main.exe | Bin 0 -> 37208 bytes NFC/notif.c | 92 ++++++++ NFC/notif.h | 95 ++++++++ NFC/rt.c | 217 ++++++++++++++++++ NFC/rt.h | 122 ++++++++++ NFC/rtm_publisher.c | 128 +++++++++++ NFC/threaded_subsciber.c | 93 ++++++++ .../.vs/master_slave/v17/Browse.VC.db | Bin 7766016 -> 7766016 bytes .../.vs/master_slave/v17/Browse.VC.db-wal | Bin 443696 -> 0 bytes 24 files changed, 1348 insertions(+) create mode 100644 Hello_World_Thread/cleaner.sh create mode 100644 Hello_World_Thread/compile.sh create mode 100644 Hello_World_Thread/hello_world_thread.c create mode 100644 Hello_World_Thread/hello_world_thread.exe create mode 100644 Joinable_Detached_thread/cleaner.sh create mode 100644 Joinable_Detached_thread/compile_joinable.sh create mode 100644 Joinable_Detached_thread/joinable_example.c create mode 100644 Joinable_Detached_thread/joinable_example.exe create mode 100644 NFC/clearner.sh create mode 100644 NFC/compile.sh create mode 100644 NFC/glthread/.glthread.h.un~ create mode 100644 NFC/glthread/cleaner.sh create mode 100644 NFC/glthread/glthread.c create mode 100644 NFC/glthread/glthread.h create mode 100644 NFC/glthread/glthread.h~ create mode 100644 NFC/main.exe create mode 100644 NFC/notif.c create mode 100644 NFC/notif.h create mode 100644 NFC/rt.c create mode 100644 NFC/rt.h create mode 100644 NFC/rtm_publisher.c create mode 100644 NFC/threaded_subsciber.c diff --git a/Hello_World_Thread/cleaner.sh b/Hello_World_Thread/cleaner.sh new file mode 100644 index 0000000..5b01d20 --- /dev/null +++ b/Hello_World_Thread/cleaner.sh @@ -0,0 +1 @@ +rm *~ .* diff --git a/Hello_World_Thread/compile.sh b/Hello_World_Thread/compile.sh new file mode 100644 index 0000000..2ed42fd --- /dev/null +++ b/Hello_World_Thread/compile.sh @@ -0,0 +1,3 @@ +gcc -g -c hello_world_thread.c -o hello_world_thread.o +gcc -g hello_world_thread.o -o hello_world_thread.exe -lpthread +rm *.o diff --git a/Hello_World_Thread/hello_world_thread.c b/Hello_World_Thread/hello_world_thread.c new file mode 100644 index 0000000..f1af8af --- /dev/null +++ b/Hello_World_Thread/hello_world_thread.c @@ -0,0 +1,87 @@ +/* + * ===================================================================================== + * + * Filename: hello_world_thread.c + * + * Description: + * + * Version: 1.0 + * Created: 06/03/24 08:38:10 PM IST + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), + * Organization: + * + * ===================================================================================== + */ + +#include +#include +#include /* For working with POSIX threads */ +#include /* For pause() and sleep() */ + + +/*Note: pthread_exit(0) API can be used to terminate a thread + * , be it child thread or parent thread */ + + +/* A thread callback fn must have following prototypes + * void *(*thread_fn)(void *) + * */ +static void * +thread_fn_callback(void *arg){ + char *input = (char *)arg; + while(1){ + printf("Input is : %s\n",input); + sleep(1); + } +} + +/* Note that this function is not + * main thread, rather it just a function + * which create a thread and return to main() + * function, which is actually the main thread of this + * process */ +void +thread1_create(){ + + /* opaque object, don't bother about its internal + * members */ + pthread_t pthread; /* Thread handler: This is like a variable which is used + * handle the thread processed */ + + /* Take some argument to be passed to the thread fn, + * Look after that you always pass the persistant memory + * as an argument to the thread, do not pass caller's + * local variables Or stack Memory */ + static char *thread_input1 = "I am thread 1, child thread of main thread"; + + /* Return 0 on success, otherwise returns error-code, all + * pthread functions return -ve error-code on failure, they + * do not set global 'errno' variable */ + int rc = pthread_create(&pthread, + NULL, + thread_fn_callback, + (void *)thread_input1); + + if( rc != 0 ){ + printf("Error occured, thread could not be created, errno = %d\n",rc); + exit(0); + } +} + +int +main(int argc , char **argv){ + + thread1_create(); + printf("The execution of main function( or main thread ) is paused\n"); + //pause(); + /* Main thread, if complete its execution and return normally + * by returning 0 then all the child thread of main thread terminates + * but, if we use pthread_exit(0) to terminate main thread then the + * child threads can continue to exit without any obstruction. */ + + pthread_exit(0); + return 0; +} diff --git a/Hello_World_Thread/hello_world_thread.exe b/Hello_World_Thread/hello_world_thread.exe new file mode 100644 index 0000000000000000000000000000000000000000..866a0c170562c7a7c8deafa693a947dbc3cbe90c GIT binary patch literal 18520 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 literal 0 HcmV?d00001 diff --git a/Joinable_Detached_thread/cleaner.sh b/Joinable_Detached_thread/cleaner.sh new file mode 100644 index 0000000..5b01d20 --- /dev/null +++ b/Joinable_Detached_thread/cleaner.sh @@ -0,0 +1 @@ +rm *~ .* diff --git a/Joinable_Detached_thread/compile_joinable.sh b/Joinable_Detached_thread/compile_joinable.sh new file mode 100644 index 0000000..5acd40f --- /dev/null +++ b/Joinable_Detached_thread/compile_joinable.sh @@ -0,0 +1,3 @@ +gcc -g -c joinable_example.c -o joinable_example.o +gcc -g joinable_example.o -o joinable_example.exe -lpthread +rm *.o diff --git a/Joinable_Detached_thread/joinable_example.c b/Joinable_Detached_thread/joinable_example.c new file mode 100644 index 0000000..1827e45 --- /dev/null +++ b/Joinable_Detached_thread/joinable_example.c @@ -0,0 +1,111 @@ +/* + * ===================================================================================== + * + * Filename: joinable_example.c + * + * Description: + * + * Version: 1.0 + * Created: 07/03/24 04:17:21 PM IST + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), + * Organization: + * + * ===================================================================================== + */ + +#include +#include +#include /* For working with POSIX threads */ +#include /* For pause() and sleep() */ +#include /* For using Global variable errno */ + +void * +thread_fn_callback(void *arg) { + + int th_id = *(int *)arg; + + free(arg); + + int rc = 0; + + while(rc != th_id ){ + + printf("Thread %d doing some work\n", th_id); + sleep(1); + rc++; + } + + int *result = calloc(1,sizeof(int)); + + *result = th_id * th_id; + + return (void *)result; +} + +void +thread_create(pthread_t *pthread_handle, int th_id){ + + pthread_attr_t attr; + + int *_th_id = calloc(1, sizeof(int)); + *_th_id = th_id; + + pthread_attr_init(&attr); + + pthread_attr_setdetachstate(&attr, + PTHREAD_CREATE_JOINABLE + /* PTHREAD_CREATE_DETACHED */); + + pthread_create(pthread_handle, + &attr, + thread_fn_callback, + (void *)_th_id); + + +} + +/* These thread would find the square of the + * argument passed onto it */ +pthread_t pthread2; +pthread_t pthread3; + +int +main( int argc, char **argv ){ + + void *thread_result2 , *thread_result3; + thread_create(&pthread2, 10); + thread_create(&pthread3, 2); + + printf("main fn blocked on pthread join for thread with " + "th_id = 2\n"); + + pthread_join(pthread2, &thread_result2); + + if( thread_result2 ){ + + printf("Return result from thread 2 = %d\n", + *(int *)thread_result2); + free(thread_result2); + thread_result2 = NULL; + } + + printf("main fn blocked on pthread join for thread with " + "th_id = 3\n"); + + pthread_join(pthread3, &thread_result3); + + if( thread_result3 ){ + + printf("Return result from thread 3 = %d\n", + *(int *)thread_result3); + free(thread_result3); + thread_result3 = NULL; + } + + + + return 0; +} diff --git a/Joinable_Detached_thread/joinable_example.exe b/Joinable_Detached_thread/joinable_example.exe new file mode 100644 index 0000000000000000000000000000000000000000..13c759fa4c3afd5ad01b77a7ccba67a0e94fc4bb GIT binary patch literal 19288 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 literal 0 HcmV?d00001 diff --git a/NFC/clearner.sh b/NFC/clearner.sh new file mode 100644 index 0000000..5b01d20 --- /dev/null +++ b/NFC/clearner.sh @@ -0,0 +1 @@ +rm *~ .* diff --git a/NFC/compile.sh b/NFC/compile.sh new file mode 100644 index 0000000..263201a --- /dev/null +++ b/NFC/compile.sh @@ -0,0 +1,7 @@ +gcc -g -c glthread/glthread.c -o glthread/glthread.o +gcc -g -c notif.c -o notif.o +gcc -g -c rtm_publisher.c -o rtm_publisher.o +gcc -g -c rt.c -o rt.o +gcc -g -c threaded_subsciber.c -o threaded_subsciber.o +gcc -g rtm_publisher.o threaded_subsciber.o rt.o notif.o glthread/glthread.o -o main.exe -lpthread +rm *.o glthread/*.o diff --git a/NFC/glthread/.glthread.h.un~ b/NFC/glthread/.glthread.h.un~ new file mode 100644 index 0000000000000000000000000000000000000000..249653d4c428b17151133bb6646198c501c7287e GIT binary patch literal 723 zcmWH`%$*;a=aT=Ffk{4kgXhhHb>eUDISagOkWb~ZJz`zg> z#3{-tscD&csS55sAs#`ljxO;b{_(*fL7~ne8fkg)d5O8HIts-lMWx9lrA4Vwep+T~ zP6~vbo>P)hl$w}QP*S9+fCIz;?a>EfFCb=wVju-)gTxq8-%e0rfyl;R012Q0kQB@i shW|hS){drVluNA;07i#0G&;UY01edxVgn!sr5R9E&?ViNHa=ek0FZHCZ~y=R literal 0 HcmV?d00001 diff --git a/NFC/glthread/cleaner.sh b/NFC/glthread/cleaner.sh new file mode 100644 index 0000000..5b01d20 --- /dev/null +++ b/NFC/glthread/cleaner.sh @@ -0,0 +1 @@ +rm *~ .* diff --git a/NFC/glthread/glthread.c b/NFC/glthread/glthread.c new file mode 100644 index 0000000..612b251 --- /dev/null +++ b/NFC/glthread/glthread.c @@ -0,0 +1,196 @@ +/* + * ===================================================================================== + * + * Filename: glthread.c + * + * Description: + * + * Version: 1.0 + * Created: 09/03/24 07:31:52 PM IST + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), + * Organization: + * + * ===================================================================================== + */ + + + +#include "glthread.h" +#include + +void +init_glthread(glthread_t *glthread){ + + glthread->left = NULL; + glthread->right = NULL; +} + +void +glthread_add_next(glthread_t *curr_glthread, glthread_t *new_glthread){ + + if(!curr_glthread->right){ + curr_glthread->right = new_glthread; + new_glthread->left = curr_glthread; + return; + } + + glthread_t *temp = curr_glthread->right; + curr_glthread->right = new_glthread; + new_glthread->left = curr_glthread; + new_glthread->right = temp; + temp->left = new_glthread; +} + +void +glthread_add_before(glthread_t *curr_glthread, glthread_t *new_glthread){ + + if(!curr_glthread->left){ + new_glthread->left = NULL; + new_glthread->right = curr_glthread; + curr_glthread->left = new_glthread; + return; + } + + glthread_t *temp = curr_glthread->left; + temp->right = new_glthread; + new_glthread->left = temp; + new_glthread->right = curr_glthread; + curr_glthread->left = new_glthread; +} + +void +remove_glthread(glthread_t *curr_glthread){ + + if(!curr_glthread->left){ + if(curr_glthread->right){ + curr_glthread->right->left = NULL; + curr_glthread->right = 0; + return; + } + return; + } + if(!curr_glthread->right){ + curr_glthread->left->right = NULL; + curr_glthread->left = NULL; + return; + } + + curr_glthread->left->right = curr_glthread->right; + curr_glthread->right->left = curr_glthread->left; + curr_glthread->left = 0; + curr_glthread->right = 0; +} + +void +delete_glthread_list(glthread_t *glthread_head){ + + glthread_t *glthreadptr = NULL; + + ITERATE_GLTHREAD_BEGIN(glthread_head, glthreadptr){ + remove_glthread(glthreadptr); + } ITERATE_GLTHREAD_END(glthread_head, glthreadptr); +} + +void +glthread_add_last(glthread_t *glthread_head, glthread_t *new_glthread){ + + glthread_t *glthreadptr = NULL, + *prevglthreadptr = NULL; + + ITERATE_GLTHREAD_BEGIN(glthread_head, glthreadptr){ + prevglthreadptr = glthreadptr; + } ITERATE_GLTHREAD_END(glthread_head, glthreadptr); + + if(prevglthreadptr) + glthread_add_next(prevglthreadptr, new_glthread); + else + glthread_add_next(glthread_head, new_glthread); +} + +unsigned int +get_glthread_list_count(glthread_t *glthread_head){ + + unsigned int count = 0; + glthread_t *glthreadptr = NULL; + + ITERATE_GLTHREAD_BEGIN(glthread_head, glthreadptr){ + count++; + } ITERATE_GLTHREAD_END(glthread_head, glthreadptr); + return count; +} + + +void +glthread_priority_insert(glthread_t *glthread_head, + glthread_t *glthread, + int (*comp_fn)(void *, void *), + int offset){ + + + glthread_t *curr = NULL, + *prev = NULL; + + init_glthread(glthread); + + if(IS_GLTHREAD_LIST_EMPTY(glthread_head)){ + glthread_add_next(glthread_head, glthread); + return; + } + + /* Only one node*/ + if(glthread_head->right && !glthread_head->right->right){ + if(comp_fn(GLTHREAD_GET_USER_DATA_FROM_OFFSET(glthread, offset), + GLTHREAD_GET_USER_DATA_FROM_OFFSET(glthread_head->right, offset)) == -1){ + glthread_add_next(glthread_head, glthread); + } + else{ + glthread_add_next(glthread_head->right, glthread); + } + return; + } + + ITERATE_GLTHREAD_BEGIN(glthread_head, curr){ + + if(comp_fn(GLTHREAD_GET_USER_DATA_FROM_OFFSET(glthread, offset), + GLTHREAD_GET_USER_DATA_FROM_OFFSET(curr, offset)) != -1){ + prev = curr; + continue; + } + + if(!prev) + glthread_add_next(glthread_head, glthread); + else + glthread_add_next(prev, glthread); + + return; + + }ITERATE_GLTHREAD_END(glthread_head, curr); + + /*Add in the end*/ + glthread_add_next(prev, glthread); +} + +glthread_t * +dequeue_glthread_first(glthread_t *base_glthread){ + + glthread_t *temp; + if(!base_glthread->right) + return NULL; + temp = base_glthread->right; + remove_glthread(temp); + return temp; +} + +#if 0 +void * +gl_thread_search(glthread_t *glthread_head, + void *(*thread_to_struct_fn)(glthread_t *), + void *key, + int (*comparison_fn)(void *, void *)){ + + return NULL; +} +#endif diff --git a/NFC/glthread/glthread.h b/NFC/glthread/glthread.h new file mode 100644 index 0000000..1e85273 --- /dev/null +++ b/NFC/glthread/glthread.h @@ -0,0 +1,95 @@ +/* + * ===================================================================================== + * + * Filename: glthread.h + * + * Description: + * + * Version: 1.0 + * Created: 09/03/24 07:30:40 PM IST + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), + * Organization: + * + * ===================================================================================== + */ + + +#ifndef __GLUETHREAD__ +#define __GLUETHREAD__ + +typedef struct _glthread{ + + struct _glthread *left; + struct _glthread *right; +} glthread_t; + +void +glthread_add_next(glthread_t *base_glthread, glthread_t *new_glthread); + +void +glthread_add_before(glthread_t *base_glthread, glthread_t *new_glthread); + +void +remove_glthread(glthread_t *glthread); + +void +init_glthread(glthread_t *glthread); + +void +glthread_add_last(glthread_t *base_glthread, glthread_t *new_glthread); + +#define IS_GLTHREAD_LIST_EMPTY(glthreadptr) \ + ((glthreadptr)->right == 0 && (glthreadptr)->left == 0) + +#define GLTHREAD_TO_STRUCT(fn_name, structure_name, field_name) \ + static inline structure_name * fn_name(glthread_t *glthreadptr){ \ + if(glthreadptr)\ + return (structure_name *)((char *)(glthreadptr) - (char *)&(((structure_name *)0)->field_name)); \ + else return NULL;\ + } + +/* delete safe loop*/ +/*Normal continue and break can be used with this loop macro*/ + +#define BASE(glthreadptr) ((glthreadptr)->right) + +#define ITERATE_GLTHREAD_BEGIN(glthreadptrstart, glthreadptr) \ +{ \ + glthread_t *_glthread_ptr = NULL; \ + glthreadptr = BASE(glthreadptrstart); \ + for(; glthreadptr!= NULL; glthreadptr = _glthread_ptr){ \ + _glthread_ptr = (glthreadptr)->right; + +#define ITERATE_GLTHREAD_END(glthreadptrstart, glthreadptr) \ + }} + +#define GLTHREAD_GET_USER_DATA_FROM_OFFSET(glthreadptr, offset) \ + (void *)((char *)(glthreadptr) - offset) + +void +delete_glthread_list(glthread_t *base_glthread); + +unsigned int +get_glthread_list_count(glthread_t *base_glthread); + +void +glthread_priority_insert(glthread_t *base_glthread, + glthread_t *glthread, + int (*comp_fn)(void *, void *), + int offset); + +glthread_t * +dequeue_glthread_first(glthread_t *base_glthread); + +#if 0 +void * +gl_thread_search(glthread_t *base_glthread, + void *(*thread_to_struct_fn)(glthread_t *), + void *key, + int (*comparison_fn)(void *, void *)); + +#endif +#endif /* __GLUETHREAD__ */ diff --git a/NFC/glthread/glthread.h~ b/NFC/glthread/glthread.h~ new file mode 100644 index 0000000..e221b99 --- /dev/null +++ b/NFC/glthread/glthread.h~ @@ -0,0 +1,95 @@ +/* + * ===================================================================================== + * + * Filename: glthread.h + * + * Description: + * + * Version: 1.0 + * Created: 09/03/24 07:30:40 PM IST + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), + * Organization: + * + * ===================================================================================== + */ + + +#ifndef __GLUETHREAD__ +#define __GLUETHREAD__ + +typedef struct _glthread{ + + struct _glthread *left; + struct _glthread *right; +} glthread_t; + +void +glthread_add_next(glthread_t *base_glthread, glthread_t *new_glthread); + +void +glthread_add_before(glthread_t *base_glthread, glthread_t *new_glthread); + +void +remove_glthread(glthread_t *glthread); + +void +init_glthread(glthread_t *glthread); + +void +glthread_add_last(glthread_t *base_glthread, glthread_t *new_glthread); + +#define IS_GLTHREAD_LIST_EMPTY(glthreadptr) \ + ((glthreadptr)->right == 0 && (glthreadptr)->left == 0) + +#define GLTHREAD_TO_STRUCT(fn_name, structure_name, field_name,glthreadptr) \ + static inline structure_name * fn_name(glthread_t *glthreadptr){ \ + if(glthreadptr)\ + return (structure_name *)((char *)(glthreadptr) - (char *)&(((structure_name *)0)->field_name)); \ + else return NULL;\ + } + +/* delete safe loop*/ +/*Normal continue and break can be used with this loop macro*/ + +#define BASE(glthreadptr) ((glthreadptr)->right) + +#define ITERATE_GLTHREAD_BEGIN(glthreadptrstart, glthreadptr) \ +{ \ + glthread_t *_glthread_ptr = NULL; \ + glthreadptr = BASE(glthreadptrstart); \ + for(; glthreadptr!= NULL; glthreadptr = _glthread_ptr){ \ + _glthread_ptr = (glthreadptr)->right; + +#define ITERATE_GLTHREAD_END(glthreadptrstart, glthreadptr) \ + }} + +#define GLTHREAD_GET_USER_DATA_FROM_OFFSET(glthreadptr, offset) \ + (void *)((char *)(glthreadptr) - offset) + +void +delete_glthread_list(glthread_t *base_glthread); + +unsigned int +get_glthread_list_count(glthread_t *base_glthread); + +void +glthread_priority_insert(glthread_t *base_glthread, + glthread_t *glthread, + int (*comp_fn)(void *, void *), + int offset); + +glthread_t * +dequeue_glthread_first(glthread_t *base_glthread); + +#if 0 +void * +gl_thread_search(glthread_t *base_glthread, + void *(*thread_to_struct_fn)(glthread_t *), + void *key, + int (*comparison_fn)(void *, void *)); + +#endif +#endif /* __GLUETHREAD__ */ diff --git a/NFC/main.exe b/NFC/main.exe new file mode 100644 index 0000000000000000000000000000000000000000..c0cf06b667f20c0163ad8e1b1eba12d390e25de5 GIT binary patch literal 37208 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 +#include +#include +#include "notif.h" + +notif_chain_t * +nfc_create_new_notif_chain(char *notif_chain_name) { + + notif_chain_t *nfc = calloc(1, sizeof(notif_chain_t)); + if(notif_chain_name) { + strncpy(nfc->nfc_name, notif_chain_name, + sizeof(nfc->nfc_name)); + } + init_glthread(&nfc->notif_chain_head); + return nfc; +} + +void +nfc_register_notif_chain(notif_chain_t *nfc, + notif_chain_elem_t *nfce){ + + notif_chain_elem_t *new_nfce = calloc(1, sizeof(notif_chain_elem_t)); + memcpy(new_nfce, nfce, sizeof(notif_chain_elem_t)); + init_glthread(&new_nfce->glue); + glthread_add_next(&nfc->notif_chain_head, &new_nfce->glue); +} + +void +nfc_delete_all_nfce(notif_chain_t *nfc){ + + glthread_t *curr; + notif_chain_elem_t *nfce; + + ITERATE_GLTHREAD_BEGIN(&nfc->notif_chain_head, curr){ + + nfce = glthread_glue_to_notif_chain_elem(curr); + remove_glthread(&nfce->glue); + free(nfce); + } ITERATE_GLTHREAD_END(&nfc->notif_chain_head, curr); +} + +void +nfc_invoke_notif_chain(notif_chain_t *nfc, + void *arg, size_t arg_size, + char *key, size_t key_size, + nfc_op_t nfc_op_code){ + + glthread_t *curr; + notif_chain_elem_t *nfce; + + if(IS_GLTHREAD_LIST_EMPTY(&nfc->notif_chain_head)) { + return; + } + + assert(key_size <= MAX_NOTIF_KEY_SIZE); + + ITERATE_GLTHREAD_BEGIN(&nfc->notif_chain_head, curr){ + + nfce = glthread_glue_to_notif_chain_elem(curr); + + if(!(key && key_size && + nfce->is_key_set && (key_size == nfce->key_size))){ + + nfce->app_cb(arg, arg_size, nfc_op_code, nfce->subs_id); + } + else { + + if(memcmp(key, nfce->key, key_size) == 0) { + + nfce->app_cb(arg, arg_size, nfc_op_code, nfce->subs_id); + } + } + }ITERATE_GLTHREAD_END(&nfc->notif_chain_head, curr); +} diff --git a/NFC/notif.h b/NFC/notif.h new file mode 100644 index 0000000..c9f9ad8 --- /dev/null +++ b/NFC/notif.h @@ -0,0 +1,95 @@ +/* + * ===================================================================================== + * + * Filename: notif.h + * + * Description: + * + * Version: 1.0 + * Created: 10/03/24 12:02:16 PM IST + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), + * Organization: + * + * ===================================================================================== + */ +#ifndef __NOTIF_CHAIN_ +#define __NOTIF_CHAIN_ + +#include /* for size_t */ +#include "glthread/glthread.h" +#include +#include +#define MAX_NOTIF_KEY_SIZE 64 + +typedef enum{ + + NFC_UNKNOWN, + NFC_SUB, + NFC_ADD, + NFC_MOD, + NFC_DEL, +} nfc_op_t; + +static inline char * +nfc_get_str_op_code(nfc_op_t nfc_op_code) { + + static char op_code_str[16]; + + switch(nfc_op_code) { + + case NFC_UNKNOWN: + return "NFC_UNKNOWN"; + case NFC_SUB: + return "NFC_SUB"; + case NFC_ADD: + return "NFC_ADD"; + case NFC_MOD: + return "NFC_MOD"; + case NFC_DEL: + return "NFC_DEL"; + default: + return NULL; + } +} + + +typedef void (*nfc_app_cb)(void *, size_t, nfc_op_t, uint32_t); + +typedef struct notif_chain_elem_{ + + char key[MAX_NOTIF_KEY_SIZE]; + size_t key_size; + uint32_t subs_id; + bool is_key_set; + nfc_app_cb app_cb; + glthread_t glue; +} notif_chain_elem_t; +GLTHREAD_TO_STRUCT(glthread_glue_to_notif_chain_elem, + notif_chain_elem_t, glue); + +typedef struct notif_chain_ { + + char nfc_name[64]; + glthread_t notif_chain_head; +} notif_chain_t; + +notif_chain_t * +nfc_create_new_notif_chain(char *notif_chain_name); + +void +nfc_delete_all_nfce(notif_chain_t *nfc); + +void +nfc_register_notif_chain(notif_chain_t *nfc, + notif_chain_elem_t *nfce); + +void +nfc_invoke_notif_chain(notif_chain_t *nfc, + void *arg, size_t arg_size, + char *key, size_t key_size, + nfc_op_t nfc_op_code); + +#endif /* __NOTIF_CHAIN_ */ diff --git a/NFC/rt.c b/NFC/rt.c new file mode 100644 index 0000000..d37b10a --- /dev/null +++ b/NFC/rt.c @@ -0,0 +1,217 @@ +/* + * ===================================================================================== + * + * Filename: rt.c + * + * Description: + * + * Version: 1.0 + * Created: 10/03/24 12:55:35 PM IST + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), + * Organization: + * + * ===================================================================================== + */ +#include +#include +#include +#include +#include +#include "rt.h" + +void +rt_init_rt_table(rt_table_t *rt_table){ + + rt_table->head = NULL; +} + +rt_entry_t * +rt_add_or_update_rt_entry(rt_table_t *rt_table, + char *dest, + char mask, + char *gw_ip, + char *oif){ + + bool new_entry; + rt_entry_t *head = NULL; + rt_entry_t *rt_entry = NULL; + + new_entry = false; + + rt_entry = rt_look_up_rt_entry(rt_table, dest, mask); + + if(!rt_entry) { + + rt_entry = calloc(1, sizeof(rt_entry_t)); + + strncpy(rt_entry->rt_entry_keys.dest, dest, + sizeof(rt_entry->rt_entry_keys.dest)); + rt_entry->rt_entry_keys.mask = mask; + + rt_entry->nfc = nfc_create_new_notif_chain(0); + new_entry = true; + } + + if(gw_ip) + strncpy(rt_entry->gw_ip, gw_ip, sizeof(rt_entry->gw_ip)); + if(oif) + strncpy(rt_entry->oif, oif, sizeof(rt_entry->oif)); + + if (new_entry) { + head = rt_table->head; + rt_table->head = rt_entry; + rt_entry->prev = 0; + rt_entry->next = head; + if(head) + head->prev = rt_entry; + } + + if (gw_ip || oif) { + + /* Entry is being updated by the publisher, send + * notification to all subscribers*/ + nfc_invoke_notif_chain(rt_entry->nfc, + (char *)rt_entry, sizeof(rt_entry_t), + 0, 0, NFC_MOD); + } + + return rt_entry; +} + +bool +rt_delete_rt_entry(rt_table_t *rt_table, + char *dest, char mask){ + + rt_entry_t *rt_entry = NULL; + + ITERTAE_RT_TABLE_BEGIN(rt_table, rt_entry){ + + if(strncmp(rt_entry->rt_entry_keys.dest, + dest, sizeof(rt_entry->rt_entry_keys.dest)) == 0 && + rt_entry->rt_entry_keys.mask == mask){ + + rt_entry_remove(rt_table, rt_entry); + + nfc_invoke_notif_chain(rt_entry->nfc, + (char *)rt_entry, sizeof(rt_entry_t), + 0, 0, NFC_DEL); + nfc_delete_all_nfce(rt_entry->nfc); + free(rt_entry->nfc); + rt_entry->nfc = NULL; + free(rt_entry->nfc); + + free(rt_entry); + return true; + } + } ITERTAE_RT_TABLE_END(rt_table, curr); + + return false; +} + +void +rt_clear_rt_table(rt_table_t *rt_table){ + + +} + +void +rt_free_rt_table(rt_table_t *rt_table){ + + +} + +void +rt_dump_rt_table(rt_table_t *rt_table){ + + rt_entry_t *rt_entry = NULL; + + ITERTAE_RT_TABLE_BEGIN(rt_table, rt_entry){ + + printf("%-20s %-4d %-20s %s\n", + rt_entry->rt_entry_keys.dest, + rt_entry->rt_entry_keys.mask, + rt_entry->gw_ip, + rt_entry->oif); + printf("\tPrinting Subscribers : "); + + glthread_t *curr; + notif_chain_elem_t *nfce; + + ITERATE_GLTHREAD_BEGIN(&rt_entry->nfc->notif_chain_head, curr){ + + nfce = glthread_glue_to_notif_chain_elem(curr); + + printf("%u ", nfce->subs_id); + + } ITERATE_GLTHREAD_END(&rt_entry->nfc->notif_chain_head, curr) + printf("\n"); + } ITERTAE_RT_TABLE_END(rt_table, rt_entry); +} + +rt_entry_t * +rt_look_up_rt_entry(rt_table_t *rt_table, + char *dest, char mask) { + + rt_entry_t *rt_entry = NULL; + + ITERTAE_RT_TABLE_BEGIN(rt_table, rt_entry) { + if ((strncmp(rt_entry->rt_entry_keys.dest, + dest, sizeof(rt_entry->rt_entry_keys.dest)) == 0) && + rt_entry->rt_entry_keys.mask == mask) { + + return rt_entry; + } + } ITERTAE_RT_TABLE_END(rt_table, rt_entry); + return NULL; +} + +void +rt_table_register_for_notification( + rt_table_t *rt_table, + rt_entry_keys_t *key, + size_t key_size, + nfc_app_cb app_cb, + uint32_t subs_id) { + + bool new_entry_created; + rt_entry_t *rt_entry; + notif_chain_elem_t nfce; + + new_entry_created = false; + + rt_entry = rt_look_up_rt_entry(rt_table, key->dest, key->mask); + + if (!rt_entry) { + /* rt_entry was not existing before, but we are + * creating it because subscriber is interested in notif + * for this entry. Create such an entry without data. Later + * When publisher would actually cate this entry, all registered + * subscriber should be notified + * */ + rt_entry = rt_add_or_update_rt_entry( + rt_table, key->dest, key->mask, 0, 0); + new_entry_created = true; + } + + memset(&nfce, 0, sizeof(notif_chain_elem_t)); + + assert(key_size <= MAX_NOTIF_KEY_SIZE); + + /* No need to keep keys as nfce;s are tied to + * routing table entry which contain keys*/ + //memcpy(nfce.key, (char *)key, key_size); + //nfce.key_size = key_size; + nfce.app_cb = app_cb; + nfce.subs_id = subs_id; + nfc_register_notif_chain(rt_entry->nfc, &nfce); + + /* Subscriber subscribes to already existing rt entry, + * immediately send notif to Subscriber with opcode + * NFC_ADD*/ + if (!new_entry_created) { + app_cb(rt_entry, sizeof(rt_entry_t), NFC_ADD, subs_id); + } +} diff --git a/NFC/rt.h b/NFC/rt.h new file mode 100644 index 0000000..19aba01 --- /dev/null +++ b/NFC/rt.h @@ -0,0 +1,122 @@ +/* + * ===================================================================================== + * + * Filename: rt.h + * + * Description: + * + * Version: 1.0 + * Created: 10/03/24 12:47:20 PM IST + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), + * Organization: + * + * ===================================================================================== + */ +#ifndef __RT__ +#define __RT__ + +#include +#include "notif.h" + +typedef struct rt_entry_keys_{ + + char dest[16]; + char mask; +} rt_entry_keys_t; + +typedef struct rt_entry_{ + + /* A Structure which represnets only the keys of the + * Routing Table.*/ + rt_entry_keys_t rt_entry_keys; + + char gw_ip[16]; + char oif[32]; + bool created; + struct rt_entry_ *prev; + struct rt_entry_ *next; + notif_chain_t *nfc; +} rt_entry_t; + +typedef struct rt_table_{ + + rt_entry_t *head; +} rt_table_t; + +void +rt_init_rt_table(rt_table_t *rt_table); + +rt_entry_t * +rt_add_or_update_rt_entry(rt_table_t *rt_table, + char *dest_ip, char mask, char *gw_ip, char *oif); + +bool +rt_delete_rt_entry(rt_table_t *rt_table, + char *dest_ip, char mask); + +bool +rt_update_rt_entry(rt_table_t *rt_table, + char *dest_ip, char mask, + char *new_gw_ip, char *new_oif); + +rt_entry_t * +rt_look_up_rt_entry(rt_table_t *rt_table, + char *dest, char mask); + +void +rt_clear_rt_table(rt_table_t *rt_table); + +void +rt_free_rt_table(rt_table_t *rt_table); + +void +rt_dump_rt_table(rt_table_t *rt_table); + +static inline void +rt_entry_remove(rt_table_t *rt_table, + rt_entry_t *rt_entry){ + + if(!rt_entry->prev){ + if(rt_entry->next){ + rt_entry->next->prev = 0; + rt_table->head = rt_entry->next; + rt_entry->next = 0; + return; + } + rt_table->head = 0; + return; + } + if(!rt_entry->next){ + rt_entry->prev->next = 0; + rt_entry->prev = 0; + return; + } + + rt_entry->prev->next = rt_entry->next; + rt_entry->next->prev = rt_entry->prev; + rt_entry->prev = 0; + rt_entry->next = 0; +} + +#define ITERTAE_RT_TABLE_BEGIN(rt_table_ptr, rt_entry_ptr) \ +{ \ + rt_entry_t *_next_rt_entry; \ + for((rt_entry_ptr) = (rt_table_ptr)->head; \ + (rt_entry_ptr); \ + (rt_entry_ptr) = _next_rt_entry) { \ + _next_rt_entry = (rt_entry_ptr)->next; + +#define ITERTAE_RT_TABLE_END(rt_table_ptr, rt_entry_ptr) }} + +void +rt_table_register_for_notification( + rt_table_t *rt_table, + rt_entry_keys_t *key, + size_t key_size, + nfc_app_cb app_cb, + uint32_t subs_id); + +#endif /* __RT__ */ diff --git a/NFC/rtm_publisher.c b/NFC/rtm_publisher.c new file mode 100644 index 0000000..787c5f3 --- /dev/null +++ b/NFC/rtm_publisher.c @@ -0,0 +1,128 @@ +/* + * ===================================================================================== + * + * Filename: rtm_publisher.c + * + * Description: + * + * Version: 1.0 + * Created: 10/03/24 02:01:50 PM IST + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), + * Organization: + * + * ===================================================================================== + */ +#include +#include +#include +#include "rt.h" + +extern void +create_subscriber_thread(uint32_t client_id); + +rt_table_t publisher_rt_table; + +rt_table_t * +publisher_get_rt_table() { + + return &publisher_rt_table; +} + +void +main_menu() { + + int choice; + while(1){ + printf("Publisher Menu\n"); + printf("1. Add/Update rt table entry\n"); + printf("2. Delete rt table entry\n"); + printf("3. Dump rt table\n"); + printf("Enter Choice :"); + choice = 0; + scanf("%d", &choice); + switch(choice){ + case 1: + { + char dest[16]; + char mask; + char oif[32]; + char gw[16]; + printf("Enter Destination :"); + scanf("%s", dest); + printf("Mask : "); + scanf("%d", &mask); + printf("Enter oif name :"); + scanf("%s", oif); + printf("Enter Gateway IP :"); + scanf("%s", gw); + rt_add_or_update_rt_entry(publisher_get_rt_table(), + dest, mask, gw, oif); + } + break; + case 2: + /* Implement your self */ + break; + case 3: + rt_dump_rt_table(publisher_get_rt_table()); + break; + default: ; + } + } +} + +void * +publisher_thread_fn(void *arg) { + + /* Add some default entries in rt table */ + rt_add_or_update_rt_entry( + publisher_get_rt_table(), + "122.1.1.1", 32, "10.1.1.1", "eth1"); + + rt_add_or_update_rt_entry( + publisher_get_rt_table(), + "122.1.1.2", 32, "10.1.1.2", "eth1"); + + rt_add_or_update_rt_entry( + publisher_get_rt_table(), + "122.1.1.3", 32, "10.1.1.3", "eth1"); + + rt_dump_rt_table(publisher_get_rt_table()); + main_menu(); +} + +void +create_publisher_thread() { + + pthread_attr_t attr; + pthread_t pub_thread; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + + pthread_create(&pub_thread, &attr, + publisher_thread_fn, + (void *)0); +} + +int +main(int argc, char **argv) { + + rt_init_rt_table(&publisher_rt_table); + /* Create Subscriber threads */ + create_subscriber_thread(1); + sleep(1); + + create_subscriber_thread(2); + sleep(1); + + create_subscriber_thread(3); + sleep(1); + /* Create publisher thread*/ + create_publisher_thread(); + printf("Publisher thread created\n"); + pthread_exit(0); + return 0; +} diff --git a/NFC/threaded_subsciber.c b/NFC/threaded_subsciber.c new file mode 100644 index 0000000..67ac2d4 --- /dev/null +++ b/NFC/threaded_subsciber.c @@ -0,0 +1,93 @@ +/* + * ===================================================================================== + * + * Filename: threaded_subsciber.c + * + * Description: + * + * Version: 1.0 + * Created: 10/03/24 02:45:48 PM IST + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), + * Organization: + * + * ===================================================================================== + */ +#include +#include +#include +#include /*for pid_t*/ +#include /*for getpid()*/ +#include +#include +#include "notif.h" +#include "rt.h" + +void +create_subscriber_thread(); + +extern rt_table_t * +publisher_get_rt_table(); + +static void +test_cb(void *arg, size_t arg_size, + nfc_op_t nfc_op_code, + uint32_t client_id) { + + rt_entry_t *rt_entry; + printf("%s() client : %u, Notified with opcode %s\n", + __FUNCTION__, client_id, nfc_get_str_op_code(nfc_op_code)); + + rt_entry = (rt_entry_t *) arg; + + printf("%-20s %-4d %-20s %s\n", + rt_entry->rt_entry_keys.dest, + rt_entry->rt_entry_keys.mask, + rt_entry->gw_ip, + rt_entry->oif); + printf("\n"); +} + +static void * +subscriber_thread_fn(void *arg){ + + rt_entry_keys_t rt_entry_keys; + + /* register for Notif 122.1.1.1/32 */ + memset(&rt_entry_keys, 0, sizeof(rt_entry_keys_t)); + strncpy(rt_entry_keys.dest, "122.1.1.1", 16); + rt_entry_keys.mask = 32; + rt_table_register_for_notification(publisher_get_rt_table(), &rt_entry_keys, sizeof(rt_entry_keys_t), test_cb, *((uint32_t *)arg)); + + /* register for Notif 122.1.1.2/32 */ + memset(&rt_entry_keys, 0, sizeof(rt_entry_keys_t)); + strncpy(rt_entry_keys.dest, "122.1.1.5", 16); + rt_entry_keys.mask = 32; + rt_table_register_for_notification(publisher_get_rt_table(), &rt_entry_keys, sizeof(rt_entry_keys_t), test_cb, *((uint32_t *)arg)); + + /* register for Notif 122.1.1.3/32 */ + memset(&rt_entry_keys, 0, sizeof(rt_entry_keys_t)); + strncpy(rt_entry_keys.dest, "122.1.1.6", 16); + rt_entry_keys.mask = 32; + rt_table_register_for_notification(publisher_get_rt_table(), &rt_entry_keys, sizeof(rt_entry_keys_t), test_cb, *((uint32_t *)arg)); + + pause(); + return NULL; +} + +void +create_subscriber_thread(uint32_t client_id){ + + pthread_attr_t attr; + pthread_t subs_thread; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + + pthread_create(&subs_thread, &attr, + subscriber_thread_fn, + (void *)&client_id); + printf("Subscriber %u created\n", client_id); +} diff --git a/ThreadCancellation_async/master_slave/.vs/master_slave/v17/Browse.VC.db b/ThreadCancellation_async/master_slave/.vs/master_slave/v17/Browse.VC.db index 8c10f67faca3bb5eabaac54ec21e79c8666fe087..4668bd2187691eda7c75fd4f5ffb8ad517c99892 100644 GIT binary patch delta 2778 zcmZA1e{2)y83%CR`Mu;ggKMA9@y)Muc4%ORQg8_Ymn^~g0r?#qJ9Jq~h)bXilph(8 z39Xr$u9HF%V9ro_Y;9>+6B4#DWsSO{f23m?XlT>G*~G}E{gHL6mabaMRHnJAs_yH% zH%Q$dA3yK=yzkk5p7*u;`~Ph3hv{EbaQn|)tMK~w+1L2Gj_%vvdEmtU!^b-hAKkZk zV`)iA!Ao5;A5{#8*1YGjui?MAf&2Ua<+_fX;QluAMrR}>)RShf_uOA+LNnPHjt9B= znM1FSjuD%UOBzCqTfuA6FX^1;HQ~|1MuiG?@}cLH^b<+<1f_2~{;}Mx7gurX{2odE zkG7jUCH>KH!1Hg%@1+ksdpz}?Ul$JPd#bpthC5|H#2JAa?wLIO#qFG;Ye~+_O<3b& zx$%fK{$~UCnK|O7tT1HdFLZDoBih8xvgbc-M2pS~sop-qf=6r1z?Kn#Oz! zzIm$pGHScptrzoTou9g>7)*Ij`tGS=+O5WYSsI~X+8%W2dw61&IxQP1FX`b!`F5Ts zgiNwH!QwcJBl0&yzp znIfV&X(SM%;XstO2O=o>ei0eZoo=q=Qk1NjpF2s287EjAXK_UTa0@wDV6IKE+z^YG zjU!R=1Ae`^c!MRcvv`TcO)TDK@s_^1jI7KvpUD_|%E+5`YcgjPY$G3B%U857lt(VJvkDL%WAMrb_HXy7>sHg z<&d^kX%0q|?RvXi*y~gdNmrCnXpju5L(#5y*wHR>J{qE?wmn`PoRVwQ<$mWjMs zCSsFb=Oe3mv1Kx|QQ-A!UXr&_Y-R6dmWWMeiFnv75%E>Fo@6nhi>0ht*xhDCN`*Oz zRTvZM?Yujtw^R#T*Se#0F>uu#L5+)^n4ERTwOHZRLX~FeLg1b|tSr!Zxj%4I9@EFG zg>UA`=e4LZuZL=cwN53Yg}pYdUCC;3Z&;7l2ycF&IgJmRGs&7W!J0G9nlpksP}lmP zIa91TL##P2)|~6CIhWC#sl-xU6S)>81U_oke2ewyhII|dB-WS0PWkPo5}*|lu$NBP>1xt*?y`FhXOdshe47u62+`)aS2)&8ZutKC(9 zrkZ+RwGo(FJL*to_#YcJN`> zm7vdcG3ZcR)$MvusAQdSl9ObP_gu+!@Y5B>MVGYPzT81@rEIe)oMEl;wnrK#Nr~|I zVVy#z&ii1Q7azCsgUHt_OM7^6>nGOuH1Z9er9He@mbJ!bkZ&}mRjHoeVr9-E)3mh6 zi{<99uNT?or477TVP$8LZP6oC>T+0#caYd=T%gi_d6v0}Ok5w+q+*YR{{viA>q`%Q zjD=SHt|o0*Bl7rhTInGh(rs+Z=NKp1_&&yofek?k9IzZ#fD;}97q~$N4=CV;0`P$f zUjjc+2tXld5QGpE!Af`-ieVM3hA%@H*1%eL1lGZ$upTx*1RjHpPy(Bv6gI;ah{EHr z70Tc%P!1Ka4PyF+VC5Zqo3qBq4^^Jwsq?OOCm3=5#yRVpcD~_!**WO!a~^S~oC&AS zU2Lj0LMeN~@q#1WX5Nup-^OTacu?N?!wKj$%C~*vSF!&ACi#nW delta 2653 zcmZ{je^3mApT1E5gKD85YPmzKWOwE zr;RQBF-0ztmOAuJ#VEES7{?5Trfa8TnrU_FKaJ3tRFml+nwh9E)5JFE^qfv6eRerI z6Qj5DnP>NT-@Uo#x$oQG|DLBGO#Pu+eDc6s)p}^1r!d&FW8j+u6Bo$Hrw# z%SuXee)PojC)F=T3f~QQ3Z*Y^5HH{1^=#iIUYh=OXEZ_^$y!}MaCJH|o&5gJu-G`g z^~lH=QGO_{uxU)plvFkwc!fTcyINz^Lp~1d3xs*JPAtx{Hjt;3zxg%?{^|Rx@)6%% zCsr8R`nz9tc9&Z=JdHy2^0wH7;X3d@E49ucC&5JN~-rXiH;x|`` zpOcJiJl<{<7tw_JZ`@{K#jaQ*{@%MFu=1;~Pr}ssPgddek~T4CLEz6{-7^kT=Tpv} zfi^Lw=OzUG&Yv-C|GiCoEuG-!>s((W-al}&I)(wdxE!&0@iCZ2a|laL@EsSv%6nTe^aX6rIS7>VyqJ)PGwL7 zIs^4XFG6ML+x%9L^cqI5`*c3dBS~-*Om?5o*?k6iS&Fg(_oYdw^U_3W+wqi^vbirE zhdS%WcsU~xIqY|zhV3p!raUsjJBuf{5hfqHk!>0wwIXlIBMURkJ-JC{n0;oi*~R?x6=H*(q3hhydl#u$sanRb%cJZwTA{moPA=|@jps5k)uY#&8iV@QvKnWDu>Ih zrB+cm%C~rEw^uo(98*T^_dK*tG(+FJ_vLi3m)fHW{R_>{zAWSm34!XkVZz`SRKtxb z41PufxJefVKc%X@-%rut|B-gdISU*dy{X(S? zS*yZBoLsdFRBA|NM*Jl*rfm}Z@gZ^qD#!Pe!_F7PUnH-%njnX?5v&iAQK%f>M-KA1 zMkDFLckwe0ttTV)VU70qNOpm=7Xv{*C#G-m-j|ay;pJC4J=8w+ApI_lsQu1_Qyq#4 zry3L!P6JTP8)7y+Ov}Z5^<{Vb+?W_cHzxFkdcmFT>)I7T<_$rTFKaXI&Z`qMOQ}?@ zCEbHF26Yb35vVi9Zc3<|5_(9VJ0qh|XZ;|T%g|S9=tt~m8J$&9A!Br&M23q8`3aoWjGvC@kUpI~9y{|9z zv-^Zi9wXjB3$qrj%)^A7t zrF1L)-}z7Zj~Xq;qr5LtQf&WRR8-M4HsAYlO8jr8ebldHc!<#HX3un8CBtK#dIsV`m&JZd@!XelPyW+Mn?)slOLpkRU!mmt*ZoB@c z@a-u>St%`N_X$1;XOWPba~p@Sv5GBn+&AG~pL1V=Tg?tQ?pe6kc$6tUK5N7=;xMk- zhneyp$!DE}gA+=~7$38g{6LO`^NHCFdz^*+L`r*&U$T@Xg~bvMC?TU5*F5J|N;^59 z0HX{S+Yu)1)qy2p1^7S)$OKv7KHvx0Km`Gy0UhLkATYoJ5CROCAQxC53?d*8EClz1 ze6R>S0KNtaKp`js4}xOw5LgVBfGBtvECnT?6qJEwU^yrUkAMnL3BC@hKsBfVF}@^R z`;MnE>jOJ2QadC$L(r08f3UcAOO|B4W4Bb*{#eWmM}T#_& ztaAfZHMO7))Pn}_C};#LKoeLAR)N)E4Oj~v1K$A6paryoHt;xT2j2uwfOX(WupT@G zHh>QBH0T6f;2F>jdca1o2|Np)1HE7~*aE%V!Z diff --git a/ThreadCancellation_async/master_slave/.vs/master_slave/v17/Browse.VC.db-wal b/ThreadCancellation_async/master_slave/.vs/master_slave/v17/Browse.VC.db-wal index 8bfeba64ec68a0df2aa7557684a90607d184ea38..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 443696 zcmeFad3Y4X{_j8OsZKSSt!L}$>7JgBVj!YmM3A7MVGpw3CHt# z*JpaRny#+uu6KW`%e3Sfj`qh@ha=Sie;0Lpai;dJ_qr$K`CI$UsCoPqhzZsME%6=u zM!!GqeA7&i`L#oe?{=CWnS0IKO~a(|Gx7K1yRB^#e~B7M)Ig#J5;c&hfkX`?Y9LVq zi5f`MK%xc`HIS%*L=7ZrAW;K}8c5VYq6QK*kf?z~4J2wHQ3Ht@NYp^01`;)psDb~p zH4vJf>`aS{A9jEK&6ZxT5^4Mdzi1 zhmRRGDu46@c;g52M~~0$(d&lWZs~o??Kk(n<>o%Oj~iR@(WH~|F=NKl^O7hgv0+{h1NIBho}?&x2?q&P`h6} z{L>X{?n^P79FjTGVIDG}fA)7xyjr3L5;c&hfkX`?Y9LVqi5f`M zK%xc`HIS%*L=7ZrAW;K}8c5VYq6QK*kf?z~4J2wHQ3Ht@NYp^01`;)psDVTcBx>M) zehmbjmkR%8LjbpdW2WDkCj9#(yyHIuNuT`3)4;uuRR13_c&Vh1{LZ#Xf3hqj2b`BC z{n@S{O3rYSWkewCu|F9FoGz!HgdPDaH-P-7&*gBqtQv0d1tfj+iP>;X=lfGqW+Y{k zD;?%(_Y(8N;6Ke5JPSNGdb)Tnj#v3+8lM>ljBUo#{x3bpd}rLv?k{9T->q-dAJeC5 zJ>~ZU@AzK##=WiNEi zFK|;JGtfHVjrLXNMXyx9SC2*uwXZd&f2aQ!|9k!o{xbh$|NZ`f{%-!Z{($^@WL@Ol z$md#nO;ugWiAb@2o!scD2sG#g`XFtkQm5?FHYv|4OO+{+;gOpoUDXMZOCmn4Mw_lZ zV3<*)w{|&*E`O8k2l-B!+Vwc z5qCc68$M<33x5#a8-6~#B3u%FFnmY2NBHt^BrJr!3Dt+*2)!73A~Y*BMn6fe3}v|X zxNdV@?`ju(iB2-knva_^%u&ggw%Sh*rbJT+{W;hv-q96yImnZuO4I0i>1k=cR3zm| zH%M1Y7fEh~^cpHBpG!WOd?VvSm9-vVw%XZ5P~P7re_Z*wrq$$1b?TE_k+OQq*#*D03!btIHrfThvJ0NH3!bnGerXr{!Y+8+F8H}!u)!|a&n~#z zF4)>Gc-k)bnO(4hU9i1f@R(ijs9o@|UGSf-uN>F^XE$-kE?5V_cK^BMdv>q6)Gk|z(Z+Aip_3#QlwTiFE<*aa8b1sB)_x7!7i?Sk*R{f_W|R^5KPE$0V*{Ogu) z+HF~87ktSsxYY_uQp@|Z;Q{&9F8B=({`){8iLhYHlleeGAlv@>Mgpkdke&7 z_ZEoF?ky0TomL<=zq>$ees_V`{O$s=`P~I#^J@yk=GPR+O1tlF(+mY-b7T;R&5=PM z|FnBeo5Qa_Y!1HyvFW4)VslIu$SJ!wvN>7{nT zxpu)hcEQ_Ys){sCLu{Y*wRJwGkxsJ{~TnU zeoKgdB&W!p{+~g|Uq6zQoVN@9VHf<}F8G^W@SI)nSG(XZcEM)5;Lmo!pX`D^+68~G z3!b$Les352&Mw$w7qqE)fgJklmIA4>3)+mm1@aHOE%)06-?R%pXBVur3)-|zfo!nb z(x$};gtd-8?{$LRW*4+MlM={$yDi_c3oft=+MHqt z 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 QpRE`0=GPbXJ=Y8Pe-b0?&;S4c