From edb640b4920ea0f52bbe930cd1aff28bb4c33ef1 Mon Sep 17 00:00:00 2001 From: Hizenberg Date: Sun, 10 Mar 2024 17:15:47 +0530 Subject: [PATCH] Publisher and Subscriber --- compile.sh | 7 ++ glthread/.glthread.h.un~ | Bin 0 -> 723 bytes glthread/glthread.h | 2 +- glthread/glthread.h~ | 95 +++++++++++++++++ main.exe | Bin 0 -> 37208 bytes notif.c | 42 ++++---- notif.h | 11 +- rt.c | 217 +++++++++++++++++++++++++++++++++++++++ rt.h | 122 ++++++++++++++++++++++ rtm_publisher.c | 128 +++++++++++++++++++++++ threaded_subsciber.c | 93 +++++++++++++++++ 11 files changed, 687 insertions(+), 30 deletions(-) create mode 100644 compile.sh create mode 100644 glthread/.glthread.h.un~ create mode 100644 glthread/glthread.h~ create mode 100755 main.exe create mode 100644 rt.c create mode 100644 rt.h create mode 100644 rtm_publisher.c create mode 100644 threaded_subsciber.c diff --git a/compile.sh b/compile.sh new file mode 100644 index 0000000..263201a --- /dev/null +++ b/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/glthread/.glthread.h.un~ b/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/glthread/glthread.h b/glthread/glthread.h index e221b99..1e85273 100644 --- a/glthread/glthread.h +++ b/glthread/glthread.h @@ -44,7 +44,7 @@ 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) \ +#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)); \ diff --git a/glthread/glthread.h~ b/glthread/glthread.h~ new file mode 100644 index 0000000..e221b99 --- /dev/null +++ b/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/main.exe b/main.exe new file mode 100755 index 0000000000000000000000000000000000000000..c0cf06b667f20c0163ad8e1b1eba12d390e25de5 GIT binary patch literal 37208 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 zFTYLEUtnotif_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, @@ -58,39 +72,21 @@ nfc_invoke_notif_chain(notif_chain_t *nfc, assert(key_size <= MAX_NOTIF_KEY_SIZE); - char *nfc_op_s = nfc_get_str_op_code(nfc_op_code); - ITERATE_GLTHREAD_BEGIN(&nfc->notif_chain_head, curr){ nfce = glthread_glue_to_notif_chain_elem(curr); - if(!(key && key_size && + if(!(key && key_size && nfce->is_key_set && (key_size == nfce->key_size))){ - - nfce->app_cb(arg, arg_size, nfc_op_s, nfce->subs_id); + + 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_s, nfce->subs_id); + nfce->app_cb(arg, arg_size, nfc_op_code, nfce->subs_id); } } }ITERATE_GLTHREAD_END(&nfc->notif_chain_head, curr); } - -void -nfc_delete_all_nfce(notif_chain_t *nfc){ - - glthread *curr; - notif_chain_elem_t *nfc_e; - - ITERATE_GLTHREAD_BEGIN(&nfc->notif_chain_head,curr){ - - nfc_e = glthread_glue_to_notif_chain_elem(curr); - remove_glthread(&nfc_e->glue); - free(nfc_e); - }ITERATE_GLTHREAD_END(&nfc->notif_chain_head,curr); - - -} diff --git a/notif.h b/notif.h index 0910e32..c9f9ad8 100644 --- a/notif.h +++ b/notif.h @@ -15,14 +15,13 @@ * * ===================================================================================== */ - #ifndef __NOTIF_CHAIN_ #define __NOTIF_CHAIN_ #include /* for size_t */ -#include "utils.h" -#include "gluethread/glthread.h" - +#include "glthread/glthread.h" +#include +#include #define MAX_NOTIF_KEY_SIZE 64 typedef enum{ @@ -57,14 +56,14 @@ nfc_get_str_op_code(nfc_op_t nfc_op_code) { } -typedef void (*nfc_app_cb)(void *, size_t, char *, uint32_t); +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_t is_key_set; + bool is_key_set; nfc_app_cb app_cb; glthread_t glue; } notif_chain_elem_t; diff --git a/rt.c b/rt.c new file mode 100644 index 0000000..d37b10a --- /dev/null +++ b/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/rt.h b/rt.h new file mode 100644 index 0000000..19aba01 --- /dev/null +++ b/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/rtm_publisher.c b/rtm_publisher.c new file mode 100644 index 0000000..787c5f3 --- /dev/null +++ b/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/threaded_subsciber.c b/threaded_subsciber.c new file mode 100644 index 0000000..67ac2d4 --- /dev/null +++ b/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); +}