crusher-eventmachine 0.12.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. data/README +81 -0
  2. data/Rakefile +370 -0
  3. data/docs/COPYING +60 -0
  4. data/docs/ChangeLog +211 -0
  5. data/docs/DEFERRABLES +246 -0
  6. data/docs/EPOLL +141 -0
  7. data/docs/GNU +281 -0
  8. data/docs/INSTALL +13 -0
  9. data/docs/KEYBOARD +42 -0
  10. data/docs/LEGAL +25 -0
  11. data/docs/LIGHTWEIGHT_CONCURRENCY +130 -0
  12. data/docs/PURE_RUBY +75 -0
  13. data/docs/RELEASE_NOTES +94 -0
  14. data/docs/SMTP +4 -0
  15. data/docs/SPAWNED_PROCESSES +148 -0
  16. data/docs/TODO +8 -0
  17. data/eventmachine.gemspec +40 -0
  18. data/examples/ex_channel.rb +43 -0
  19. data/examples/ex_queue.rb +2 -0
  20. data/examples/ex_tick_loop_array.rb +15 -0
  21. data/examples/ex_tick_loop_counter.rb +32 -0
  22. data/examples/helper.rb +2 -0
  23. data/ext/binder.cpp +124 -0
  24. data/ext/binder.h +46 -0
  25. data/ext/cmain.cpp +852 -0
  26. data/ext/cplusplus.cpp +202 -0
  27. data/ext/ed.cpp +1884 -0
  28. data/ext/ed.h +418 -0
  29. data/ext/em.cpp +2377 -0
  30. data/ext/em.h +239 -0
  31. data/ext/emwin.cpp +300 -0
  32. data/ext/emwin.h +94 -0
  33. data/ext/epoll.cpp +26 -0
  34. data/ext/epoll.h +25 -0
  35. data/ext/eventmachine.h +124 -0
  36. data/ext/eventmachine_cpp.h +96 -0
  37. data/ext/extconf.rb +150 -0
  38. data/ext/fastfilereader/extconf.rb +85 -0
  39. data/ext/fastfilereader/mapper.cpp +214 -0
  40. data/ext/fastfilereader/mapper.h +59 -0
  41. data/ext/fastfilereader/rubymain.cpp +127 -0
  42. data/ext/files.cpp +94 -0
  43. data/ext/files.h +65 -0
  44. data/ext/kb.cpp +79 -0
  45. data/ext/page.cpp +107 -0
  46. data/ext/page.h +51 -0
  47. data/ext/pipe.cpp +347 -0
  48. data/ext/project.h +157 -0
  49. data/ext/rubymain.cpp +1215 -0
  50. data/ext/sigs.cpp +89 -0
  51. data/ext/sigs.h +32 -0
  52. data/ext/ssl.cpp +460 -0
  53. data/ext/ssl.h +94 -0
  54. data/java/.classpath +8 -0
  55. data/java/.project +17 -0
  56. data/java/src/com/rubyeventmachine/EmReactor.java +571 -0
  57. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  58. data/java/src/com/rubyeventmachine/EventableChannel.java +69 -0
  59. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +189 -0
  60. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
  61. data/java/src/com/rubyeventmachine/application/Application.java +194 -0
  62. data/java/src/com/rubyeventmachine/application/Connection.java +74 -0
  63. data/java/src/com/rubyeventmachine/application/ConnectionFactory.java +37 -0
  64. data/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +46 -0
  65. data/java/src/com/rubyeventmachine/application/PeriodicTimer.java +38 -0
  66. data/java/src/com/rubyeventmachine/application/Timer.java +54 -0
  67. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +109 -0
  68. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +148 -0
  69. data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
  70. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
  71. data/java/src/com/rubyeventmachine/tests/TestServers.java +75 -0
  72. data/java/src/com/rubyeventmachine/tests/TestTimers.java +90 -0
  73. data/lib/em/buftok.rb +138 -0
  74. data/lib/em/callback.rb +26 -0
  75. data/lib/em/channel.rb +57 -0
  76. data/lib/em/connection.rb +569 -0
  77. data/lib/em/deferrable.rb +206 -0
  78. data/lib/em/file_watch.rb +54 -0
  79. data/lib/em/future.rb +61 -0
  80. data/lib/em/iterator.rb +270 -0
  81. data/lib/em/messages.rb +66 -0
  82. data/lib/em/process_watch.rb +44 -0
  83. data/lib/em/processes.rb +119 -0
  84. data/lib/em/protocols.rb +36 -0
  85. data/lib/em/protocols/header_and_content.rb +138 -0
  86. data/lib/em/protocols/httpclient.rb +276 -0
  87. data/lib/em/protocols/httpclient2.rb +590 -0
  88. data/lib/em/protocols/line_and_text.rb +125 -0
  89. data/lib/em/protocols/linetext2.rb +161 -0
  90. data/lib/em/protocols/memcache.rb +323 -0
  91. data/lib/em/protocols/object_protocol.rb +45 -0
  92. data/lib/em/protocols/postgres3.rb +247 -0
  93. data/lib/em/protocols/saslauth.rb +175 -0
  94. data/lib/em/protocols/smtpclient.rb +357 -0
  95. data/lib/em/protocols/smtpserver.rb +640 -0
  96. data/lib/em/protocols/socks4.rb +66 -0
  97. data/lib/em/protocols/stomp.rb +200 -0
  98. data/lib/em/protocols/tcptest.rb +53 -0
  99. data/lib/em/pure_ruby.rb +1019 -0
  100. data/lib/em/queue.rb +62 -0
  101. data/lib/em/spawnable.rb +85 -0
  102. data/lib/em/streamer.rb +130 -0
  103. data/lib/em/tick_loop.rb +85 -0
  104. data/lib/em/timers.rb +57 -0
  105. data/lib/em/version.rb +3 -0
  106. data/lib/eventmachine.rb +1540 -0
  107. data/lib/evma.rb +32 -0
  108. data/lib/evma/callback.rb +32 -0
  109. data/lib/evma/container.rb +75 -0
  110. data/lib/evma/factory.rb +77 -0
  111. data/lib/evma/protocol.rb +87 -0
  112. data/lib/evma/reactor.rb +48 -0
  113. data/lib/jeventmachine.rb +257 -0
  114. data/setup.rb +1585 -0
  115. data/tasks/cpp.rake_example +77 -0
  116. data/tests/client.crt +31 -0
  117. data/tests/client.key +51 -0
  118. data/tests/test_attach.rb +136 -0
  119. data/tests/test_basic.rb +249 -0
  120. data/tests/test_channel.rb +63 -0
  121. data/tests/test_connection_count.rb +35 -0
  122. data/tests/test_defer.rb +49 -0
  123. data/tests/test_deferrable.rb +35 -0
  124. data/tests/test_epoll.rb +160 -0
  125. data/tests/test_error_handler.rb +35 -0
  126. data/tests/test_errors.rb +82 -0
  127. data/tests/test_exc.rb +55 -0
  128. data/tests/test_file_watch.rb +49 -0
  129. data/tests/test_futures.rb +198 -0
  130. data/tests/test_get_sock_opt.rb +30 -0
  131. data/tests/test_handler_check.rb +37 -0
  132. data/tests/test_hc.rb +190 -0
  133. data/tests/test_httpclient.rb +227 -0
  134. data/tests/test_httpclient2.rb +154 -0
  135. data/tests/test_inactivity_timeout.rb +50 -0
  136. data/tests/test_kb.rb +60 -0
  137. data/tests/test_ltp.rb +190 -0
  138. data/tests/test_ltp2.rb +317 -0
  139. data/tests/test_next_tick.rb +133 -0
  140. data/tests/test_object_protocol.rb +37 -0
  141. data/tests/test_pause.rb +70 -0
  142. data/tests/test_pending_connect_timeout.rb +48 -0
  143. data/tests/test_process_watch.rb +50 -0
  144. data/tests/test_processes.rb +128 -0
  145. data/tests/test_proxy_connection.rb +144 -0
  146. data/tests/test_pure.rb +134 -0
  147. data/tests/test_queue.rb +44 -0
  148. data/tests/test_running.rb +42 -0
  149. data/tests/test_sasl.rb +72 -0
  150. data/tests/test_send_file.rb +251 -0
  151. data/tests/test_servers.rb +76 -0
  152. data/tests/test_smtpclient.rb +83 -0
  153. data/tests/test_smtpserver.rb +85 -0
  154. data/tests/test_spawn.rb +322 -0
  155. data/tests/test_ssl_args.rb +79 -0
  156. data/tests/test_ssl_methods.rb +50 -0
  157. data/tests/test_ssl_verify.rb +82 -0
  158. data/tests/test_tick_loop.rb +59 -0
  159. data/tests/test_timers.rb +160 -0
  160. data/tests/test_ud.rb +36 -0
  161. data/tests/testem.rb +31 -0
  162. metadata +251 -0
