eventmachine-maglev- 0.12.10

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 (158) hide show
  1. data/.gitignore +14 -0
  2. data/README +82 -0
  3. data/Rakefile +374 -0
  4. data/docs/COPYING +60 -0
  5. data/docs/ChangeLog +211 -0
  6. data/docs/DEFERRABLES +133 -0
  7. data/docs/EPOLL +141 -0
  8. data/docs/GNU +281 -0
  9. data/docs/INSTALL +13 -0
  10. data/docs/KEYBOARD +38 -0
  11. data/docs/LEGAL +25 -0
  12. data/docs/LIGHTWEIGHT_CONCURRENCY +70 -0
  13. data/docs/PURE_RUBY +75 -0
  14. data/docs/RELEASE_NOTES +94 -0
  15. data/docs/SMTP +2 -0
  16. data/docs/SPAWNED_PROCESSES +89 -0
  17. data/docs/TODO +8 -0
  18. data/eventmachine.gemspec +40 -0
  19. data/examples/ex_channel.rb +43 -0
  20. data/examples/ex_queue.rb +2 -0
  21. data/examples/helper.rb +2 -0
  22. data/ext/binder.cpp +125 -0
  23. data/ext/binder.h +46 -0
  24. data/ext/cmain.cpp +827 -0
  25. data/ext/cplusplus.cpp +202 -0
  26. data/ext/ed.cpp +1893 -0
  27. data/ext/ed.h +424 -0
  28. data/ext/em.cpp +2282 -0
  29. data/ext/em.h +235 -0
  30. data/ext/emwin.cpp +300 -0
  31. data/ext/emwin.h +94 -0
  32. data/ext/epoll.cpp +26 -0
  33. data/ext/epoll.h +25 -0
  34. data/ext/eventmachine.h +122 -0
  35. data/ext/eventmachine_cpp.h +96 -0
  36. data/ext/extconf.rb +152 -0
  37. data/ext/fastfilereader/extconf.rb +83 -0
  38. data/ext/fastfilereader/mapper.cpp +214 -0
  39. data/ext/fastfilereader/mapper.h +59 -0
  40. data/ext/fastfilereader/rubymain.cpp +128 -0
  41. data/ext/files.cpp +94 -0
  42. data/ext/files.h +65 -0
  43. data/ext/kb.cpp +81 -0
  44. data/ext/page.cpp +107 -0
  45. data/ext/page.h +51 -0
  46. data/ext/pipe.cpp +349 -0
  47. data/ext/project.h +151 -0
  48. data/ext/rubymain.cpp +1166 -0
  49. data/ext/sigs.cpp +89 -0
  50. data/ext/sigs.h +32 -0
  51. data/ext/ssl.cpp +460 -0
  52. data/ext/ssl.h +94 -0
  53. data/java/.classpath +8 -0
  54. data/java/.project +17 -0
  55. data/java/src/com/rubyeventmachine/EmReactor.java +570 -0
  56. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  57. data/java/src/com/rubyeventmachine/EventableChannel.java +69 -0
  58. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +189 -0
  59. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
  60. data/java/src/com/rubyeventmachine/application/Application.java +194 -0
  61. data/java/src/com/rubyeventmachine/application/Connection.java +74 -0
  62. data/java/src/com/rubyeventmachine/application/ConnectionFactory.java +37 -0
  63. data/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +46 -0
  64. data/java/src/com/rubyeventmachine/application/PeriodicTimer.java +38 -0
  65. data/java/src/com/rubyeventmachine/application/Timer.java +54 -0
  66. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +109 -0
  67. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +148 -0
  68. data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
  69. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
  70. data/java/src/com/rubyeventmachine/tests/TestServers.java +75 -0
  71. data/java/src/com/rubyeventmachine/tests/TestTimers.java +90 -0
  72. data/lib/em/buftok.rb +138 -0
  73. data/lib/em/callback.rb +26 -0
  74. data/lib/em/channel.rb +57 -0
  75. data/lib/em/connection.rb +564 -0
  76. data/lib/em/deferrable.rb +192 -0
  77. data/lib/em/file_watch.rb +54 -0
  78. data/lib/em/future.rb +61 -0
  79. data/lib/em/messages.rb +66 -0
  80. data/lib/em/process_watch.rb +44 -0
  81. data/lib/em/processes.rb +119 -0
  82. data/lib/em/protocols/header_and_content.rb +138 -0
  83. data/lib/em/protocols/httpclient.rb +263 -0
  84. data/lib/em/protocols/httpclient2.rb +590 -0
  85. data/lib/em/protocols/line_and_text.rb +125 -0
  86. data/lib/em/protocols/linetext2.rb +161 -0
  87. data/lib/em/protocols/memcache.rb +323 -0
  88. data/lib/em/protocols/object_protocol.rb +45 -0
  89. data/lib/em/protocols/postgres3.rb +247 -0
  90. data/lib/em/protocols/saslauth.rb +175 -0
  91. data/lib/em/protocols/smtpclient.rb +357 -0
  92. data/lib/em/protocols/smtpserver.rb +547 -0
  93. data/lib/em/protocols/socks4.rb +66 -0
  94. data/lib/em/protocols/stomp.rb +200 -0
  95. data/lib/em/protocols/tcptest.rb +53 -0
  96. data/lib/em/protocols.rb +36 -0
  97. data/lib/em/queue.rb +61 -0
  98. data/lib/em/spawnable.rb +85 -0
  99. data/lib/em/streamer.rb +130 -0
  100. data/lib/em/timers.rb +56 -0
  101. data/lib/em/version.rb +3 -0
  102. data/lib/eventmachine.rb +1592 -0
  103. data/lib/evma/callback.rb +32 -0
  104. data/lib/evma/container.rb +75 -0
  105. data/lib/evma/factory.rb +77 -0
  106. data/lib/evma/protocol.rb +87 -0
  107. data/lib/evma/reactor.rb +48 -0
  108. data/lib/evma.rb +32 -0
  109. data/lib/jeventmachine.rb +257 -0
  110. data/lib/pr_eventmachine.rb +1022 -0
  111. data/setup.rb +1585 -0
  112. data/tasks/cpp.rake_example +77 -0
  113. data/tests/client.crt +31 -0
  114. data/tests/client.key +51 -0
  115. data/tests/test_attach.rb +126 -0
  116. data/tests/test_basic.rb +284 -0
  117. data/tests/test_channel.rb +63 -0
  118. data/tests/test_connection_count.rb +35 -0
  119. data/tests/test_defer.rb +47 -0
  120. data/tests/test_epoll.rb +160 -0
  121. data/tests/test_error_handler.rb +35 -0
  122. data/tests/test_errors.rb +82 -0
  123. data/tests/test_exc.rb +55 -0
  124. data/tests/test_file_watch.rb +49 -0
  125. data/tests/test_futures.rb +198 -0
  126. data/tests/test_get_sock_opt.rb +30 -0
  127. data/tests/test_handler_check.rb +37 -0
  128. data/tests/test_hc.rb +218 -0
  129. data/tests/test_httpclient.rb +218 -0
  130. data/tests/test_httpclient2.rb +153 -0
  131. data/tests/test_inactivity_timeout.rb +50 -0
  132. data/tests/test_kb.rb +60 -0
  133. data/tests/test_ltp.rb +182 -0
  134. data/tests/test_ltp2.rb +317 -0
  135. data/tests/test_next_tick.rb +133 -0
  136. data/tests/test_object_protocol.rb +37 -0
  137. data/tests/test_pause.rb +70 -0
  138. data/tests/test_pending_connect_timeout.rb +48 -0
  139. data/tests/test_process_watch.rb +48 -0
  140. data/tests/test_processes.rb +128 -0
  141. data/tests/test_proxy_connection.rb +92 -0
  142. data/tests/test_pure.rb +125 -0
  143. data/tests/test_queue.rb +44 -0
  144. data/tests/test_running.rb +42 -0
  145. data/tests/test_sasl.rb +72 -0
  146. data/tests/test_send_file.rb +242 -0
  147. data/tests/test_servers.rb +76 -0
  148. data/tests/test_smtpclient.rb +83 -0
  149. data/tests/test_smtpserver.rb +85 -0
  150. data/tests/test_spawn.rb +322 -0
  151. data/tests/test_ssl_args.rb +79 -0
  152. data/tests/test_ssl_methods.rb +50 -0
  153. data/tests/test_ssl_verify.rb +82 -0
  154. data/tests/test_timers.rb +162 -0
  155. data/tests/test_ud.rb +36 -0
  156. data/tests/testem.rb +31 -0
  157. data/web/whatis +7 -0
  158. metadata +239 -0
