Example #1
0
File: dacq.c Project: mazerj/pype2
int dacq_start(char *server, char *tracker, char *port, char *elopt,
	       char *elcam, char *swapxy, char *usbjs)
{
  int shmid, i;

  if ((shmid = shmget((key_t)SHMKEY, sizeof(DACQINFO), 0666 | IPC_CREAT)) < 0) {
    if (errno == EINVAL) {
      fprintf(stderr, "dacq_start: SHM buffer's changed size.\n");
      fprintf(stderr, "dacq_start: run pypekill and start again\n");
      return(0);
    } else {
      perror("shmget");
      fprintf(stderr, "dacq_start: kernel compiled with SHM/IPC?\n");
      return(0);
    }
  }

  if ((dacq_data = shmat(shmid, NULL, 0)) == NULL) {
    perror("shmat");
    fprintf(stderr, "dacq_start: kernel compiled with SHM/IPC?\n");
    return(0);
  }

  if ((semid = psem_init(SEMKEY)) < 0) {
    perror("psem_init");
    fprintf(stderr, "dacq_start: can't init semaphore\n");
    return(0);
  } else {
    /* start semaphore off at value of 1 */
    if (psem_set(semid, 1) < 0) {
      perror("psem_init");
      return(-1);
    }
  }

  shm_init();			/* initialize shm block */
  signal(SIGCHLD, dacq_sigchld_handler);
  if ((server_pid = fork()) == 0) {
    /* child becomes dac subsystem server */
    execlp(server, server, tracker, port, elopt, elcam, swapxy, usbjs, NULL);
    perror(server);
    exit(1);
  } else {
    /* parent waits for server to become ready */
    do {
      LOCK(semid);
      i = dacq_data->das_ready;
      UNLOCK(semid);
      usleep(100);
    } while (i == 0);
  }
  return(1);
}
int pthread_workqueue_init_np(void) {
	pthread_mutex_lock(&_init_mutex);
	if(!_wq_configured) {
		psem_init(&_job_semaphore, 0);
		if(_init_job_queues() != 0) {
			goto out_bad;
		}
		_wq_configured = 1;
	}
	pthread_mutex_unlock(&_init_mutex);
	return 0;
out_bad:
	_wq_configured = 0;
	pthread_mutex_unlock(&_init_mutex);
	return ENOMEM;
}
Example #3
0
File: dacq.c Project: mazerj/pype2
int dacq_start(int boot, int testmode, char *tracker_type,
	       char *dacq_server, char *trakdev)
{
  int shmid, ii;

  /* init the internal timestamper, in case it's needed later */
  timestamp(1);

  if ((shmid =
       shmget((key_t)SHMKEY, sizeof(DACQINFO), 0666 | IPC_CREAT)) < 0) {
    if (errno == EINVAL) {
      fprintf(stderr, "dacq_start: Shared memory buffer's changed sizes!\n");
      fprintf(stderr, "            Run pypekill, then try pype again.\n");
      return(0);
    } else {
      perror("shmget");
      fprintf(stderr, "dacq_start: %d kernel compiled with SHM/IPC?\n", errno);
      return(0);
    }
  }

  if ((dacq_data = shmat(shmid, NULL, 0)) == NULL) {
    perror("shmat");
    fprintf(stderr, "dacq_start: kernel compiled with SHM/IPC?\n");
    return(0);
  }

  if ((semid = psem_init(SEMKEY)) < 0) {
    perror("psem_init");
    fprintf(stderr, "dacq_start: can't init semaphore\n");
    return(0);
  } else {
    /* start semaphore off at value of 1 */
    if (psem_set(semid, 1) < 0) {
      perror("psem_init");
      return(-1);
    }
  }

  /* don't need to LOCK/UNLOCK until child processes are
   * running ... so don't bother here..
   */

  if (boot) {
    int i;

    for (i = 0; i < NDIGIN; i++) {
      dacq_data->din[i] = 0;
      dacq_data->din_changes[i] = 0;
      dacq_data->din_intmask[i] = 0;
    }

    for (i = 0; i < NDIGOUT; i++) {
      dacq_data->dout[i] = 0;
    }

    dacq_data->dout_strobe = 0;

    for (i = 0; i < NADC; i++) {
      dacq_data->adc[i] = 0;
    }

    dacq_data->eye_xgain = 1.0;
    dacq_data->eye_ygain = 1.0;
    dacq_data->eye_xoff = 0;
    dacq_data->eye_yoff = 0;

    for (i = 0; i < NFIXWIN; i++) {
      dacq_data->fixwin[i].active = 0;
      dacq_data->fixwin[i].genint = 0;
    }

    for (i = 0; i < NJOYBUT; i++) {
      dacq_data->js[i] = 0;
    }
    dacq_data->js_x = 0;
    dacq_data->js_y = 0;
    dacq_data->js_enabled = 0;

    dacq_data->adbuf_on = 0;
    dacq_data->adbuf_ptr = 0;
    dacq_data->adbuf_overflow = 0;
    for (i = 0; i < ADBUFLEN; i++) {
      dacq_data->adbuf_t[i] = 0;
      dacq_data->adbuf_x[i] = 0;
      dacq_data->adbuf_y[i] = 0;
      for (ii=0; ii < NADC; ii++) {
	dacq_data->adbufs[ii][i] = 0;
      }
    }

    for (i = 0; i < NDAC; i++) {
      dacq_data->dac[i] = 0;
    }

    dacq_data->dac_strobe = 0;

    dacq_data->timestamp = 0;
    dacq_data->terminate = 0;
    dacq_data->das_ready = 0;

    dacq_data->eye_smooth = 0;
    dacq_data->eye_x = 0;
    dacq_data->eye_y = 0;

    dacq_data->dacq_pri = 0;

    dacq_data->fixbreak_tau = 5;

    /* alarm timer (same units as timestamp); 0 for no alarm */
    dacq_data->alarm_time = 0;

    if (testmode) {
      dacq_data->din[2] = 1;
      dacq_data->din[3] = 1;
      fprintf(stderr, "dacq: testmode = 1 (no sub process!)\n");
    } else {
      signal(SIGCHLD, dacq_sigchld_handler);

      fprintf(stderr, "dacq: testmode = 0\n");
      fprintf(stderr, "dacq: tracker_type = %s\n", tracker_type);
      fprintf(stderr, "dacq: dacq_server = %s\n", dacq_server);

      if ((dacq_server_pid = fork()) == 0) {
	/* child process execs the dacq_server */

	if (strcmp(tracker_type, "ISCAN") == 0) {
	  //fprintf(stderr, "dacqmodule: starting iscan\n");
	  execlp(dacq_server, dacq_server, "-iscan", trakdev, NULL);
	} else if (strcmp(tracker_type, "EYELINK") == 0) {
	  //fprintf(stderr, "dacqmodule: starting eyelink\n");
	  execlp(dacq_server, dacq_server, "-eyelink", trakdev, NULL);
	} else if (strcmp(tracker_type, "ANALOG") == 0) {
	  //fprintf(stderr, "dacqmodule: starting analog\n");
	  execlp(dacq_server, dacq_server, NULL);
	} else if (strcmp(tracker_type, "EYEJOY") == 0) {
	  //fprintf(stderr, "dacqmodule: starting eyelink\n");
	  execlp(dacq_server, dacq_server, "-eyejoy", NULL);
	} else if (strcmp(tracker_type, "NONE") == 0) {
	  //fprintf(stderr, "dacqmodule: starting w/o tracker\n");
	  execlp(dacq_server, dacq_server, "-notracker", NULL);
	}

	perror(dacq_server);
	exit(1);
      } else {

	/* parent waits for server to become ready */
	do {
	  LOCK(semid);
	  i = dacq_data->das_ready;
	  UNLOCK(semid);
	  usleep(100);
	  } while (i == 0);
      }
    }
  }
  return(1);
}