コード例 #1
0
FX_FLOAT CPDF_VariableText::GetAutoFontSize() {
  int32_t nTotal = sizeof(gFontSizeSteps) / sizeof(uint8_t);
  if (IsMultiLine())
    nTotal /= 4;
  if (nTotal <= 0)
    return 0;
  if (GetPlateWidth() <= 0)
    return 0;

  int32_t nLeft = 0;
  int32_t nRight = nTotal - 1;
  int32_t nMid = nTotal / 2;
  while (nLeft <= nRight) {
    if (IsBigger(gFontSizeSteps[nMid])) {
      nRight = nMid - 1;
      nMid = (nLeft + nRight) / 2;
      continue;
    } else {
      nLeft = nMid + 1;
      nMid = (nLeft + nRight) / 2;
      continue;
    }
  }
  return (FX_FLOAT)gFontSizeSteps[nMid];
}
コード例 #2
0
ファイル: Elect.c プロジェクト: BoiseState/CS455-resources
void StartElection(void)
{
  MESSAGE msg;
  int i;
  BOOL bAnySent=FALSE;


  if(bElect)
    return;

  TRACE("Starting Election");
  bElect=TRUE;
  bCoordAlive=FALSE;

  msg.OpCode=ELECT;
  msg.lParam=++ElectionID;

  for(i=0;i<GroupSize;i++)
  {
    if(IsBigger(&GroupList[i],&Me))
    {
      msg.To=GroupList[i];
      Send(&msg);
      bAnySent=TRUE;
    }
  }

  ElectionTimer=time(NULL);
  if(bAnySent)
    ElectionTimer+=ELECT_TIMEOUT;
  else
    CheckElectionTimer();
}//StartElection
コード例 #3
0
ファイル: Elect.c プロジェクト: BoiseState/CS455-resources
void SetCoord(GROUP_ADDR *pAddr)
{
  Coord=*pAddr;

  //Wait for AYA_INTERVAL before sending AYA
  bCoordAlive=TRUE;
  AYAInterval=time(NULL)+AYA_INTERVAL;


  //Let's play king of the hill!
  if(IsBigger(&Me,&Coord))
    StartElection();
}//SetCoord
コード例 #4
0
ファイル: Elect.c プロジェクト: BoiseState/CS455-resources
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
コード例 #5
0
ファイル: Elect.c プロジェクト: BoiseState/CS455-resources
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