#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);