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; }
/*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; }