void RemoveProcessFromConstraint::redo() const { auto& constraint = m_path.find(); RemoveProcess(constraint, m_processId); // The view models will be deleted accordingly. }
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
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); }