00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef LIBMUTH_SELECTSCHEDULER_H
00020 #define LIBMUTH_SELECTSCHEDULER_H
00021
00022 #include <map>
00023 #include <sys/types.h>
00024 #ifndef __WIN32__
00025 #include <sys/time.h>
00026 #include <unistd.h>
00027 #include <sys/select.h>
00028 #else
00029 #include "win32.h"
00030 #endif
00031 #include "basescheduler_decls.h"
00032 #include "callback_decls.h"
00033 #include "lock.h"
00034 #include "timeval_decls.h"
00035 #include "waitqueue.h"
00036
00040 class SelectScheduler : public BaseScheduler {
00041 private:
00042
00043
00044
00045 Lock datalock;
00046
00047
00048
00049
00050
00051
00052
00053
00054 std::map<int, Callback*> rfds, wfds, efds;
00055 WaitQueue waits;
00056
00057 Lock notifylock;
00058 bool notified;
00059 int rpipe, wpipe;
00060 void notifyme();
00061 fd_set rfdset[1], wfdset[1], efdset[1];
00062 protected:
00067 SelectScheduler(BlockingQueue<Microthread*> *q=NULL);
00068 public:
00074 static SelectScheduler &create(
00075 BlockingQueue<Microthread*> *q=NULL);
00076 void addReadCallback(Callback &cb, int fd);
00077 void addWriteCallback(Callback &cb, int fd);
00084 void addExceptCallback(Callback &cb, int fd);
00085 void addWaitCallback(Callback &cb, const timeval &tv);
00086 void run();
00087 };
00088
00089 #endif