X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ftest_sel_thread.c;h=25447d846d52d58794f8de9a20f9cc65c597dccb;hb=37ae4386bd764d62ae43c68df1560be55ff813ca;hp=6f77bf70245663e03b693c4b9295c601447bda76;hpb=df1262e4bb33b78f429baec77e2c68e4d6c9d592;p=pazpar2-moved-to-github.git diff --git a/src/test_sel_thread.c b/src/test_sel_thread.c index 6f77bf7..25447d8 100644 --- a/src/test_sel_thread.c +++ b/src/test_sel_thread.c @@ -1,7 +1,5 @@ -/* $Id: test_sel_thread.c,v 1.1 2007-04-20 10:06:52 adam Exp $ - Copyright (c) 2006-2007, Index Data. - -This file is part of Pazpar2. +/* This file is part of Pazpar2. + Copyright (C) Index Data Pazpar2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -14,43 +12,122 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Pazpar2; see the file LICENSE. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. - */ +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ #if HAVE_CONFIG_H -#include "cconfig.h" +#include #endif #include "sel_thread.h" +#include "eventl.h" #include +#include +/** \brief stuff we work on in separate thread */ struct my_work_data { int x; + int y; }; +/** \brief work to be carried out in separate thrad */ static void work_handler(void *vp) { struct my_work_data *p = vp; - p->x += 2; + p->y = p->x * 2; +} + +/** \brief how work is destructed */ +static void work_destroy(void *vp) +{ + struct my_work_data *p = vp; + xfree(p); } -static void test_1(void) +/** \brief see if we can create and destroy without problems */ +static void test_create_destroy(void) { int fd; - sel_thread_t p = sel_thread_create(work_handler, &fd); + sel_thread_t p = sel_thread_create(work_handler, 0, &fd, 1); YAZ_CHECK(p); + if (!p) + return; sel_thread_destroy(p); } + +void iochan_handler(struct iochan *i, int event) +{ + static int number = 0; + sel_thread_t p = iochan_getdata(i); + + if (event & EVENT_INPUT) + { + struct my_work_data *work; + + work = sel_thread_result(p); + + YAZ_CHECK(work); + if (work) + { + YAZ_CHECK_EQ(work->x * 2, work->y); + /* stop work after a couple of iterations */ + if (work->x > 10) + iochan_destroy(i); + + xfree(work); + } + + } + if (event & EVENT_TIMEOUT) + { + struct my_work_data *work; + + work = xmalloc(sizeof(*work)); + work->x = number; + sel_thread_add(p, work); + + work = xmalloc(sizeof(*work)); + work->x = number+1; + sel_thread_add(p, work); + + number += 10; + } +} + +/** brief use the fd for something */ +static void test_for_real_work(int no_threads) +{ + int thread_fd; + sel_thread_t p = sel_thread_create(work_handler, work_destroy, + &thread_fd, no_threads); + YAZ_CHECK(p); + if (p) + { + iochan_man_t chan_man = iochan_man_create(10, 0); + IOCHAN chan = iochan_create(thread_fd, iochan_handler, + EVENT_INPUT|EVENT_TIMEOUT, "test_chan"); + iochan_settimeout(chan, 1); + iochan_setdata(chan, p); + iochan_add(chan_man, chan, -1); + + iochan_man_events(chan_man); + sel_thread_destroy(p); + iochan_man_destroy(&chan_man); + } +} + int main(int argc, char **argv) { - YAZ_CHECK_INIT(argc, argv); - YAZ_CHECK_LOG(); + YAZ_CHECK_INIT(argc, argv); + YAZ_CHECK_LOG(); - test_1(); + test_create_destroy(); + test_for_real_work(1); + test_for_real_work(3); YAZ_CHECK_TERM; } @@ -61,7 +138,9 @@ int main(int argc, char **argv) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +