#include #include #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){ die("userdata_register(%lld, %d) while pair already existed",userid,fd); } } 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){ struct hash_item *item=find_userdata(userid); assert(item); i64 i; for(i=0;idata.fds_len;i++){ if(item->data.fds[i]==fd)break; } if(i==item->data.fds_len){ die("userdata_unregister(%lld, %d) while nonexistent",userid,fd); } memmove(item->data.fds+i,item->data.fds+i+1,item->data.fds_len-i-1); item->data.fds_len--; } const int* userdata_online(i64 userid,i64 *nfds){ struct hash_item *item=find_userdata(userid); if(!item){ *nfds=0; return NULL; } assert(item->data.fds_len!=0); *nfds=item->data.fds_len; return item->data.fds; }