It seems like line endings are changed while I'm copy/paste the diff from the e-mail. Could you please attache the diff to e-mail as separate file packed with .tar.gz. Thanks --- Yura On Oct 14, 2010, at 12:44 PM, Yuriy Kohut wrote: > I'm getting the following error while patching: > > patch -p1 < sheepdog-signalfd.patch > patching file sheep/work.c > patch: **** malformed patch at line 6: #include <syscall.h> > --- > Yura > > On Oct 14, 2010, at 12:17 PM, MORITA Kazutaka wrote: > >> At Wed, 13 Oct 2010 17:46:57 +0300, >> Yuriy Kohut wrote: >>> >>> Got it configured. >>> >>> But faced with the following issue while running 'make': >>> --- >>> work.c:28:28: error: linux/signalfd.h: No such file or directory >>> work.c: In function ‘bs_thread_request_done’: >>> work.c:169: error: array type has incomplete element type >>> work.c:169: warning: unused variable ‘siginfo’ >>> --- >>> >>> signalfd.h seems to be not kernel version 2.6.18 (default CentOS 5.5 kernel) header. >>> >>> Any ideas ? >>> >> >> Can you try the following patch? This removes use of signalfd. >> >> Kazutaka >> >> == >> diff --git a/sheep/work.c b/sheep/work.c >> index 8016435..5f7e96c 100644 >> --- a/sheep/work.c >> +++ b/sheep/work.c >> @@ -24,8 +24,6 @@ >> #include <syscall.h> >> #include <sys/types.h> >> #include <linux/types.h> >> -#define _LINUX_FCNTL_H >> -#include <linux/signalfd.h> >> >> #include "list.h" >> #include "util.h" >> @@ -33,9 +31,6 @@ >> #include "logger.h" >> #include "event.h" >> >> -extern int signalfd(int fd, const sigset_t *mask, int flags); >> - >> -static int sig_fd; >> static LIST_HEAD(worker_info_list); >> >> struct work_queue { >> @@ -67,6 +62,13 @@ struct worker_info { >> >> pthread_mutex_t startup_lock; >> >> + int command_fd[2]; >> + int done_fd[2]; >> + >> + pthread_cond_t finished_cond; >> + struct list_head ack_list; >> + pthread_t ack_thread; >> + >> pthread_t worker_thread[0]; >> }; >> >> @@ -161,36 +163,86 @@ static void work_post_done(struct work_queue *q, enum work_attr attr) >> } >> } >> >> +static void *bs_thread_ack_fn(void *arg) >> +{ >> + struct worker_info *wi = arg; >> + int command, ret, nr; >> + struct work *work; >> + >> +retry: >> + ret = read(wi->command_fd[0], &command, sizeof(command)); >> + if (ret < 0) { >> + eprintf("ack pthread will be dead, %m\n"); >> + if (errno == EAGAIN || errno == EINTR) >> + goto retry; >> + >> + goto out; >> + } >> + >> + pthread_mutex_lock(&wi->finished_lock); >> +retest: >> + if (list_empty(&wi->finished_list)) { >> + pthread_cond_wait(&wi->finished_cond, &wi->finished_lock); >> + goto retest; >> + } >> + >> + while (!list_empty(&wi->finished_list)) { >> + work = list_first_entry(&wi->finished_list, >> + struct work, w_list); >> + >> + list_del(&work->w_list); >> + list_add_tail(&work->w_list, &wi->ack_list); >> + } >> + >> + pthread_mutex_unlock(&wi->finished_lock); >> + >> + nr = 1; >> +rewrite: >> + ret = write(wi->done_fd[1], &nr, sizeof(nr)); >> + if (ret < 0) { >> + eprintf("can't ack tgtd, %m\n"); >> + if (errno == EAGAIN || errno == EINTR) >> + goto rewrite; >> + >> + goto out; >> + } >> + >> + goto retry; >> +out: >> + pthread_exit(NULL); >> +} >> + >> static void bs_thread_request_done(int fd, int events, void *data) >> { >> int ret; >> - struct worker_info *wi; >> + struct worker_info *wi = data; >> struct work *work; >> - struct signalfd_siginfo siginfo[16]; >> - LIST_HEAD(list); >> + int nr_events; >> >> - ret = read(fd, (char *)siginfo, sizeof(siginfo)); >> - if (ret <= 0) >> + ret = read(wi->done_fd[0], &nr_events, sizeof(nr_events)); >> + if (ret < 0) >> return; >> >> - list_for_each_entry(wi, &worker_info_list, worker_info_siblings) { >> - pthread_mutex_lock(&wi->finished_lock); >> - list_splice_init(&wi->finished_list, &list); >> - pthread_mutex_unlock(&wi->finished_lock); >> + while (!list_empty(&wi->ack_list)) { >> + enum work_attr attr; >> + work = list_first_entry(&wi->ack_list, >> + struct work, w_list); >> >> - while (!list_empty(&list)) { >> - enum work_attr attr; >> - work = list_first_entry(&list, struct work, w_list); >> - list_del(&work->w_list); >> - >> - /* >> - * work->done might free the work so we must >> - * save its attr for qork_post_done(). >> - */ >> - attr = work->attr; >> - work->done(work, 0); >> - work_post_done(&wi->q, attr); >> - } >> + list_del(&work->w_list); >> + >> + attr = work->attr; >> + work->done(work, 0); >> + work_post_done(&wi->q, attr); >> + } >> + >> +rewrite: >> + ret = write(wi->command_fd[1], &nr_events, sizeof(nr_events)); >> + if (ret < 0) { >> + eprintf("can't write done, %m\n"); >> + if (errno == EAGAIN || errno == EINTR) >> + goto rewrite; >> + >> + return; >> } >> } >> >> @@ -240,58 +292,53 @@ retest: >> list_add_tail(&work->w_list, &wi->finished_list); >> pthread_mutex_unlock(&wi->finished_lock); >> >> - kill(getpid(), SIGUSR2); >> + pthread_cond_signal(&wi->finished_cond); >> } >> >> pthread_exit(NULL); >> } >> >> -static int init_signalfd(void) >> -{ >> - int ret; >> - sigset_t mask; >> - static int done = 0; >> - >> - if (done++) >> - return 0; >> - >> - sigemptyset(&mask); >> - sigaddset(&mask, SIGUSR2); >> - sigprocmask(SIG_BLOCK, &mask, NULL); >> - >> - sig_fd = signalfd(-1, &mask, 0); >> - if (sig_fd < 0) { >> - eprintf("failed to create a signal fd, %m\n"); >> - return 1; >> - } >> - >> - ret = fcntl(sig_fd, F_GETFL); >> - ret |= fcntl(sig_fd, F_SETFL, ret | O_NONBLOCK); >> - >> - ret = register_event(sig_fd, bs_thread_request_done, NULL); >> - >> - return 0; >> -} >> - >> int init_work_queue(int nr) >> { >> int i, ret; >> struct worker_info *wi; >> >> - ret = init_signalfd(); >> - if (ret) >> - return -1; >> - >> wi = zalloc(sizeof(*wi) + nr * sizeof(pthread_t)); >> if (!wi) >> return -1; >> >> + ret = pipe(wi->command_fd); >> + if (ret) { >> + eprintf("failed to create command pipe, %m\n"); >> + goto destroy_cond_mutex; >> + } >> + >> + ret = pipe(wi->done_fd); >> + if (ret) { >> + eprintf("failed to done command pipe, %m\n"); >> + goto close_command_fd; >> + } >> + >> + ret = register_event(wi->done_fd[0], bs_thread_request_done, wi); >> + if (ret) { >> + eprintf("failed to add epoll event\n"); >> + goto close_done_fd; >> + } >> + >> + ret = pthread_create(&wi->ack_thread, NULL, bs_thread_ack_fn, wi); >> + if (ret) { >> + eprintf("failed to create an ack thread, %s\n", strerror(ret)); >> + goto event_del; >> + } >> + >> wi->nr_threads = nr; >> >> INIT_LIST_HEAD(&wi->q.pending_list); >> INIT_LIST_HEAD(&wi->q.blocked_list); >> INIT_LIST_HEAD(&wi->finished_list); >> + INIT_LIST_HEAD(&wi->ack_list); >> >> + pthread_cond_init(&wi->finished_cond, NULL); >> pthread_cond_init(&wi->pending_cond, NULL); >> >> pthread_mutex_init(&wi->finished_lock, NULL); >> @@ -315,6 +362,14 @@ int init_work_queue(int nr) >> list_add(&wi->worker_info_siblings, &worker_info_list); >> wqueue = &wi->q; >> >> +rewrite: >> + ret = write(wi->command_fd[1], &ret, sizeof(ret)); >> + if (ret < 0) { >> + eprintf("can't write done, %m\n"); >> + if (errno == EAGAIN || errno == EINTR) >> + goto rewrite; >> + } >> + >> return 0; >> destroy_threads: >> >> @@ -324,8 +379,15 @@ destroy_threads: >> pthread_join(wi->worker_thread[i - 1], NULL); >> eprintf("stopped the worker thread %d\n", i - 1); >> } >> - >> -/* destroy_cond_mutex: */ >> +event_del: >> + unregister_event(wi->done_fd[0]); >> +close_done_fd: >> + close(wi->done_fd[0]); >> + close(wi->done_fd[1]); >> +close_command_fd: >> + close(wi->command_fd[0]); >> + close(wi->command_fd[1]); >> +destroy_cond_mutex: >> pthread_cond_destroy(&wi->pending_cond); >> pthread_mutex_destroy(&wi->pending_lock); >> pthread_mutex_destroy(&wi->startup_lock); >> @@ -340,6 +402,9 @@ static void exit_work_queue(struct work_queue *q) >> int i; >> struct worker_info *wi = container_of(q, struct worker_info, q); >> >> + pthread_cancel(wi->ack_thread); >> + pthread_join(wi->ack_thread, NULL); >> + >> q->wq_state |= WQ_DEAD; >> pthread_cond_broadcast(&wi->pending_cond); >> >> @@ -351,5 +416,12 @@ static void exit_work_queue(struct work_queue *q) >> pthread_mutex_destroy(&wi->pending_lock); >> pthread_mutex_destroy(&wi->startup_lock); >> pthread_mutex_destroy(&wi->finished_lock); >> + >> + pthread_cond_destroy(&wi->finished_cond); >> + >> + close(wi->done_fd[0]); >> + close(wi->done_fd[1]); >> + close(wi->command_fd[0]); >> + close(wi->command_fd[1]); >> } >> #endif > > -- > sheepdog mailing list > sheepdog at lists.wpkg.org > http://lists.wpkg.org/mailman/listinfo/sheepdog |