X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=job.c;h=454b35bbcdab37403629b56b9b0836061d0b5b63;hb=59c1f51ef38081d87885a37873545154c7a23e2d;hp=5216e65ba9d01003c864153a72dc43a04ed1e4bc;hpb=cde61dd0b59b0f3f3b3afefafd045f8d75b32975;p=apps%2Fpfixtools.git diff --git a/job.c b/job.c index 5216e65..454b35b 100644 --- a/job.c +++ b/job.c @@ -54,28 +54,22 @@ # endif #endif - #include "job.h" +#include "gai.h" static int epollfd = -1; static bool sigint = false; -static void job_wipe(job_t *job) -{ - if (job->fd >= 0) { - close(job->fd); - job->fd = -1; - } -} -DO_DELETE(job_t, job); - -void job_release(job_t **job) +void job_delete(job_t **job) { if (*job) { if ((*job)->stop) { (*job)->stop(*job); } - job_delete(job); + if ((*job)->fd >= 0) { + close((*job)->fd); + } + p_delete(job); } } @@ -83,44 +77,46 @@ static job_t *job_register_fd(job_t *job) { struct epoll_event event = { .data.ptr = job, .events = EPOLLRDHUP }; - if (job->state & JOB_READ || job->state & JOB_LISTEN) { + if (job->mode & (JOB_READ | JOB_LISTEN)) { event.events |= EPOLLIN; } - if (job->state & JOB_WRITE || job->state & JOB_CONN) { - event.events |= EPOLLIN; + if (job->mode & (JOB_WRITE | JOB_CONN)) { + event.events |= EPOLLOUT; } if (epoll_ctl(epollfd, EPOLL_CTL_ADD, job->fd, &event) < 0) { syslog(LOG_ERR, "epoll_ctl error: %m"); job->error = true; - job_release(&job); + job_delete(&job); } return job; } -void job_update_state(job_t *job, int state) +void job_update_mode(job_t *job, int mode) { struct epoll_event event = { .data.ptr = job, .events = EPOLLRDHUP }; - if (job->state == state) + if (job->mode == mode) return; - job->state = state; - - if (job->state & JOB_READ || job->state & JOB_LISTEN) { + job->mode = mode; + if (job->mode & (JOB_READ | JOB_LISTEN)) { event.events |= EPOLLIN; } - if (job->state & JOB_WRITE || job->state & JOB_CONN) { - event.events |= EPOLLIN; + if (job->mode & (JOB_WRITE | JOB_CONN)) { + event.events |= EPOLLOUT; } - epoll_ctl(epollfd, EPOLL_CTL_MOD, job->fd, &event); + if (epoll_ctl(epollfd, EPOLL_CTL_MOD, job->fd, &event) < 0) { + syslog(LOG_ERR, "epoll_ctl error: %m"); + job->error = true; + } } -job_t *job_accept(job_t *listener, int state) +job_t *job_accept(job_t *listener, int mode) { int sock; job_t *res; @@ -137,13 +133,13 @@ job_t *job_accept(job_t *listener, int state) res = job_new(); res->fd = sock; - res->state = state; + res->mode = mode; res->process = listener->process; res->stop = listener->stop; return job_register_fd(res); } -static void job_handler(int sig) +static void job_sighandler(int sig) { static time_t lastintr = 0; time_t now = time(NULL); @@ -173,8 +169,8 @@ static void job_handler(int sig) void job_initialize(void) { signal(SIGPIPE, SIG_IGN); - signal(SIGINT, &job_handler); - signal(SIGTERM, &job_handler); + signal(SIGINT, &job_sighandler); + signal(SIGTERM, &job_sighandler); epollfd = epoll_create(128); if (epollfd < 0) { @@ -203,9 +199,11 @@ void job_loop(void) job->process(job); if (job->error || job->done) { - job_release(&job); + job_delete(&job); } } + + gai_process(); } }