data/ext/ed.h ADDED
@@ -0,0 +1,424 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: ed.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
+ #ifndef __EventableDescriptor__H_
21
+ #define __EventableDescriptor__H_
22
+
23
+
24
+ class EventMachine_t; // forward reference
25
+ #ifdef WITH_SSL
26
+ class SslBox_t; // forward reference
27
+ #endif
28
+
29
+ bool SetSocketNonblocking (SOCKET);
30
+
31
+
32
+ /*************************
33
+ class EventableDescriptor
34
+ *************************/
35
+
36
+ class EventableDescriptor: public Bindable_t
37
+ {
38
+ public:
39
+ EventableDescriptor (int, EventMachine_t*);
40
+ virtual ~EventableDescriptor();
41
+
42
+ int GetSocket() {return MySocket;}
43
+ void SetSocketInvalid() { MySocket = INVALID_SOCKET; }
44
+ void Close();
45
+
46
+ virtual void Read() = 0;
47
+ virtual void Write() = 0;
48
+ virtual void Heartbeat() = 0;
49
+
50
+ // These methods tell us whether the descriptor
51
+ // should be selected or polled for read/write.
52
+ virtual bool SelectForRead() = 0;
53
+ virtual bool SelectForWrite() = 0;
54
+
55
+ // are we scheduled for a close, or in an error state, or already closed?
56
+ bool ShouldDelete();
57
+ // Do we have any data to write? This is used by ShouldDelete.
58
+ virtual int GetOutboundDataSize() {return 0;}
59
+ virtual bool IsWatchOnly(){ return false; }
60
+
61
+ virtual void ScheduleClose (bool after_writing);
62
+ bool IsCloseScheduled();
63
+ virtual void HandleError(){ ScheduleClose (false); }
64
+
65
+ void SetEventCallback (void (*cb)(const unsigned long, int, const char*, const unsigned long));
66
+
67
+ virtual bool GetPeername (struct sockaddr*) {return false;}
68
+ virtual bool GetSockname (struct sockaddr*) {return false;}
69
+ virtual bool GetSubprocessPid (pid_t*) {return false;}
70
+
71
+ virtual void StartTls() {}
72
+ virtual void SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer) {}
73
+
74
+ #ifdef WITH_SSL
75
+ virtual X509 *GetPeerCert() {return NULL;}
76
+ #endif
77
+
78
+ virtual float GetCommInactivityTimeout() {return 0.0;}
79
+ virtual int SetCommInactivityTimeout (float value) {return 0;}
80
+ float GetPendingConnectTimeout();
81
+ int SetPendingConnectTimeout (float value);
82
+
83
+ #ifdef HAVE_EPOLL
84
+ struct epoll_event *GetEpollEvent() { return &EpollEvent; }
85
+ #endif
86
+
87
+ virtual void StartProxy(const unsigned long, const unsigned long);
88
+ virtual void StopProxy();
89
+ virtual void SetProxiedFrom(EventableDescriptor*, const unsigned long);
90
+ virtual int SendOutboundData(const char*,int){ return -1; }
91
+ virtual bool IsPaused(){ return false; }
92
+ virtual bool Pause(){ return false; }
93
+ virtual bool Resume(){ return false; }
94
+
95
+ private:
96
+ bool bCloseNow;
97
+ bool bCloseAfterWriting;
98
+
99
+ protected:
100
+ int MySocket;
101
+
102
+ void (*EventCallback)(const unsigned long, int, const char*, const unsigned long);
103
+ void _GenericInboundDispatch(const char*, int);
104
+
105
+ Int64 CreatedAt;
106
+ bool bCallbackUnbind;
107
+ int UnbindReasonCode;
108
+ EventableDescriptor *ProxyTarget;
109
+ EventableDescriptor *ProxiedFrom;
110
+
111
+ unsigned long MaxOutboundBufSize;
112
+
113
+ #ifdef HAVE_EPOLL
114
+ struct epoll_event EpollEvent;
115
+ #endif
116
+
117
+ EventMachine_t *MyEventMachine;
118
+ int PendingConnectTimeout;
119
+ };
120
+
121
+
122
+
123
+ /*************************
124
+ class LoopbreakDescriptor
125
+ *************************/
126
+
127
+ class LoopbreakDescriptor: public EventableDescriptor
128
+ {
129
+ public:
130
+ LoopbreakDescriptor (int, EventMachine_t*);
131
+ virtual ~LoopbreakDescriptor() {}
132
+
133
+ virtual void Read();
134
+ virtual void Write();
135
+ virtual void Heartbeat() {}
136
+
137
+ virtual bool SelectForRead() {return true;}
138
+ virtual bool SelectForWrite() {return false;}
139
+ };
140
+
141
+
142
+ /**************************
143
+ class ConnectionDescriptor
144
+ **************************/
145
+
146
+ class ConnectionDescriptor: public EventableDescriptor
147
+ {
148
+ public:
149
+ ConnectionDescriptor (int, EventMachine_t*);
150
+ virtual ~ConnectionDescriptor();
151
+
152
+ static int SendDataToConnection (const unsigned long, const char*, int);
153
+ static void CloseConnection (const unsigned long, bool);
154
+ static int ReportErrorStatus (const unsigned long);
155
+
156
+ int SendOutboundData (const char*, int);
157
+
158
+ void SetConnectPending (bool f);
159
+ virtual void ScheduleClose (bool after_writing);
160
+ virtual void HandleError();
161
+
162
+ void SetNotifyReadable (bool);
163
+ void SetNotifyWritable (bool);
164
+ void SetWatchOnly (bool);
165
+
166
+ bool IsPaused(){ return bPaused; }
167
+ bool Pause();
168
+ bool Resume();
169
+
170
+ bool IsNotifyReadable(){ return bNotifyReadable; }
171
+ bool IsNotifyWritable(){ return bNotifyWritable; }
172
+ virtual bool IsWatchOnly(){ return bWatchOnly; }
173
+
174
+ virtual void Read();
175
+ virtual void Write();
176
+ virtual void Heartbeat();
177
+
178
+ virtual bool SelectForRead();
179
+ virtual bool SelectForWrite();
180
+
181
+ // Do we have any data to write? This is used by ShouldDelete.
182
+ virtual int GetOutboundDataSize() {return OutboundDataSize;}
183
+
184
+ virtual void StartTls();
185
+ virtual void SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer);
186
+
187
+ #ifdef WITH_SSL
188
+ virtual X509 *GetPeerCert();
189
+ virtual bool VerifySslPeer(const char*);
190
+ virtual void AcceptSslPeer();
191
+ #endif
192
+
193
+ void SetServerMode() {bIsServer = true;}
194
+
195
+ virtual bool GetPeername (struct sockaddr*);
196
+ virtual bool GetSockname (struct sockaddr*);
197
+
198
+ virtual float GetCommInactivityTimeout();
199
+ virtual int SetCommInactivityTimeout (float value);
200
+
201
+
202
+ protected:
203
+ struct OutboundPage {
204
+ OutboundPage (const char *b, int l, int o=0): Buffer(b), Length(l), Offset(o) {}
205
+ void Free() {if (Buffer) free ((char*)Buffer); }
206
+ const char *Buffer;
207
+ int Length;
208
+ int Offset;
209
+ };
210
+
211
+ protected:
212
+ bool bPaused;
213
+ bool bConnectPending;
214
+
215
+ bool bNotifyReadable;
216
+ bool bNotifyWritable;
217
+ bool bWatchOnly;
218
+
219
+ bool bReadAttemptedAfterClose;
220
+ bool bWriteAttemptedAfterClose;
221
+
222
+ deque<OutboundPage> OutboundPages;
223
+ int OutboundDataSize;
224
+
225
+ #ifdef WITH_SSL
226
+ SslBox_t *SslBox;
227
+ std::string CertChainFilename;
228
+ std::string PrivateKeyFilename;
229
+ bool bHandshakeSignaled;
230
+ bool bSslVerifyPeer;
231
+ bool bSslPeerAccepted;
232
+ #endif
233
+
234
+ #ifdef HAVE_KQUEUE
235
+ bool bGotExtraKqueueEvent;
236
+ #endif
237
+
238
+ bool bIsServer;
239
+ Int64 LastIo;
240
+ int InactivityTimeout;
241
+
242
+ private:
243
+ void _UpdateEvents();
244
+ void _UpdateEvents(bool, bool);
245
+ void _WriteOutboundData();
246
+ void _DispatchInboundData (const char *buffer, int size);
247
+ void _DispatchCiphertext();
248
+ int _SendRawOutboundData (const char*, int);
249
+ int _ReportErrorStatus();
250
+ void _CheckHandshakeStatus();
251
+
252
+ };
253
+
254
+
255
+ /************************
256
+ class DatagramDescriptor
257
+ ************************/
258
+
259
+ class DatagramDescriptor: public EventableDescriptor
260
+ {
261
+ public:
262
+ DatagramDescriptor (int, EventMachine_t*);
263
+ virtual ~DatagramDescriptor();
264
+
265
+ virtual void Read();
266
+ virtual void Write();
267
+ virtual void Heartbeat();
268
+
269
+ virtual bool SelectForRead() {return true;}
270
+ virtual bool SelectForWrite();
271
+
272
+ int SendOutboundData (const char*, int);
273
+ int SendOutboundDatagram (const char*, int, const char*, int);
274
+
275
+ // Do we have any data to write? This is used by ShouldDelete.
276
+ virtual int GetOutboundDataSize() {return OutboundDataSize;}
277
+
278
+ virtual bool GetPeername (struct sockaddr*);
279
+ virtual bool GetSockname (struct sockaddr*);
280
+
281
+ virtual float GetCommInactivityTimeout();
282
+ virtual int SetCommInactivityTimeout (float value);
283
+
284
+ static int SendDatagram (const unsigned long, const char*, int, const char*, int);
285
+
286
+
287
+ protected:
288
+ struct OutboundPage {
289
+ OutboundPage (const char *b, int l, struct sockaddr_in f, int o=0): Buffer(b), Length(l), Offset(o), From(f) {}
290
+ void Free() {if (Buffer) free ((char*)Buffer); }
291
+ const char *Buffer;
292
+ int Length;
293
+ int Offset;
294
+ struct sockaddr_in From;
295
+ };
296
+
297
+ deque<OutboundPage> OutboundPages;
298
+ int OutboundDataSize;
299
+
300
+ struct sockaddr_in ReturnAddress;
301
+
302
+ Int64 LastIo;
303
+ int InactivityTimeout;
304
+ };
305
+
306
+
307
+ /************************
308
+ class AcceptorDescriptor
309
+ ************************/
310
+
311
+ class AcceptorDescriptor: public EventableDescriptor
312
+ {
313
+ public:
314
+ AcceptorDescriptor (int, EventMachine_t*);
315
+ virtual ~AcceptorDescriptor();
316
+
317
+ virtual void Read();
318
+ virtual void Write();
319
+ virtual void Heartbeat();
320
+
321
+ virtual bool SelectForRead() {return true;}
322
+ virtual bool SelectForWrite() {return false;}
323
+
324
+ virtual bool GetSockname (struct sockaddr*);
325
+
326
+ static void StopAcceptor (const unsigned long binding);
327
+ };
328
+
329
+ /********************
330
+ class PipeDescriptor
331
+ ********************/
332
+
333
+ #ifdef OS_UNIX
334
+ class PipeDescriptor: public EventableDescriptor
335
+ {
336
+ public:
337
+ PipeDescriptor (int, pid_t, EventMachine_t*);
338
+ virtual ~PipeDescriptor();
339
+
340
+ virtual void Read();
341
+ virtual void Write();
342
+ virtual void Heartbeat();
343
+
344
+ virtual bool SelectForRead();
345
+ virtual bool SelectForWrite();
346
+
347
+ int SendOutboundData (const char*, int);
348
+ virtual int GetOutboundDataSize() {return OutboundDataSize;}
349
+
350
+ virtual bool GetSubprocessPid (pid_t*);
351
+
352
+ protected:
353
+ struct OutboundPage {
354
+ OutboundPage (const char *b, int l, int o=0): Buffer(b), Length(l), Offset(o) {}
355
+ void Free() {if (Buffer) free ((char*)Buffer); }
356
+ const char *Buffer;
357
+ int Length;
358
+ int Offset;
359
+ };
360
+
361
+ protected:
362
+ bool bReadAttemptedAfterClose;
363
+ Int64 LastIo;
364
+ int InactivityTimeout;
365
+
366
+ deque<OutboundPage> OutboundPages;
367
+ int OutboundDataSize;
368
+
369
+ pid_t SubprocessPid;
370
+
371
+ private:
372
+ void _DispatchInboundData (const char *buffer, int size);
373
+ };
374
+ #endif // OS_UNIX
375
+
376
+
377
+ /************************
378
+ class KeyboardDescriptor
379
+ ************************/
380
+
381
+ class KeyboardDescriptor: public EventableDescriptor
382
+ {
383
+ public:
384
+ KeyboardDescriptor (EventMachine_t*);
385
+ virtual ~KeyboardDescriptor();
386
+
387
+ virtual void Read();
388
+ virtual void Write();
389
+ virtual void Heartbeat();
390
+
391
+ virtual bool SelectForRead() {return true;}
392
+ virtual bool SelectForWrite() {return false;}
393
+
394
+ protected:
395
+ bool bReadAttemptedAfterClose;
396
+ Int64 LastIo;
397
+ int InactivityTimeout;
398
+
399
+ private:
400
+ void _DispatchInboundData (const char *buffer, int size);
401
+ };
402
+
403
+
404
+ /***********************
405
+ class InotifyDescriptor
406
+ ************************/
407
+
408
+ class InotifyDescriptor: public EventableDescriptor
409
+ {
410
+ public:
411
+ InotifyDescriptor (EventMachine_t*);
412
+ virtual ~InotifyDescriptor();
413
+
414
+ void Read();
415
+ void Write();
416
+
417
+ virtual void Heartbeat() {}
418
+ virtual bool SelectForRead() {return true;}
419
+ virtual bool SelectForWrite() {return false;}
420
+ };
421
+
422
+ #endif // __EventableDescriptor__H_
423
+
424
+