void * removeslave (void *arg, struct svc_req *request) { static caddr_t reply; struct slave *slave; slave = (struct slave *) arg; list_del (&master -> slaves, (void *) slave, (cmpfct_t) slave_compare); master -> slave_number--; #ifdef DEBUG printf ("MAST [exec] removeslave\n"); master_print (master); #endif reply = NULL; return (void *) &reply; }
void * recordslave (void *arg, struct svc_req *request) { static caddr_t reply; struct slave *slave; slave = (struct slave *) arg; list_add (&master -> slaves, (void *) slave, (cpyfct_t) slave_copy); master -> slave_number++; #ifdef DEBUG printf ("MAST [exec] recordslave\n"); master_print (master); #endif reply = NULL; return (void *) &reply; }
void whoismaster_broadcast (void) { int err; struct master master; #ifdef DEBUG printf ("SLAV [call] whoismaster\n"); #endif err = clnt_broadcast (LOSH, MASTER, WHOISMASTER, (xdrproc_t) xdr_void, (char *) NULL, (xdrproc_t) xdr_master, (char *) &master, iammaster); if (err) { fprintf (stderr, "clnt_broadcast: Not replied.\n"); exit (EXIT_FAILURE); } #ifdef DEBUG printf ("SLAV [resp] whoismaster\n"); master_print (&master); #endif }
void whoisslave_broadcast () { int err; struct slave *temp; struct slave slave; #ifdef DEBUG printf ("MAST [call] whoisslave\n"); #endif _slave_count = 0; /* Unset all known loads: */ temp = NULL; while (TRUE) { temp = (struct slave *) list_next (&master -> slaves, (temp == NULL)); if (temp == NULL) break; temp -> load = -1; } err = clnt_broadcast (LOSH, SLAVE, WHOISSLAVE, (xdrproc_t) xdr_void, (char *) NULL, (xdrproc_t) xdr_slave, (char *) &slave, iamslave); if (err) { temp = NULL; while (TRUE) { temp = (struct slave *) list_next (&master -> slaves, (temp == NULL)); if (temp == NULL) break; if (temp -> load == -1) { #ifdef DEBUG printf ("Breakdown %s\n", temp -> addr); #endif deletetask_broadcast (temp); list_del (&master -> slaves, (void *) temp, (cmpfct_t) task_compare); master -> slave_number--; } } #ifdef DEBUG master_print (master); #endif } #ifdef DEBUG printf ("MAST [resp] whoisslave\n"); temp = NULL; while (TRUE) { temp = (struct slave *) list_next (&master -> slaves, (temp == NULL)); if (temp == NULL) break; slave_print (temp); } #endif }
static void Read_message() { static char mess[SPREAD_MESS_LEN]; char sender[MAX_GROUP_NAME]; char target_groups[MAX_MEMBERS][MAX_GROUP_NAME]; membership_info memb_info; vs_set_info vssets[MAX_VSSETS]; unsigned int my_vsset_index; int num_vs_sets; char members[MAX_MEMBERS][MAX_GROUP_NAME]; int num_groups; int service_type; int16 mess_type; int endian_mismatch; int i,j; int ret; service_type = 0; ret = SP_receive( Mbox, &service_type, sender, 100, &num_groups, target_groups, &mess_type, &endian_mismatch, sizeof(mess), mess ); if( ret < 0 ) { if ( (ret == GROUPS_TOO_SHORT) || (ret == BUFFER_TOO_SHORT) ) { service_type = DROP_RECV; printf("\n========Buffers or Groups too Short=======\n"); ret = SP_receive( Mbox, &service_type, sender, MAX_MEMBERS, &num_groups, target_groups, &mess_type, &endian_mismatch, sizeof(mess), mess ); } } if (ret < 0 ) { if( ! To_exit ) { SP_error( ret ); printf("\n============================\n"); printf("\nBye.\n"); } exit( 0 ); } if( Is_regular_mess( service_type ) ) { //printf("message from %s, of type %d, (endian %d) to %d groups \n(%d bytes): %s\n", sender, mess_type, endian_mismatch, num_groups, ret, mess ); typecheck* type = (typecheck*)mess; if (type->type == TYPE_JOIN_CHATROOM) { join_chatroom* dat = (join_chatroom*)mess; ret = add_user(dat->u_id,dat->sp_id,dat->chatroom); } else if (type->type == TYPE_LEAVE_CHATROOM) { leave_chatroom* dat = (leave_chatroom*)mess; rm_user(dat->sp_id); } else if (type->type == TYPE_SEND_MSG) { message* dat = (message*)mess; if (strlen(chatroom) == 0) add_room(chatroom); lamport* ts = malloc(sizeof(lamport)); ts->server_id = dat->timestamp.server_id; ts->index = dat->timestamp.index; printf("[%d,%d]\n",ts->server_id,ts->index); add_message(ts, dat->u_id, dat->chatroom, dat->mess); } else if (type->type == TYPE_LIKE_MSG) { like* dat = (like*)mess; lamport* lts = malloc(sizeof(lamport)); lamport* mts = malloc(sizeof(lamport)); lts->server_id = dat->timestamp.server_id; lts->index = dat->timestamp.index; mts->server_id = dat->timestamp.server_id; mts->index = dat->timestamp.index; ret = add_like(dat->like_state, lts, dat->u_id, chatroom, mts); printf("~~~~~~~~ %d:[%d,%d | %d,%d] %d %s %s \n",ret, lts->server_id,lts->index,mts->server_id,mts->index,dat->like_state,dat->u_id,chatroom); } master_print(); }else if( Is_membership_mess( service_type ) ) { ret = SP_get_memb_info( mess, service_type, &memb_info ); if (ret < 0) { printf("BUG: membership message does not have valid body\n"); SP_error( ret ); exit( 1 ); } if ( Is_reg_memb_mess( service_type ) ) { printf("Received REGULAR membership for group %s with %d members, where I am member %d:\n", sender, num_groups, mess_type ); for( i=0; i < num_groups; i++ ) printf("\t%s\n", &target_groups[i][0] ); printf("grp id is %d %d %d\n",memb_info.gid.id[0], memb_info.gid.id[1], memb_info.gid.id[2] ); if( Is_caused_join_mess( service_type ) ) { printf("Due to the JOIN of %s\n", memb_info.changed_member ); }else if( Is_caused_leave_mess( service_type ) ){ printf("Due to the LEAVE of %s\n", memb_info.changed_member ); }else if( Is_caused_disconnect_mess( service_type ) ){ printf("Due to the DISCONNECT of %s\n", memb_info.changed_member ); }else if( Is_caused_network_mess( service_type ) ){ printf("Due to NETWORK change with %u VS sets\n", memb_info.num_vs_sets); num_vs_sets = SP_get_vs_sets_info( mess, &vssets[0], MAX_VSSETS, &my_vsset_index ); if (num_vs_sets < 0) { printf("BUG: membership message has more then %d vs sets. Recompile with larger MAX_VSSETS\n", MAX_VSSETS); SP_error( num_vs_sets ); exit( 1 ); } for( i = 0; i < num_vs_sets; i++ ) { printf("%s VS set %d has %u members:\n", (i == my_vsset_index) ? ("LOCAL") : ("OTHER"), i, vssets[i].num_members ); ret = SP_get_vs_set_members(mess, &vssets[i], members, MAX_MEMBERS); if (ret < 0) { printf("VS Set has more then %d members. Recompile with larger MAX_MEMBERS\n", MAX_MEMBERS); SP_error( ret ); exit( 1 ); } for( j = 0; j < vssets[i].num_members; j++ ) printf("\t%s\n", members[j] ); } } }else if( Is_transition_mess( service_type ) ) { printf("received TRANSITIONAL membership for group %s\n", sender ); }else if( Is_caused_leave_mess( service_type ) ){ printf("received membership message that left group %s\n", sender ); }else printf("received incorrecty membership message of type 0x%x\n", service_type ); } else if ( Is_reject_mess( service_type ) ) { printf("REJECTED message from %s, of servicetype 0x%x messtype %d, (endian %d) to %d groups \n(%d bytes): %s\n", sender, service_type, mess_type, endian_mismatch, num_groups, ret, mess ); }else printf("received message of unknown message type 0x%x with ret %d\n", service_type, ret); printf("\n"); fflush(stdout); }
void master_printList(master_t * self, int size) { for (int i = 0; i < size; i++) { master_print(&self[i]); } }