Exemple #1
0
static void uv__chld(uv_signal_t* handle, int signum) {
  uv_process_t* process;
  uv_loop_t* loop;
  int exit_status;
  int term_signal;
  unsigned int i;
  int status;
  pid_t pid;
  QUEUE pending;
  QUEUE* h;
  QUEUE* q;

  assert(signum == SIGCHLD);

  QUEUE_INIT(&pending);
  loop = handle->loop;

  for (i = 0; i < ARRAY_SIZE(loop->process_handles); i++) {
    h = loop->process_handles + i;
    q = QUEUE_HEAD(h);

    while (q != h) {
      process = QUEUE_DATA(q, uv_process_t, queue);
      q = QUEUE_NEXT(q);

      do
        pid = waitpid(process->pid, &status, WNOHANG);
      while (pid == -1 && errno == EINTR);

      if (pid == 0)
        continue;

      if (pid == -1) {
        if (errno != ECHILD)
          abort();
        continue;
      }

      process->status = status;
      QUEUE_REMOVE(&process->queue);
      QUEUE_INSERT_TAIL(&pending, &process->queue);
    }

    while (!QUEUE_EMPTY(&pending)) {
      q = QUEUE_HEAD(&pending);
      QUEUE_REMOVE(q);
      QUEUE_INIT(q);

      process = QUEUE_DATA(q, uv_process_t, queue);
      uv__handle_stop(process);

      if (process->exit_cb == NULL)
        continue;

      exit_status = 0;
      if (WIFEXITED(process->status))
        exit_status = WEXITSTATUS(process->status);

      term_signal = 0;
      if (WIFSIGNALED(process->status))
        term_signal = WTERMSIG(process->status);

      process->exit_cb(process, exit_status, term_signal);
    }
  }
}
Exemple #2
0
static void
gtm_read(void)
{
	route_head *first_trk_head = NULL;
	route_head *trk_head = NULL;
	route_head *rte_head = NULL;
	waypoint *wpt;
	int real_tr_count = 0;
	char *route_name;
	unsigned int icon;
	int i;

	/* Image information */
	for (i = 0; i != im_count; i++) {
		fread_string_discard(file_in);
		fread_string_discard(file_in);
		fread_discard(file_in, 30);
	}

	/* Waypoints */
	for (i = 0; i != wp_count; i++) {
		wpt = waypt_new();
		wpt->latitude = fread_double(file_in);
		wpt->longitude = fread_double(file_in);
		convert_datum(&wpt->latitude, &wpt->longitude);
		wpt->shortname = fread_fixedstring(file_in, 10);
		wpt->description = fread_string(file_in);
		icon = fread_integer(file_in);
		if (icon < sizeof(icon_descr)/sizeof(char*))
			wpt->icon_descr = icon_descr[icon];
		fread_discard(file_in, 1);
		wpt->creation_time = fread_long(file_in);
		if (wpt->creation_time)
			wpt->creation_time += EPOCH89DIFF;
		fread_discard(file_in, 2);
		wpt->altitude = fread_single(file_in);
		if (wpt->altitude == unknown_alt_gtm)
			wpt->altitude = unknown_alt;
		fread_discard(file_in, 2);
		waypt_add(wpt);
	}

	/* Waypoint Styles */
	if (wp_count) {
		for (i = 0; i != ws_count; i++) {
			fread_discard(file_in, 4);
			fread_string_discard(file_in);
			fread_discard(file_in, 24);
		}
	}

	/* Tracklogs */
	for (i = 0; i != tr_count; i++) {
		wpt = waypt_new();
		wpt->latitude = fread_double(file_in);
		wpt->longitude = fread_double(file_in);
		convert_datum(&wpt->latitude, &wpt->longitude);
		wpt->creation_time = fread_long(file_in);
		if (wpt->creation_time)
			wpt->creation_time += EPOCH89DIFF;
		start_new = fread_byte(file_in);
		wpt->altitude = fread_single(file_in);
		if (wpt->altitude == unknown_alt_gtm)
			wpt->altitude = unknown_alt;
		if (start_new || !trk_head) {
			trk_head = route_head_alloc();
			track_add_head(trk_head);
			real_tr_count++;
			if (!first_trk_head)
				first_trk_head = trk_head;
		}
		track_add_wpt(trk_head, wpt);
	}

	/* Tracklog styles */
	trk_head = first_trk_head;
	for (i = 0; i != ts_count && i != real_tr_count; i++) {
		trk_head->rte_name = fread_string(file_in);
		fread_discard(file_in, 12);
		trk_head = (route_head *)QUEUE_NEXT(&trk_head->Q);
	}

	/* Routes */
	for (i = 0; i != rt_count; i++) {
		wpt = waypt_new();
		wpt->latitude = fread_double(file_in);
		wpt->longitude = fread_double(file_in);
		convert_datum(&wpt->latitude, &wpt->longitude);
		wpt->shortname = fread_fixedstring(file_in, 10);
		wpt->description = fread_string(file_in);
		route_name = fread_string(file_in);
		icon = fread_integer(file_in);
		if (icon < sizeof(icon_descr)/sizeof(char*))
			wpt->icon_descr = icon_descr[icon];
		fread_discard(file_in, 1);
		start_new = fread_byte(file_in);
		fread_discard(file_in, 6);
		wpt->altitude = fread_single(file_in);
		if (wpt->altitude == unknown_alt_gtm)
			wpt->altitude = unknown_alt;
		fread_discard(file_in, 2);

		if (start_new || !rte_head) {
			rte_head = route_head_alloc();
			rte_head->rte_name = route_name;
			route_add_head(rte_head);
		}
		else {
			xfree(route_name);
		}
		route_add_wpt(rte_head, wpt);
	}
}