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; }
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); }