示例#1
0
t_client	*add_client(t_info *info, int server, int x, int y)
{
  static int	last_x = -1;
  static int	last_y = -1;
  static int	last_direction = -1;
  static int	id = 0;
  t_client	*client;

  client = xmalloc(sizeof(*client));
  client->status = ST_NOT_LOGGED;
  client->fct_read = client_read;
  client->fct_write = client_write;
  init_buffer(client);
  client->level = START_LEVEL;
  client->x = (x ? x : get_random(info->x, last_x));
  client->y = (y ? y : get_random(info->y, last_y));
  last_x = client->x;
  last_y = client->y;
  push_list(&(info->zone[client->x][client->y].clients), client);
  client->direction = get_random(WEST, last_direction);
  client->team = NULL;
  init_ressources(client);
  push_list(&info->clients, (void *)client);
  if (server)
    client->socket = xaccept(server, NULL, NULL);
  client->id = id++;
  return (client);
}
示例#2
0
int main(int argc, char** argv)
{
	Semaphore sem_dock;
	Semaphore mutex_dock;
	Semaphore sem_gen_v;
	Shm shm_dock;
	struct mq_attr attr1;
	struct mq_attr attr2;
	mqd_t mqd_trucks;
	mqd_t mqd_cars_vans;
	char mq1_name[MQ_NAME_LENGTH];
	char mq2_name[MQ_NAME_LENGTH];
	char* port_name = argv[1];
	char* msg = malloc(sizeof(msg));
	int dock_index;
	int nb_docks;
	int stop = 0;
	int num_read = 0;
	void *buffer;

	sscanf(argv[2], "%d", &dock_index);
	sscanf(argv[3], "%d", &nb_docks);

	init_ressources(&sem_dock, &mutex_dock, &shm_dock, port_name, dock_index, nb_docks);

	// Mise a zero des info de la Shm
	Dock dock;
	dock.index = dock_index;
	dock.boat_index = -1;
	wait_sem(mutex_dock);
	memcpy(shm_dock.pShm + (dock_index * sizeof(Dock)), &dock, sizeof(Dock));
	signal_sem(mutex_dock);

	while (!stop)
	{
		// Attente d'un bateau
		printf("\t\t Quai %s %d > En attente %s\n", port_name, dock_index, sem_dock.semname);
		wait_sem(sem_dock);

		wait_sem(mutex_dock);
		memcpy(&dock, shm_dock.pShm + (dock_index * sizeof(Dock)), sizeof(Dock));
		signal_sem(mutex_dock);

		sprintf(msg, "Bateau %d a quai", dock.boat_index);
		print_boat(port_name, dock_index, dock.boat_index, msg);

		// Ouverture MQ --- TODO: refactor with open_mq, ...
		sprintf(mq1_name, "%s%d", MQ_TRUCKS, dock.boat_index);
		sprintf(mq2_name, "%s%d", MQ_CARS_VANS, dock.boat_index);
		mqd_trucks = mq_open(mq1_name, O_RDONLY | O_NONBLOCK);
		mqd_cars_vans = mq_open(mq2_name, O_RDONLY | O_NONBLOCK);
		
		if (mqd_trucks == (mqd_t) -1 || mqd_cars_vans == (mqd_t) -1)
		{
			perror("Error when opening MQs (trucks, cars, vans)");
		}
		if (mq_getattr(mqd_trucks, &attr1) == -1 || mq_getattr(mqd_cars_vans, &attr2) == -1)
		{
			perror("Erreur when mq_getattr\n");
		}
		buffer = malloc(attr1.mq_msgsize);

		// Début du débarquement
		sprintf(msg, "Debut debarquement");
		print_boat(port_name, dock_index, dock.boat_index, msg);

		// Débarquement des camions
		sprintf(msg, "Debarquement de %ld camions", attr1.mq_curmsgs);
		print_boat(port_name, dock_index, dock.boat_index, msg);
		if(attr1.mq_curmsgs > 0)
		{
			while(num_read != -1)
			{
				num_read = mq_receive(mqd_trucks, buffer, attr1.mq_msgsize, NULL);
				nanosleep((struct timespec[]){{0, 250000000}}, NULL);
			}
		}
		num_read = 0;

		// Débarquement des voitures/vans
		sprintf(msg, "Debarquement de %ld voitures/vans", attr2.mq_curmsgs);
		print_boat(port_name, dock_index, dock.boat_index, msg);
		if(attr2.mq_curmsgs > 0)
		{
			while(num_read != -1)
			{
				num_read = mq_receive(mqd_cars_vans, buffer, attr2.mq_msgsize, NULL);
				nanosleep((struct timespec[]){{0, 250000000}}, NULL);
			}
		}