static void process_data_sock(int h, struct pollfd *pfds, int count) { asrt(count <= ts[h].poll_count); int i; for( i= 1; i < ts[h].poll_count; i++) { if(pfds[i].revents) { int ps_i = ts[h].psi[i]; asrt(pfds[i].fd == ts[h].ps[ps_i].pfd.fd); uint32_t user_id = ts[h].ps[ps_i].user_id; int type = ts[h].ps[ps_i].type; int flags = 0; print_events(pfds[i].revents); if(IS_READ(pfds[i].revents)) { flags |= SOCK_THREAD_FD_RD; } if(IS_WRITE(pfds[i].revents)) { flags |= SOCK_THREAD_FD_WR; } if(IS_EXCEPTION(pfds[i].revents)) { flags |= SOCK_THREAD_FD_EXCEPTION; //remove the whole slot not flags remove_poll(h, &ts[h].ps[ps_i], ts[h].ps[ps_i].flags); } else if(flags) remove_poll(h, &ts[h].ps[ps_i], flags); //remove the monitor flags that already processed if(flags) ts[h].callback(pfds[i].fd, type, flags, user_id); } } }
int zebra_process_one (zebra_processor_t *proc, int timeout) { if(proc_lock(proc) < 0) return(-1); int rc = 0; if(proc->video) { zebra_image_scanner_enable_cache(proc->scanner, 1); rc = zebra_video_enable(proc->video, 1); /* FIXME failure recovery? */ int vid_fd = zebra_video_get_fd(proc->video); if(vid_fd >= 0) add_poll(proc, vid_fd, proc_video_handler); proc->active = 1; #ifdef HAVE_LIBPTHREAD pthread_cond_broadcast(&proc->event); #endif proc_event_wait(proc, EVENT_OUTPUT, timeout); rc = zebra_video_enable(proc->video, 0); if(vid_fd >= 0) remove_poll(proc, vid_fd); proc->active = 0; proc->events &= ~EVENT_INPUT; zebra_image_scanner_enable_cache(proc->scanner, 0); } else rc = -1; proc_unlock(proc); return(rc); }
int zebra_processor_set_active (zebra_processor_t *proc, int active) { if(proc_lock(proc) < 0) return(-1); if(!proc->video) { proc_unlock(proc); return(-1); } zebra_image_scanner_enable_cache(proc->scanner, active); int rc = zebra_video_enable(proc->video, active); int vid_fd = zebra_video_get_fd(proc->video); if(vid_fd >= 0) { if(active) add_poll(proc, vid_fd, proc_video_handler); else remove_poll(proc, vid_fd); } /* FIXME failure recovery? */ proc->active = active; proc->events &= ~EVENT_INPUT; #ifdef HAVE_LIBPTHREAD if(proc->threaded) { assert(!proc->sem); assert(pthread_equal(proc->sem_owner, pthread_self())); pthread_mutex_lock(&proc->mutex); proc->sem++; pthread_cond_broadcast(&proc->event); pthread_cond_signal(&proc->cond); pthread_mutex_unlock(&proc->mutex); } #endif return(rc); }
static void gsk_packet_queue_fd_close (GskIO *io) { GskPacketQueueFd *packet_queue_fd = GSK_PACKET_QUEUE_FD (io); remove_poll (packet_queue_fd); if (packet_queue_fd->fd >= 0) { close (packet_queue_fd->fd); gsk_fork_remove_cleanup_fd (packet_queue_fd->fd); packet_queue_fd->fd = -1; } }
static void eva_packet_queue_fd_close (EvaIO *io) { EvaPacketQueueFd *packet_queue_fd = EVA_PACKET_QUEUE_FD (io); remove_poll (packet_queue_fd); if (packet_queue_fd->fd >= 0) { close (packet_queue_fd->fd); eva_fork_remove_cleanup_fd (packet_queue_fd->fd); packet_queue_fd->fd = -1; } }