aboutsummaryrefslogtreecommitdiff
path: root/user_data.c
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-03-15 10:20:55 +0100
committertomsmeding <tom.smeding@gmail.com>2017-03-15 10:20:55 +0100
commita441b302c2c11c291df60fe642ec0d51646218dd (patch)
tree22200cb885c3b7e38871f3827490700606c025c2 /user_data.c
parentf1634688d62f2a6115739b65a311ab2b1cf79764 (diff)
Start with implementing online status etc for broadcasting
Diffstat (limited to 'user_data.c')
-rw-r--r--user_data.c54
1 files changed, 54 insertions, 0 deletions
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;i<item->data.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);