int main(int argc, char* argv[]){ struct hashtable *a; struct abc **tb; struct abc *abc; int i; a = hashTableCreate(10); tb = (struct abc**)getHashTable(a); for(i=0;i<10;i++){ if(tb[i] == NULL) printf("%d:null\n",i); } for(i=0;i<5;i++){ abc=malloc(sizeof(struct abc)); abc->a=i+1; abc->b=i+2; tb[i]=abc; } for(i=0;i<10;i++){ if(tb[i] == NULL) printf("%d:null\n",i); else printf("%d:a:%d,b:%d\n",i, tb[i]->a, tb[i]->b); } return 1; }
int sem_imanager_req(){ int i, j; void *buf; unsigned int offset; unsigned int queue_count; unsigned int src_node; unsigned int seq_number; struct sem *find; struct req_node_info node; char *sem_name; if(g_group.coordinator.sem_id == g_group.node_id) return 1; //max 33 sem buf = mem_malloc(SEM_ISEM_SIZE); ((struct request_header*)buf)->msg_type = MSG_ISEM_MANAGER; sendRecv(g_group.coordinator.sem_id, buf, sizeof(struct request_header), buf, SEM_ISEM_SIZE); if(g_group.sem_table == NULL){ g_group.sem_table = hashTableCreate(SEM_HASH_SIZE); } src_node = ((struct isem_reply*)buf)->req.src_node; seq_number = ((struct isem_reply*)buf)->req.src_seq_number; offset = sizeof(struct isem_reply); for(i=0; i<((struct isem_reply*)buf)->sem_num; i++){ //sem name sem_name = malloc(((struct sem_info*)(buf+offset))->name_len); memcpy(sem_name, buf+offset+sizeof(struct sem_info), ((struct sem_info*)(buf+offset))->name_len); sem_name[((struct sem_info*)(buf+offset))->name_len] = 0; //search sem find = hashTableSearch(g_group.sem_table, ((struct sem_info*)(buf+offset))->hash_id, sem_name); if(find == NULL){ //create new find = createNewSem(((struct sem_info*)(buf+offset))->hash_id, sem_name, ((struct sem_info*)(buf+offset))->value); hashTableInsert(g_group.sem_table, (struct hashheader*)find); }else{ if(find->queue->use!=0){ while(queuePop(find->queue)!=NULL); } } //copy queue info queue_count = ((struct sem_info*)(buf+offset))->queue_count; offset += sizeof(struct sem_info)+strlen(sem_name); for(j=0; j< queue_count;j++){ node.id = ((struct req_node_info*)(buf+offset))->id; node.seq_number = ((struct req_node_info*)(buf+offset))->seq_number; queuePush(find->queue, (void*)&node); offset += sizeof(struct req_node_info); } } g_group.coordinator.sem_id = g_group.node_id; ((struct request_header*)buf)->msg_type = MSG_ISEM_READY; ((struct request_header*)buf)->seq_number = seq_number; sendTo(src_node ,buf, sizeof(struct request_header)); mem_free(buf); return 1; }
int main() { hashTable* nein = hashTableCreate(TABLE_SIZE); int count = 0; int i = 0; int percents[] = { 50, 75, 90, 99 }; //char *string[] = { "hello", "hellod", "hellod" }; srand((unsigned int)time(NULL)); for (i = 0; i < 1000; i++) { int len = (rand() % 15) + 3; char *generated_string = generated_string = generateString(len); int index = BKDRHash(generated_string, len); addIntoList(nein->data, index, generated_string); } return 0; }
int main_imanager_req(){ int i, j; int index; void *buf; unsigned int offset; unsigned int users_count; unsigned int src_node; unsigned int seq_number; unsigned int node_id; struct sm_header *find; char *sm_name; if(g_group.coordinator.main_id == g_group.node_id) return 1; //max 33 mutex buf = mem_malloc(MAIN_IMAIN_SIZE); ((struct request_header*)buf)->msg_type = MSG_IMAIN_MANAGER; sendRecv(g_group.coordinator.main_id, buf, sizeof(struct request_header), buf, MSG_IMAIN_MANAGER); if(g_group.sm_table == NULL){ g_group.sm_table = hashTableCreate(SM_HASH_SIZE); } src_node = ((struct imain_reply*)buf)->req.src_node; seq_number = ((struct imain_reply*)buf)->req.src_seq_number; offset = sizeof(struct imain_reply); //copy share memory data for(i=0; i<((struct imain_reply*)buf)->sm_num; i++){ //mutex name sm_name = malloc(((struct main_sm_info*)(buf+offset))->name_len); memcpy(sm_name, buf+offset+sizeof(struct main_sm_info), ((struct main_sm_info*)(buf+offset))->name_len); sm_name[((struct main_sm_info*)(buf+offset))->name_len] = 0; printf("%s", sm_name); //search mutex find = hashTableSearch(g_group.sm_table, ((struct main_sm_info*)(buf+offset))->hash_id, sm_name); if(find == NULL){ //create new find = createSM(((struct main_sm_info*)(buf+offset))->hash_id, sm_name, ((struct main_sm_info*)(buf+offset))->home_node, ((struct main_sm_info*)(buf+offset))->size); hashTableInsert(g_group.sm_table, (struct hashheader*)find); } //copy find->count = ((struct main_sm_info*)(buf+offset))->count; //copy queue info users_count = ((struct main_sm_info*)(buf+offset))->users_count; offset += sizeof(struct main_sm_info)+strlen(sm_name); if(find->users == NULL) find->users = tableCreate(MAX_NODE_NUM, sizeof(unsigned int)); for(j=0; j< users_count; j++){ node_id = *((unsigned int*)(buf+offset)); if(searchNode(find->users, src_node)==-1){ index = tableGetEmpty(find->users); if(index == -1) return -1; tableAdd(find->users, (void*)&src_node, index); } offset += sizeof(unsigned int); } } g_group.coordinator.main_id = g_group.node_id; ((struct request_header*)buf)->msg_type = MSG_IMAIN_READY; ((struct request_header*)buf)->seq_number = seq_number; sendTo(src_node ,buf, sizeof(struct request_header)); mem_free(buf); return 1; }