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
}
Example #5
0
File: client.c Project: Ezran/cs437
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);
}
Example #6
0
void master_printList(master_t * self, int size) {
    for (int i = 0; i < size; i++) {
        master_print(&self[i]);
    }
}