#include #include #include #include #include extern const char *__progname; #include "es.h" #include "prf.h" #include "vars.h" #include "worker.h" static int wtest_worker(void *wv) { return(aio_oq_nonempty(&((WORKER *)wv)->oq)); } static void wr_worker(void *wv) { WORKER *w; int nw; w = wv; nw = aio_oq_writev(&w->oq,workerfd,-1); switch (nw) { case AIO_WRITEV_ERROR: switch (errno) { case EINTR: case EWOULDBLOCK: return; break; } fprintf(stderr,"%s: ui worker write error to main: %s\n",__progname,strerror(errno)); exit(1); break; } if (nw < 0) abort(); aio_oq_dropdata(&w->oq,nw); } static void rd_worker(void *wv) { WORKER *w; char rbuf[512]; int nr; int i; w = wv; nr = read(workerfd,&rbuf[0],sizeof(rbuf)); if (nr < 0) { switch (errno) { case EINTR: case EWOULDBLOCK: return; break; } fprintf(stderr,"%s: %s worker read error from main process: %s\n",__progname,w->tag,strerror(errno)); exit(1); } if (nr == 0) { fprintf(stderr,"%s: %s worker read EOF from main process\n",__progname,w->tag); exit(1); } for (i=0;iin,rbuf[i]); } else { es_append_1(&w->in,'\0'); (*w->from)(es_ptr(&w->in),es_len(&w->in)-1); es_clear(&w->in); } } } void worker_common_startup(WORKER *w, void (*playcmd)(const char *, int)) { prf_setup(&w->oq); w->from = playcmd; aio_add_poll(workerfd,&aio_rwtest_always,&wtest_worker,&rd_worker,&wr_worker,w); }