Exemplo n.º 1
0
void *freeFlightSlave(void *arg){
  FreeFlightThreadArgs *threadArgs;
  Particle *part, *part1;

  threadArgs=(FreeFlightThreadArgs*)arg;
  part1=threadArgs->parts+threadArgs->nbParts;
  pthread_mutex_init(&(threadArgs->mutex), NULL);
  pthread_cond_init(&(threadArgs->condition), NULL);
  pthread_mutex_lock(&(threadArgs->mutex));
  pthread_mutex_lock(threadArgs->masterMutex); //letting master know that thread is ready
  pthread_cond_signal(threadArgs->masterCondition);
  pthread_mutex_unlock(threadArgs->masterMutex);
  while(1){
    pthread_cond_wait(&(threadArgs->condition), &(threadArgs->mutex)); //waiting for a new job
    if(threadArgs->die) //state should be accessed only with threadArgs->mutex locked
      break;
    for(part=threadArgs->parts; part<part1; part++)
      freeFlight(part, threadArgs->dt, threadArgs->walls, threadArgs->nbWalls);
    pthread_mutex_lock(threadArgs->masterMutex); //job done. let the master know
    threadArgs->done=1;
    pthread_cond_signal(threadArgs->masterCondition);
    pthread_mutex_unlock(threadArgs->masterMutex);
  }
  pthread_mutex_unlock(&(threadArgs->mutex));
  pthread_cond_destroy(&(threadArgs->condition));
  pthread_mutex_destroy(&(threadArgs->mutex));
  pthread_mutex_lock(threadArgs->masterMutex);
  pthread_cond_signal(threadArgs->masterCondition);
  pthread_mutex_unlock(threadArgs->masterMutex);
  pthread_exit(0);
  return NULL;
}
Exemplo n.º 2
0
/*compute forces, at time t, get new velocity based on forces,
 * and update particles position.
 * */