data/ext/em.h ADDED
@@ -0,0 +1,239 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: em.h
6
+ Date: 06Apr06
7
+
8
+ Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
9
+ Gmail: blackhedd
10
+
11
+ This program is free software; you can redistribute it and/or modify
12
+ it under the terms of either: 1) the GNU General Public License
13
+ as published by the Free Software Foundation; either version 2 of the
14
+ License, or (at your option) any later version; or 2) Ruby's License.
15
+
16
+ See the file COPYING for complete licensing information.
17
+
18
+ *****************************************************************************/
19
+
20
+
21
+
22
+ #ifdef OS_WIN32
23
+ #include "emwin.h"
24
+ #endif
25
+
26
+
27
+ // THIS ENTIRE FILE WILL EVENTUALLY BE FOR UNIX BUILDS ONLY.
28
+ //#ifdef OS_UNIX
29
+
30
+ #ifndef __EventMachine__H_
31
+ #define __EventMachine__H_
32
+
33
+ #ifdef BUILD_FOR_RUBY
34
+ #include <ruby.h>
35
+ #define EmSelect rb_thread_select
36
+
37
+ #if defined(HAVE_RBTRAP)
38
+ #include <rubysig.h>
39
+ #elif defined(HAVE_RB_THREAD_CHECK_INTS)
40
+ extern "C" {
41
+ void rb_enable_interrupt(void);
42
+ void rb_disable_interrupt(void);
43
+ }
44
+
45
+ #define TRAP_BEG rb_enable_interrupt()
46
+ #define TRAP_END do { rb_disable_interrupt(); rb_thread_check_ints(); } while(0)
47
+ #else
48
+ #define TRAP_BEG
49
+ #define TRAP_END
50
+ #endif
51
+
52
+ // 1.9.0 compat
53
+ #ifndef RUBY_UBF_IO
54
+ #define RUBY_UBF_IO RB_UBF_DFL
55
+ #endif
56
+ #else
57
+ #define EmSelect select
58
+ #endif
59
+
60
+ class EventableDescriptor;
61
+ class InotifyDescriptor;
62
+
63
+
64
+ /********************
65
+ class EventMachine_t
66
+ ********************/
67
+
68
+ class EventMachine_t
69
+ {
70
+ public:
71
+ static int GetMaxTimerCount();
72
+ static void SetMaxTimerCount (int);
73
+
74
+ public:
75
+ EventMachine_t (EMCallback);
76
+ virtual ~EventMachine_t();
77
+
78
+ void Run();
79
+ void ScheduleHalt();
80
+ void SignalLoopBreaker();
81
+ const unsigned long InstallOneshotTimer (int);
82
+ const unsigned long ConnectToServer (const char *, int, const char *, int);
83
+ const unsigned long ConnectToUnixServer (const char *);
84
+
85
+ const unsigned long CreateTcpServer (const char *, int);
86
+ const unsigned long OpenDatagramSocket (const char *, int);
87
+ const unsigned long CreateUnixDomainServer (const char*);
88
+ const unsigned long _OpenFileForWriting (const char*);
89
+ const unsigned long OpenKeyboard();
90
+ //const char *Popen (const char*, const char*);
91
+ const unsigned long Socketpair (char* const*);
92
+
93
+ void Add (EventableDescriptor*);
94
+ void Modify (EventableDescriptor*);
95
+
96
+ const unsigned long AttachFD (int, bool);
97
+ int DetachFD (EventableDescriptor*);
98
+
99
+ void ArmKqueueWriter (EventableDescriptor*);
100
+ void ArmKqueueReader (EventableDescriptor*);
101
+
102
+ void SetTimerQuantum (int);
103
+ static void SetuidString (const char*);
104
+ static int SetRlimitNofile (int);
105
+
106
+ pid_t SubprocessPid;
107
+ int SubprocessExitStatus;
108
+
109
+ int GetConnectionCount();
110
+ float GetHeartbeatInterval();
111
+ int SetHeartbeatInterval(float);
112
+
113
+ const unsigned long WatchFile (const char*);
114
+ void UnwatchFile (int);
115
+ void UnwatchFile (const unsigned long);
116
+
117
+ #ifdef HAVE_KQUEUE
118
+ void _HandleKqueueFileEvent (struct kevent*);
119
+ void _RegisterKqueueFileEvent(int);
120
+ #endif
121
+
122
+ const unsigned long WatchPid (int);
123
+ void UnwatchPid (int);
124
+ void UnwatchPid (const unsigned long);
125
+
126
+ #ifdef HAVE_KQUEUE
127
+ void _HandleKqueuePidEvent (struct kevent*);
128
+ #endif
129
+
130
+ uint64_t GetCurrentLoopTime() { return MyCurrentLoopTime; }
131
+
132
+ // Temporary:
133
+ void _UseEpoll();
134
+ void _UseKqueue();
135
+
136
+ bool UsingKqueue() { return bKqueue; }
137
+ bool UsingEpoll() { return bEpoll; }
138
+
139
+ void QueueHeartbeat(EventableDescriptor*);
140
+ void ClearHeartbeat(uint64_t);
141
+
142
+ uint64_t GetRealTime();
143
+
144
+ private:
145
+ bool _RunOnce();
146
+ bool _RunTimers();
147
+ void _UpdateTime();
148
+ void _AddNewDescriptors();
149
+ void _ModifyDescriptors();
150
+ void _InitializeLoopBreaker();
151
+ void _CleanupSockets();
152
+
153
+ bool _RunSelectOnce();
154
+ bool _RunEpollOnce();
155
+ bool _RunKqueueOnce();
156
+
157
+ void _ModifyEpollEvent (EventableDescriptor*);
158
+ void _DispatchHeartbeats();
159
+ timeval _TimeTilNextEvent();
160
+ void _CleanBadDescriptors();
161
+
162
+ public:
163
+ void _ReadLoopBreaker();
164
+ void _ReadInotifyEvents();
165
+
166
+ private:
167
+ enum {
168
+ MaxEpollDescriptors = 64*1024,
169
+ MaxEvents = 4096
170
+ };
171
+ int HeartbeatInterval;
172
+ EMCallback EventCallback;
173
+
174
+ class Timer_t: public Bindable_t {
175
+ };
176
+
177
+ multimap<uint64_t, Timer_t> Timers;
178
+ multimap<uint64_t, EventableDescriptor*> Heartbeats;
179
+ map<int, Bindable_t*> Files;
180
+ map<int, Bindable_t*> Pids;
181
+ vector<EventableDescriptor*> Descriptors;
182
+ vector<EventableDescriptor*> NewDescriptors;
183
+ set<EventableDescriptor*> ModifiedDescriptors;
184
+
185
+ uint64_t NextHeartbeatTime;
186
+
187
+ int LoopBreakerReader;
188
+ int LoopBreakerWriter;
189
+ #ifdef OS_WIN32
190
+ struct sockaddr_in LoopBreakerTarget;
191
+ #endif
192
+
193
+ timeval Quantum;
194
+
195
+ uint64_t MyCurrentLoopTime;
196
+
197
+ #ifdef OS_WIN32
198
+ unsigned TickCountTickover;
199
+ unsigned LastTickCount;
200
+ #endif
201
+
202
+ private:
203
+ bool bEpoll;
204
+ int epfd; // Epoll file-descriptor
205
+ #ifdef HAVE_EPOLL
206
+ struct epoll_event epoll_events [MaxEvents];
207
+ #endif
208
+
209
+ bool bKqueue;
210
+ int kqfd; // Kqueue file-descriptor
211
+ #ifdef HAVE_KQUEUE
212
+ struct kevent Karray [MaxEvents];
213
+ #endif
214
+
215
+ InotifyDescriptor *inotify; // pollable descriptor for our inotify instance
216
+ };
217
+
218
+
219
+ /*******************
220
+ struct SelectData_t
221
+ *******************/
222
+
223
+ struct SelectData_t
224
+ {
225
+ SelectData_t();
226
+
227
+ int _Select();
228
+
229
+ int maxsocket;
230
+ fd_set fdreads;
231
+ fd_set fdwrites;
232
+ fd_set fderrors;
233
+ timeval tv;
234
+ int nSockets;
235
+ };
236
+
237
+ #endif // __EventMachine__H_
238
+
239
+ //#endif // OS_UNIX
data/ext/emwin.cpp ADDED
@@ -0,0 +1,300 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: emwin.cpp
6
+ Date: 05May06
7
+
8
+ Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
9
+ Gmail: blackhedd
10
+
11
+ This program is free software; you can redistribute it and/or modify
12
+ it under the terms of either: 1) the GNU General Public License
13
+ as published by the Free Software Foundation; either version 2 of the
14
+ License, or (at your option) any later version; or 2) Ruby's License.
15
+
16
+ See the file COPYING for complete licensing information.
17
+
18
+ *****************************************************************************/
19
+
20
+
21
+ // THIS ENTIRE FILE IS FOR WINDOWS BUILDS ONLY
22
+ // INCOMPLETE AND DISABLED FOR NOW.
23
+ #ifdef xOS_WIN32
24
+
25
+ #include "project.h"
26
+
27
+
28
+ // Keep a global variable floating around
29
+ // with the current loop time as set by the Event Machine.
30
+ // This avoids the need for frequent expensive calls to time(NULL);
31
+ time_t gCurrentLoopTime;
32
+
33
+
34
+ /******************************
35
+ EventMachine_t::EventMachine_t
36
+ ******************************/
37
+
38
+ EventMachine_t::EventMachine_t (void (*event_callback)(const char*, int, const char*, int)):
39
+ EventCallback (event_callback),
40
+ NextHeartbeatTime (0)
41
+ {
42
+ gTerminateSignalReceived = false;
43
+ Iocp = NULL;
44
+ }
45
+
46
+
47
+ /*******************************
48
+ EventMachine_t::~EventMachine_t
49
+ *******************************/
50
+
51
+ EventMachine_t::~EventMachine_t()
52
+ {
53
+ cerr << "EM __dt\n";
54
+ if (Iocp)
55
+ CloseHandle (Iocp);
56
+ }
57
+
58
+
59
+ /****************************
60
+ EventMachine_t::ScheduleHalt
61
+ ****************************/
62
+
63
+ void EventMachine_t::ScheduleHalt()
64
+ {
65
+ /* This is how we stop the machine.
66
+ * This can be called by clients. Signal handlers will probably
67
+ * set the global flag.
68
+ * For now this means there can only be one EventMachine ever running at a time.
69
+ */
70
+ gTerminateSignalReceived = true;
71
+ }
72
+
73
+
74
+
75
+ /*******************
76
+ EventMachine_t::Run
77
+ *******************/
78
+
79
+ void EventMachine_t::Run()
80
+ {
81
+ HookControlC (true);
82
+
83
+ Iocp = CreateIoCompletionPort (INVALID_HANDLE_VALUE, NULL, 0, 0);
84
+ if (Iocp == NULL)
85
+ throw std::runtime_error ("no completion port");
86
+
87
+
88
+ DWORD nBytes, nCompletionKey;
89
+ LPOVERLAPPED Overlapped;
90
+
91
+ do {
92
+ gCurrentLoopTime = time(NULL);
93
+ // Have some kind of strategy that will dequeue maybe up to 10 completions
94
+ // without running the timers as long as they are available immediately.
95
+ // Otherwise in a busy server we're calling them every time through the loop.
96
+ if (!_RunTimers())
97
+ break;
98
+ if (GetQueuedCompletionStatus (Iocp, &nBytes, &nCompletionKey, &Overlapped, 1000)) {
99
+ }
100
+ cerr << "+";
101
+ } while (!gTerminateSignalReceived);
102
+
103
+
104
+ /*
105
+ while (true) {
106
+ gCurrentLoopTime = time(NULL);
107
+ if (!_RunTimers())
108
+ break;
109
+ _AddNewDescriptors();
110
+ if (!_RunOnce())
111
+ break;
112
+ if (gTerminateSignalReceived)
113
+ break;
114
+ }
115
+ */
116
+
117
+ HookControlC (false);
118
+ }
119
+
120
+
121
+ /**************************
122
+ EventMachine_t::_RunTimers
123
+ **************************/
124
+
125
+ bool EventMachine_t::_RunTimers()
126
+ {
127
+ // These are caller-defined timer handlers.
128
+ // Return T/F to indicate whether we should continue the main loop.
129
+ // We rely on the fact that multimaps sort by their keys to avoid
130
+ // inspecting the whole list every time we come here.
131
+ // Just keep inspecting and processing the list head until we hit
132
+ // one that hasn't expired yet.
133
+
134
+ while (true) {
135
+ multimap<time_t,Timer_t>::iterator i = Timers.begin();
136
+ if (i == Timers.end())
137
+ break;
138
+ if (i->first > gCurrentLoopTime)
139
+ break;
140
+ if (EventCallback)
141
+ (*EventCallback) (NULL, EM_TIMER_FIRED, NULL, i->second.GetBinding());
142
+ Timers.erase (i);
143
+ }
144
+ return true;
145
+ }
146
+
147
+
148
+ /***********************************
149
+ EventMachine_t::InstallOneshotTimer
150
+ ***********************************/
151
+
152
+ const char *EventMachine_t::InstallOneshotTimer (int seconds)
153
+ {
154
+ if (Timers.size() > MaxOutstandingTimers)
155
+ return false;
156
+ // Don't use the global loop-time variable here, because we might
157
+ // get called before the main event machine is running.
158
+
159
+ Timer_t t;
160
+ Timers.insert (make_pair (time(NULL) + seconds, t));
161
+ return t.GetBinding();
162
+ }
163
+
164
+
165
+ /**********************************
166
+ EventMachine_t::OpenDatagramSocket
167
+ **********************************/
168
+
169
+ const char *EventMachine_t::OpenDatagramSocket (const char *address, int port)
170
+ {
171
+ cerr << "OPEN DATAGRAM SOCKET\n";
172
+ return "Unimplemented";
173
+ }
174
+
175
+
176
+ /*******************************
177
+ EventMachine_t::CreateTcpServer
178
+ *******************************/
179
+
180
+ const char *EventMachine_t::CreateTcpServer (const char *server, int port)
181
+ {
182
+ /* Create a TCP-acceptor (server) socket and add it to the event machine.
183
+ * Return the binding of the new acceptor to the caller.
184
+ * This binding will be referenced when the new acceptor sends events
185
+ * to indicate accepted connections.
186
+ */
187
+
188
+ const char *output_binding = NULL;
189
+
190
+ struct sockaddr_in sin;
191
+
192
+ SOCKET sd_accept = socket (AF_INET, SOCK_STREAM, 0);
193
+ if (sd_accept == INVALID_SOCKET) {
194
+ goto fail;
195
+ }
196
+
197
+ memset (&sin, 0, sizeof(sin));
198
+ sin.sin_family = AF_INET;
199
+ sin.sin_addr.s_addr = INADDR_ANY;
200
+ sin.sin_port = htons (port);
201
+
202
+ if (server && *server) {
203
+ sin.sin_addr.s_addr = inet_addr (server);
204
+ if (sin.sin_addr.s_addr == INADDR_NONE) {
205
+ hostent *hp = gethostbyname (server);
206
+ if (hp == NULL) {
207
+ //__warning ("hostname not resolved: ", server);
208
+ goto fail;
209
+ }
210
+ sin.sin_addr.s_addr = ((in_addr*)(hp->h_addr))->s_addr;
211
+ }
212
+ }
213
+
214
+
215
+ // No need to set reuseaddr on Windows.
216
+
217
+
218
+ if (bind (sd_accept, (struct sockaddr*)&sin, sizeof(sin))) {
219
+ //__warning ("binding failed");
220
+ goto fail;
221
+ }
222
+
223
+ if (listen (sd_accept, 100)) {
224
+ //__warning ("listen failed");
225
+ goto fail;
226
+ }
227
+
228
+ { // Looking good.
229
+ AcceptorDescriptor *ad = new AcceptorDescriptor (this, sd_accept);
230
+ if (!ad)
231
+ throw std::runtime_error ("unable to allocate acceptor");
232
+ Add (ad);
233
+ output_binding = ad->GetBinding();
234
+
235
+ CreateIoCompletionPort ((HANDLE)sd_accept, Iocp, NULL, 0);
236
+ SOCKET sd = socket (AF_INET, SOCK_STREAM, 0);
237
+ CreateIoCompletionPort ((HANDLE)sd, Iocp, NULL, 0);
238
+ AcceptEx (sd_accept, sd,
239
+ }
240
+
241
+ return output_binding;
242
+
243
+ fail:
244
+ if (sd_accept != INVALID_SOCKET)
245
+ closesocket (sd_accept);
246
+ return NULL;
247
+ }
248
+
249
+
250
+ /*******************************
251
+ EventMachine_t::ConnectToServer
252
+ *******************************/
253
+
254
+ const char *EventMachine_t::ConnectToServer (const char *server, int port)
255
+ {
256
+ if (!server || !*server || !port)
257
+ return NULL;
258
+
259
+ sockaddr_in pin;
260
+ unsigned long HostAddr;
261
+
262
+ HostAddr = inet_addr (server);
263
+ if (HostAddr == INADDR_NONE) {
264
+ hostent *hp = gethostbyname (server);
265
+ if (!hp)
266
+ return NULL;
267
+ HostAddr = ((in_addr*)(hp->h_addr))->s_addr;
268
+ }
269
+
270
+ memset (&pin, 0, sizeof(pin));
271
+ pin.sin_family = AF_INET;
272
+ pin.sin_addr.s_addr = HostAddr;
273
+ pin.sin_port = htons (port);
274
+
275
+ int sd = socket (AF_INET, SOCK_STREAM, 0);
276
+ if (sd == INVALID_SOCKET)
277
+ return NULL;
278
+
279
+
280
+ LPOVERLAPPED olap = (LPOVERLAPPED) calloc (1, sizeof (OVERLAPPED));
281
+ cerr << "I'm dying now\n";
282
+ throw runtime_error ("UNIMPLEMENTED!!!\n");
283
+
284
+ }
285
+
286
+
287
+
288
+ /*******************
289
+ EventMachine_t::Add
290
+ *******************/
291
+
292
+ void EventMachine_t::Add (EventableDescriptor *ed)
293
+ {
294
+ cerr << "ADD\n";
295
+ }
296
+
297
+
298
+
299
+ #endif // OS_WIN32
300
+