diff options
Diffstat (limited to 'user_data.c')
-rw-r--r-- | user_data.c | 54 |
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); |