libshevek

- Main Page
- Classes
- Files

- File List

src/closure.hh

    00001 /* closure.hh - Cooperative multitasking
    00002  * Copyright 2008 Bas Wijnen <wijnen@debian.org>
    00003  *
    00004  * This program is free software: you can redistribute it and/or modify
    00005  * it under the terms of the GNU General Public License as published by
    00006  * the Free Software Foundation, either version 3 of the License, or
    00007  * (at your option) any later version.
    00008  *
    00009  * This program is distributed in the hope that it will be useful,
    00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    00012  * GNU General Public License for more details.
    00013  *
    00014  * You should have received a copy of the GNU General Public License
    00015  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    00016  */
    00017
    00018 #ifndef SHEVEK_CLOSURE_HH
    00019 #define SHEVEK_CLOSURE_HH
    00020
    00021 #include <pthread.h>
    00022 #include "refbase.hh"
    00023
    00024 namespace shevek
    00025 {
    00027
    00036         class closure : public refbase
    00037         {
    00038                 static closure *current;
    00039                 enum state_t { EMPTY, BLOCKING, RUNNING } state;
    00040                 sigc::slot0 <void> callback, function;
    00041                 pthread_t thread;
    00042                 int blocking_pipe[2];
    00043                 int waking_pipe[2];
    00044                 void do_write (int *fds);
    00045                 void do_read (int *fds);
    00046                 static void *start_wrapper (void *me);
    00047                 closure ();
    00048         public:
    00050
    00052                 static Glib::RefPtr <closure> create ()
    00053                 { return Glib::RefPtr <closure> (new closure ()); }
    00055
    00058                 bool empty () const { return state == EMPTY; }
    00060
    00064                 void set_function (sigc::slot0 <void> func, bool run = true,
    00065                                 sigc::slot0 <void> cb = sigc::slot0 <void> ());
    00067                 ~closure ();
    00069
    00075                 static void block ();
    00077
    00081                 void wake ();
    00082         };
    00083 }
    00084
    00085 #endif