From a441b302c2c11c291df60fe642ec0d51646218dd Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Wed, 15 Mar 2017 10:20:55 +0100 Subject: Start with implementing online status etc for broadcasting --- user_data.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 user_data.c (limited to 'user_data.c') diff --git a/user_data.c b/user_data.c new file mode 100644 index 0000000..5bd4a6d --- /dev/null +++ b/user_data.c @@ -0,0 +1,54 @@ +#include "user_data.h" + + +struct user_data{ + i64 userid; + + int *fds; + i64 fds_cap,fds_len; +}; + +struct hash_item{ + struct user_data data; + struct hash_item *next; +}; + +#define USER_HASH_SIZE (16) +static struct hash_item *user_hash[USER_HASH_SIZE]; + + +static struct hash_item* find_userdata(i64 userid){ + struct hash_item *item=user_hash[userid%USER_HASH_SIZE]; + while(item&&item->data.userid!=userid)item=item->next; + return item; +} + +void userdata_register(i64 userid,int fd){ + struct hash_item *item=find_userdata(userid); + if(item){ + for(i64 i=0;idata.fds_len;i++){ + if(item->data.fds[i]==fd){ + debug("userdata_register(%lld, %d) while pair already existed",userid,fd); + return; + } + } + if(item->data.fds_len==item->data.fds_cap){ + item->data.fds_cap*=2; + item->data.fds=realloc(item->data.fds,item->data.fds_cap,int); + } + item->data.fds[item->data.fds_len++]=fd; + } else { + item=malloc(1,struct hash_item); + item->data.userid=userid; + item->data.fds_cap=2; + item->data.fds_len=1; + item->data.fds=malloc(item->data.fds_cap,int); + item->data.fds[0]=fd; + item->next=user_hash[userid%USER_HASH_SIZE]; + user_hash[userid%USER_HASH_SIZE]=item; + } +} + +void userdata_unregister(i64 userid,int fd); + +bool userdata_online(i64 userid); -- cgit v1.2.3-70-g09d2