void RemoveProcessFromConstraint::redo() const
{
    auto& constraint = m_path.find();
    RemoveProcess(constraint, m_processId);

    // The view models will be deleted accordingly.
}
示例#2
0
void CheckElectionTimer(void)
{
  MESSAGE msg;
  int i;


  if(!bElect)
    return;

  if(time(NULL)<ElectionTimer)
    return;

  /*TRACE("I won the Election");*/
  printf("I won the election %d:%d \n",Me.pid,Me.IP);

  SetCoord(&Me);
  bElect=FALSE;

  //Remove all members above me
  while(1)
  {
    for(i=0;i<GroupSize;i++)
    {
      if(IsBigger(&GroupList[i],&Me))
      {
        RemoveProcess(&GroupList[i]);
        continue;
      }
    }
    break;
  }

  //Tell everyone that I'm the boss
  msg.OpCode=IM_COORD;
  for(i=0;i<GroupSize;i++)
  {
    msg.To=GroupList[i];
    Send(&msg);
  }
}//CheckElectionTimer
示例#3
0
int main(int argc, char *argv[])
{
  char hostname[80];
  struct hostent *hostPtr;
  struct sockaddr_in serverName;

  fd_set ReadSet;
  struct timeval TimeOut;

  MESSAGE msg;

  int on;
  int status;


  Init();

  GroupPort=DEFAULT_PORT;

  switch(argc)
  {
    case 2:
      GroupPort=atoi(argv[1]);
      //FALLTHROUGH

    case 1:
      break;

    default:
      fprintf(stderr, "Usage: %s [ServerPort]\n", argv[0]);
      exit(1);
  }/* switch(argc) */


  s=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
  if(s==INVALID_SOCKET)
    ErrorExit("socket()");

  on=1;
  status=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,
                    (char *)&on,sizeof(on));
  if(status==SOCKET_ERROR)
    ErrorExit("setsockopt(...,SO_REUSEADDR,...)");

  status=setsockopt(s,SOL_SOCKET,SO_BROADCAST,
                    (char *)&on,sizeof(on));
  if(status==SOCKET_ERROR)
    ErrorExit("setsockopt(...,SO_BROADCAST,...)");


  /* 
   * Find out who I am.
   */
  status=_GetHostName(hostname,sizeof(hostname));
  if(status==SOCKET_ERROR)
    ErrorExit("_GetHostName()");

  hostPtr=gethostbyname(hostname);
  if(hostPtr==NULL)
    ErrorExit("gethostbyname()");

  ZERO(serverName);
  serverName.sin_family=AF_INET;
  serverName.sin_port=htons(GroupPort);
  serverName.sin_addr.s_addr=INADDR_ANY;

  /* A "feature" of Linux is that if I bind to a specific address
   * it assumes that I don't want to get broadcasts.
   *
   * memcpy(&serverName.sin_addr,hostPtr->h_addr,hostPtr->h_length);
   */

  status=bind(s,(struct sockaddr *)&serverName,sizeof(serverName));
  if(status==SOCKET_ERROR)
    ErrorExit("bind()");


  /* 
   * Init Globals
   */
  Me.pid=getpid();
  Me.IP=*((DWORD *)hostPtr->h_addr);

  printf("Hello.  My Unique ID is %X %X.\n\n",Me.pid,Me.IP);


  /* 
   * Join the group
   */
  TRACE("Broadcasting JOIN");
  msg.OpCode=JOIN;
  msg.To=BcastAddr;
  Send(&msg);


  /* 
   * Start an election (Once we know who is in the group.)
   */
  TRACE("Set Election Timer");
  AYATimer=time(NULL)+AYA_TIMEOUT;

  while(TRUE)
  {
    TimeOut.tv_sec=1;
    TimeOut.tv_usec=0;

    FD_ZERO(&ReadSet);
    FD_SET(s,&ReadSet);

    status=select(s+1,&ReadSet,NULL,NULL,&TimeOut);
    if(status)
    {
      if(Recv(&msg))
      {
        switch(msg.OpCode)
        {
          case AYA:
            TRACE("Received AYA");

            msg.OpCode=IamA;
            msg.To=msg.From;
            Send(&msg);
            break;

          case IamA:
            TRACE("Received IamA");

            if(IsEqual(&msg.From,&Coord))
              bCoordAlive=TRUE;
            else
              TRACE("IamA--Wrong Coordinator");
            break;

          case ELECT:
            TRACE("Received ELECT");

            msg.OpCode=ACK_ELECT;
            msg.To=msg.From;
            Send(&msg);

            StartElection();
            break;

          case ACK_ELECT:
            TRACE("Received ACK_ELECT");

            CancelElection(&msg);
            break;

          case JOIN:
            TRACE("Received JOIN");

            //Broadcast can include myself
            if(IsEqual(&msg.From,&Me))
            {
              TRACE("JOIN--From myself!");
              break;
            }

            AddProcess(&msg.From);

            msg.OpCode=WELCOME;
            msg.To=msg.From;
            Send(&msg);

            //It looks like we need to restart our election
            if(bElect && IsBigger(&msg.From,&Me))
            {
              bElect=FALSE;
              StartElection();
            }
            break;

          case WELCOME:
            TRACE("Received WELCOME");

            AddProcess(&msg.From);
            break;

          case IM_COORD:
            TRACE("Received IM_COORD");

            SetCoord(&msg.From);
            break;

          case LEAVE:
            TRACE("Received LEAVE");

            RemoveProcess(&msg.From);
            if(IsEqual(&msg.From,&Coord))
              StartElection();
        }//switch(OpCode
      }//if(Recv
    }//if(status

    CheckElectionTimer();
    CheckAYATimer();
    CheckAYAInterval();
  }//while(1

  return 0;
}//main
void AddOnlyProcessToConstraint::undo(ConstraintModel& constraint) const
{
    RemoveProcess(constraint, m_createdProcessId);
}