void gn_vm_loop(void) { fd_set rfds; struct timeval tv; int res; int nfd, devfd; int i, n; char buf[256], *d; devfd = device_getfd(sm); nfd = (PtyRDFD > devfd) ? PtyRDFD + 1 : devfd + 1; while (!GTerminateThread) { if (CommandMode && gn_atem_initialised && queue.n > 0) { d = queue.buf + queue.head; queue.head = (queue.head + 1) % sizeof(queue.buf); queue.n--; gn_atem_incoming_data_handle(d, 1); continue; } FD_ZERO(&rfds); FD_SET(devfd, &rfds); if ( queue.n < sizeof(queue.buf) ) { FD_SET(PtyRDFD, &rfds); } tv.tv_sec = 0; tv.tv_usec = 500000; res = select(nfd, &rfds, NULL, NULL, &tv); switch (res) { case 0: /* Timeout */ continue; case -1: perror("gn_vm_loop - select"); exit (-1); default: break; } if (FD_ISSET(PtyRDFD, &rfds)) { n = sizeof(queue.buf) - queue.n < sizeof(buf) ? sizeof(queue.buf) - queue.n : sizeof(buf); if ( (n = read(PtyRDFD, buf, n)) <= 0 ) gn_vm_terminate(); for (i = 0; i < n; i++) { queue.buf[queue.tail++] = buf[i]; queue.tail %= sizeof(queue.buf); queue.n++; } } if (FD_ISSET(devfd, &rfds)) gn_sm_loop(1, sm); } }
/* cleanup function registered by atexit() and called at exit() */ static void busterminate(void) { gn_vm_terminate(); gn_device_unlock(lockfile); gn_lib_library_free(); }