00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #include "config.h"
00025
00026 #include <cassert>
00027 #include <cerrno>
00028 #include <cstring>
00029 #include <unistd.h>
00030
00031 #include <scalestack/event/test/handler.h>
00032 #include <scalestack/event/test/test.h>
00033 #include <scalestack/kernel/module.h>
00034
00035 namespace scalestack
00036 {
00037 namespace event
00038 {
00039 namespace test
00040 {
00041
00042
00043
00044
00045
00046 handler::handler(test& test, handler::state fatal):
00047 event::handler(test._handler_service),
00048 _state(),
00049 _fatal(fatal),
00050 _close_count(),
00051 _test(test),
00052 _pipe()
00053 {
00054 if (pipe(_pipe) == -1)
00055 _module.log_fatal(_("Failed pipe: %s:%d"), strerror(errno), errno);
00056 start();
00057 }
00058
00059 handler::~handler()
00060 {
00061 close(_pipe[0]);
00062 close(_pipe[1]);
00063 assert(_state = _fatal);
00064 _test.remove_handler();
00065
00066 if (_state == STATE_DONE)
00067 assert(_close_count == 4);
00068 }
00069
00070 void handler::started(void)
00071 {
00072 _state = STATE_START;
00073 if (_fatal == STATE_START)
00074 _module.log_fatal("Fatal start");
00075
00076 if (_fatal == STATE_TIMER)
00077 {
00078 set_timer(1);
00079 usleep(2000);
00080 }
00081 else
00082 set_timer(100);
00083 }
00084
00085 void handler::timer_expired(void)
00086 {
00087 _state = STATE_TIMER;
00088 if (_fatal == STATE_TIMER)
00089 _module.log_fatal("Fatal timer");
00090
00091 set_timer(1);
00092 set_timer(0);
00093
00094 int test_pipe[2];
00095 if (pipe(test_pipe) == -1)
00096 _module.log_fatal(_("Failed pipe: %s:%d"), strerror(errno), errno);
00097
00098 set_file_descriptor(test_pipe[0]);
00099 set_file_descriptor(test_pipe[1]);
00100 close(test_pipe[0]);
00101 close(test_pipe[1]);
00102
00103 set_file_descriptor(_pipe[1]);
00104 watch_write();
00105 }
00106
00107 void handler::close_file_descriptor(int)
00108 {
00109 _close_count++;
00110 }
00111
00112 void handler::read_ready(int)
00113 {
00114 _state = STATE_READ;
00115 if (_fatal == STATE_READ)
00116 _module.log_fatal("Fatal read");
00117 char buffer[1024];
00118 if (read(_pipe[0], buffer, sizeof(buffer)) == -1 && errno != EINTR)
00119 _module.log_fatal(_("Failed pipe read: %s:%d"), strerror(errno), errno);
00120 run_now();
00121 }
00122
00123 void handler::write_ready(int)
00124 {
00125 _state = STATE_WRITE;
00126 if (_fatal == STATE_WRITE)
00127 _module.log_fatal("Fatal write");
00128 if (write(_pipe[1], "\0", 1) == -1 && errno != EINTR)
00129 _module.log_fatal(_("Failed pipe write: %s:%d"), strerror(errno), errno);
00130 set_file_descriptor(_pipe[0]);
00131 watch_read();
00132 }
00133
00134 void handler::run(void)
00135 {
00136 _state = STATE_RUN;
00137 if (_fatal == STATE_RUN)
00138 _module.log_fatal("Fatal run");
00139 shutdown();
00140 _state = STATE_DONE;
00141 }
00142
00143 }
00144 }
00145 }