int updateSys(System *sys, float dt){
  float    ft[3];     //total force on particle.
  int      alpha;     //x,y,z index
  Particle *part;
//  float fgs[3][3]={{0,0,-9.81},{9.81,0,0},{0,0,9.81}}; //testnico just for fun
//  float *fg;
//  static float angle=0, gravity;
  static clock_t timeFreeFlight=0;
  static clock_t timeTracking=0;
  static clock_t timePPCollision=0;
  clock_t time1, time2;

  if(sys==NULL){ //testnico
    printf("free flight: %f sec; tracking: %f sec; collision: %f sec\n",
        (float)timeFreeFlight/CLOCKS_PER_SEC, (float)timeTracking/CLOCKS_PER_SEC, (float)timePPCollision/CLOCKS_PER_SEC);
    return 0;
  }

  time1=clock();
#ifdef USE_MULTI_THREADING
  freeFlightMT(sys, dt, THREAD_NUM);
  time2=clock(); timeFreeFlight+=time2-time1; time1=time2;
  setParticlesGrid(sys->grid, sys->parts, sys->nbParts);
  time2=clock(); timeTracking+=time2-time1; time1=time2;
  checkPPCollisionMT(sys, THREAD_NUM);
#else
    for(part=sys->parts; part<sys->parts+sys->nbParts; part++){
      freeFlight(part,dt,sys->walls,sys->nbWalls);
  //    setParticleCell(part, sys);
    }
    time2=clock(); timeFreeFlight+=time2-time1; time1=time2;
    setParticlesGrid(sys->grid, sys->parts, sys->nbParts);
    time2=clock(); timeTracking+=time2-time1; time1=time2;
    checkPPCollision(sys, sys->grid->cells, sys->grid->ncells);
#endif
  time2=clock(); timePPCollision+=time2-time1; time1=time2;

//  angle+=(2*M_PI/4)*dt;
//  if(angle>2*M_PI)
//    angle-=2*M_PI;
//  if(sys->time<1)
//    gravity=0;
//  else
//    gravity=9.81*sin((sys->time-3)*(2*M_PI/4));
//    gravity=9.81;
//    gravity=2;

  for(part=sys->parts; part<sys->parts+sys->nbParts; part++){
    for(alpha=0;alpha<3;alpha++){
      ft[alpha] =part->fp[alpha];
      ft[alpha]+=part->fs[alpha];
      ft[alpha]+=part->fv[alpha];
      //part->vel[alpha]+=dt*(ft[alpha]/part->ro+part->fg[alpha]);
      part->vel[alpha]+=dt*part->fg[alpha];

//      {//testnico just for fun
//        if(sys->time<3)
//          fg=fgs[0];
//        else if(sys->time<6)
//          fg=fgs[1];
//        else
//          fg=fgs[2];
//        part->vel[alpha]+=dt*fg[alpha];
//      }
    }

//    {//testnico just for fun rotating gravity field
//      part->vel[0]+=dt*(part->fg[0]*cos(angle)-part->fg[2]*sin(angle));
//      part->vel[1]+=dt*part->fg[1];
//      part->vel[2]+=dt*(part->fg[0]*sin(angle)+part->fg[2]*cos(angle));
//    }

//    {//testnico just for fun : normal force
//      float norm;
//      for(alpha=0, norm=0; alpha<3; alpha++)
//        norm+=part->pos[alpha]*part->pos[alpha];
//      norm=sqrt(norm);
//      if(norm>0.01){
//        for(alpha=0; alpha<3; alpha++)
//          part->vel[alpha]-=dt*(part->pos[alpha]/norm)*gravity; //+= to repulse, -= to attract
//      }
//    }

//    {//testnico just for fun : tangential force for few seconds
//      if(sys->time<5)
//      {
//        float norm;
//        norm=sqrt(part->pos[0]*part->pos[0]+part->pos[2]*part->pos[2]);
//        if(norm>0.01){
//          part->vel[0]+=dt*(part->pos[2]/norm)*gravity;
//          part->vel[2]-=dt*(part->pos[0]/norm)*gravity;
//        }
//      }
//      else{
//        part->vel[2]-=dt*9.81;
//      }
//    }
  }
  setForces(sys);
  sys->time+=dt;
  sys->prevDt=dt;
  return 0;
}
int main(int argc , char *argv[])
{
    int socket_desc , new_socket, c,*new_sock;
    struct sockaddr_in server , client;

    //Airport Sofia;
    Flight toBarcelona, toParis;
    Passanger pesho,gosho,ivan,dragan,atanas,
			  dragoi, blagoi, ico, moni, pepkata;

    //Create socket
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_desc == ERROR_STATE)
    {
        printf("Could not create socket \n");
    }
    else
    {
        puts("Socket created successfully \n ");
    }


    //Initialize server to 0
    (void) memset((char*) &server, 0, sizeof(server));

    //Prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( PORT_NUMBER );

    //Bind
    if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
    {
        //Print the error message
        perror("Binding failed. Error");
        return ERROR_STATE;
    }
    puts("Binding successful");

    //Init airport
    initAirport(&Sofia,NUM_PASSAGERS,1,"Letishte Sofia");

    //Init flights
    initFlight(&toBarcelona,NUM_PASSAGERS,1,LANDED,"Barcelona");
    initFlight(&toParis,NUM_PASSAGERS,2,STILL_FLYING,"Paris");

    //Init passengers
    initPassenger(&pesho,1,"Petar","Petrov","Hadjigenchov");
    initPassenger(&gosho,2,"Georgi","Valentinov","Chelenkov");
    initPassenger(&ivan,3,"Ivan","Krasimirov","Botev");
    initPassenger(&dragan,4,"Dragan","Iordanov","Gospodinov");
    initPassenger(&atanas,5,"Atanas","Slaveikov","Troshanov");
    initPassenger(&dragoi,6,"Dragoi","Petrov","Dragoichev");
    initPassenger(&blagoi,7,"Blago","Blajev","Djiev");
    initPassenger(&ico,8,"Hristo","Ivanov","Stoichkov");
    initPassenger(&moni,9,"Moncho","Monev","Minev");
    initPassenger(&pepkata,10,"Pepi","Monev","Pepinchev");

    //Asigning passngers to flights
    assignPassengerToFlight(&toBarcelona, pesho);
    assignPassengerToFlight(&toBarcelona, gosho);
    assignPassengerToFlight(&toBarcelona, ivan);
    assignPassengerToFlight(&toBarcelona, dragan);
    assignPassengerToFlight(&toBarcelona, atanas);

    assignPassengerToFlight(&toParis, dragoi);
    assignPassengerToFlight(&toParis, blagoi);
    assignPassengerToFlight(&toParis, ico);
    assignPassengerToFlight(&toParis, moni);
    assignPassengerToFlight(&toParis, pepkata);

    assignFlightToAirport(&Sofia,toBarcelona);
    assignFlightToAirport(&Sofia,toParis);

    //Displaying flight passengers NFO
    printf("\n-----------FLIGHT PASSENGERS INFO--------------");
    int i,j;
    for(i = 0; i < Sofia.used; i++)
    {
        printf("\nDestination: %s\n",Sofia.flights_array[i].destination);

    	for(j = 0; j < Sofia.flights_array[i].used; j++)
    	{
    	    printf("\n");
       	    printf("%d ",Sofia.flights_array[i].passangers_array[j].ID);
            printf("%s ",Sofia.flights_array[i].passangers_array[j].first_name);
            printf("%s ",Sofia.flights_array[i].passangers_array[j].second_name);
            printf("%s ",Sofia.flights_array[i].passangers_array[j].last_name);
    	}
    }

    //Listen
    listen(socket_desc , 3);

    //Accept and incoming connection
    puts("\nWaiting for incoming connections...");
    c = sizeof(struct sockaddr_in);

    while( (new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) )
    {
        puts("Connection accepted");

        pthread_t sniffer_thread;
        new_sock = malloc(1);
        *new_sock = new_socket;

		int thread_desc = 0;
		thread_desc = pthread_create( &sniffer_thread , NULL ,  connection_handler , (void*) new_sock);

        if(thread_desc < 0)
        {
            perror("Could not create thread");
            return ERROR_STATE;
        }
        puts("Handler assigned");

		int detach = pthread_detach(thread_desc);
		if(detach == 0 )
		{
			puts("Freeing the thread resources failed!");
        }
    }

    if (new_socket < 0)
    {
        perror("Accept failed");
        return ERROR_STATE;
    }

    ///////////////Freeing memory
    freeFlight(&toBarcelona);
    freeFlight(&toParis);

    	free(pesho.first_name);
    	free(pesho.second_name);
    	free(pesho.last_name);

    	free(gosho.first_name);
        free(gosho.second_name);
        free(gosho.last_name);

        free(ivan.first_name);
        free(ivan.second_name);
        free(ivan.last_name);

        free(dragan.first_name);
        free(dragan.second_name);
        free(dragan.last_name);

        free(atanas.first_name);
        free(atanas.second_name);
        free(atanas.last_name);
    ///////////////
    return 0;
}