eventmachine 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -1,13 +1,14 @@
1
- $Id: README 2279 2006-04-13 01:31:36Z francis $
1
+ $Id: README 2484 2006-05-12 16:55:59Z francis $
2
2
 
3
- Preliminary README for RUBY/EventMachine
3
+ = RUBY/EventMachine
4
4
 
5
- Author:: blackhedd (gmail address: garbagecat20).
6
- Date:: 8 Apr 2006
5
+ Homepage:: http://rubyeventmachine.com
6
+ Copyright:: (C) 2006 by Francis Cianfrocca. All Rights Reserved.
7
+ Email:: gmail address: garbagecat10
7
8
 
8
- Copyright (C) 2006 by Francis Cianfrocca
9
- All Rights Reserved
10
- This program is made available under the terms of the GPL version 2
9
+ This program is made available under the terms of the Lesser-GPL version 2.
10
+ See EventMachine and EventMachine::Connection for documentation and
11
+ usage examples.
11
12
 
12
13
  EventMachine implements a fast, single-threaded engine for arbitrary network
13
14
  communications. It's extremely easy to use in Ruby. EventMachine wraps all
@@ -50,7 +51,7 @@ for Linux will use <tt>epoll(4)</tt> and will thus require a Linux 2.6 kernel.
50
51
  Here's a fully-functional echo server written with EventMachine:
51
52
 
52
53
  require 'rubygems'
53
- require_gem 'eventmachine'
54
+ require 'eventmachine'
54
55
 
55
56
  module EchoServer
56
57
  def receive_data data
@@ -63,7 +64,5 @@ Here's a fully-functional echo server written with EventMachine:
63
64
  EventMachine::start_server "192.168.0.100", 8081, EchoServer
64
65
  }
65
66
 
66
- EventMachine is licensed under GPL. We will be adding full support for
67
- SSL/TLS-encryption based on OpenSSL in the near future.
68
-
69
67
 
68
+ # vim: sts=2 sw=2 ts=4 et ai tw=77
@@ -1,7 +1,15 @@
1
- $Id: RELEASE_NOTES 2459 2006-05-05 17:11:04Z francis $
1
+ $Id: RELEASE_NOTES 2477 2006-05-11 13:22:39Z francis $
2
2
 
3
3
  RUBY/EventMachine RELEASE NOTES
4
4
 
5
+ --------------------------------------------------
6
+ Version: 0.5.2, released 05May06
7
+ Made several nonvisible improvements to the Windows
8
+ implementation.
9
+ Added an exception-handling patch contributed by Jeff Rose, jeff@rosejn.net.
10
+ Added a dir-config patch contributed anonymously.
11
+ Supported builds on Solaris.
12
+
5
13
  --------------------------------------------------
6
14
  Version: 0.5.1, released 05May06
7
15
  Made it possible to pass a Class rather than a Module
data/ext/ed.cpp CHANGED
@@ -1,6 +1,6 @@
1
1
  /*****************************************************************************
2
2
 
3
- $Id: ed.cpp 2457 2006-05-05 14:57:21Z francis $
3
+ $Id: ed.cpp 2491 2006-05-12 20:24:19Z francis $
4
4
 
5
5
  File: ed.cpp
6
6
  Date: 06Apr06
@@ -162,7 +162,9 @@ ConnectionDescriptor::ConnectionDescriptor (int sd):
162
162
  EventableDescriptor (sd),
163
163
  bConnectPending (false),
164
164
  OutboundDataSize (0),
165
+ #ifdef WITH_SSL
165
166
  SslBox (NULL),
167
+ #endif
166
168
  bIsServer (false)
167
169
  {
168
170
  }
@@ -178,8 +180,10 @@ ConnectionDescriptor::~ConnectionDescriptor()
178
180
  for (size_t i=0; i < OutboundPages.size(); i++)
179
181
  OutboundPages[i].Free();
180
182
 
183
+ #ifdef WITH_SSL
181
184
  if (SslBox)
182
185
  delete SslBox;
186
+ #endif
183
187
  }
184
188
 
185
189
 
@@ -220,6 +224,7 @@ ConnectionDescriptor::SendOutboundData
220
224
 
221
225
  int ConnectionDescriptor::SendOutboundData (const char *data, int length)
222
226
  {
227
+ #ifdef WITH_SSL
223
228
  if (SslBox) {
224
229
  if (length > 0) {
225
230
  int w = SslBox->PutPlaintext (data, length);
@@ -232,6 +237,7 @@ int ConnectionDescriptor::SendOutboundData (const char *data, int length)
232
237
  return 1; // That's a wild guess, almost certainly wrong.
233
238
  }
234
239
  else
240
+ #endif
235
241
  return _SendRawOutboundData (data, length);
236
242
  }
237
243
 
@@ -382,6 +388,7 @@ ConnectionDescriptor::_DispatchInboundData
382
388
 
383
389
  void ConnectionDescriptor::_DispatchInboundData (const char *buffer, int size)
384
390
  {
391
+ #ifdef WITH_SSL
385
392
  if (SslBox) {
386
393
  SslBox->PutCiphertext (buffer, size);
387
394
 
@@ -399,6 +406,12 @@ void ConnectionDescriptor::_DispatchInboundData (const char *buffer, int size)
399
406
  if (EventCallback)
400
407
  (*EventCallback)(GetBinding().c_str(), EventMachine_t::CONNECTION_READ, buffer, size);
401
408
  }
409
+ #endif
410
+
411
+ #ifdef WITHOUT_SSL
412
+ if (EventCallback)
413
+ (*EventCallback)(GetBinding().c_str(), EventMachine_t::CONNECTION_READ, buffer, size);
414
+ #endif
402
415
  }
403
416
 
404
417
 
@@ -519,11 +532,17 @@ ConnectionDescriptor::StartTls
519
532
 
520
533
  void ConnectionDescriptor::StartTls()
521
534
  {
535
+ #ifdef WITH_SSL
522
536
  if (SslBox)
523
537
  throw std::runtime_error ("SSL/TLS already running on connection");
524
538
 
525
539
  SslBox = new SslBox_t (bIsServer);
526
540
  _DispatchCiphertext();
541
+ #endif
542
+
543
+ #ifdef WITHOUT_SSL
544
+ throw std::runtime_error ("Encryption not available on this event-machine");
545
+ #endif
527
546
  }
528
547
 
529
548
 
@@ -531,7 +550,7 @@ void ConnectionDescriptor::StartTls()
531
550
  /*****************************************
532
551
  ConnectionDescriptor::_DispatchCiphertext
533
552
  *****************************************/
534
-
553
+ #ifdef WITH_SSL
535
554
  void ConnectionDescriptor::_DispatchCiphertext()
536
555
  {
537
556
  assert (SslBox);
@@ -588,7 +607,7 @@ void ConnectionDescriptor::_DispatchCiphertext()
588
607
  } while (did_work);
589
608
 
590
609
  }
591
-
610
+ #endif
592
611
 
593
612
 
594
613
 
@@ -683,7 +702,7 @@ void AcceptorDescriptor::Read()
683
702
 
684
703
  // Disable slow-start (Nagle algorithm). Eventually make this configurable.
685
704
  int one = 1;
686
- setsockopt (sd, IPPROTO_TCP, TCP_NODELAY, (const char*) &one, sizeof(one));
705
+ setsockopt (sd, IPPROTO_TCP, TCP_NODELAY, (char*) &one, sizeof(one));
687
706
 
688
707
 
689
708
  ConnectionDescriptor *cd = new ConnectionDescriptor (sd);
@@ -838,7 +857,8 @@ void DatagramDescriptor::Write()
838
857
  break;
839
858
  OutboundPage *op = &(OutboundPages[0]);
840
859
 
841
- int s = sendto (sd, op->Buffer, op->Length, 0, (struct sockaddr*)&(op->From), sizeof(op->From));
860
+ // The nasty cast to (char*) is needed because Windows is brain-dead.
861
+ int s = sendto (sd, (char*)op->Buffer, op->Length, 0, (struct sockaddr*)&(op->From), sizeof(op->From));
842
862
  int e = errno;
843
863
 
844
864
  OutboundDataSize -= op->Length;
@@ -916,7 +936,8 @@ int DatagramDescriptor::SendOutboundDatagram (const char *data, int length, cons
916
936
 
917
937
  HostAddr = inet_addr (address);
918
938
  if (HostAddr == INADDR_NONE) {
919
- hostent *hp = gethostbyname (address);
939
+ // The nasty cast to (char*) is because Windows is brain-dead.
940
+ hostent *hp = gethostbyname ((char*)address);
920
941
  if (!hp)
921
942
  return 0;
922
943
  HostAddr = ((in_addr*)(hp->h_addr))->s_addr;
data/ext/ed.h CHANGED
@@ -1,6 +1,6 @@
1
1
  /*****************************************************************************
2
2
 
3
- $Id: ed.h 2445 2006-05-04 21:05:44Z francis $
3
+ $Id: ed.h 2473 2006-05-11 06:37:31Z francis $
4
4
 
5
5
  File: ed.h
6
6
  Date: 06Apr06
@@ -29,8 +29,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29
29
 
30
30
 
31
31
  class EventMachine_t; // forward reference
32
+ #ifdef WITH_SSL
32
33
  class SslBox_t; // forward reference
33
-
34
+ #endif
34
35
 
35
36
  bool SetSocketNonblocking (SOCKET);
36
37
 
@@ -131,7 +132,9 @@ class ConnectionDescriptor: public EventableDescriptor
131
132
  deque<OutboundPage> OutboundPages;
132
133
  int OutboundDataSize;
133
134
 
135
+ #ifdef WITH_SSL
134
136
  SslBox_t *SslBox;
137
+ #endif
135
138
  bool bIsServer;
136
139
 
137
140
  private:
data/ext/em.cpp CHANGED
@@ -1,6 +1,6 @@
1
1
  /*****************************************************************************
2
2
 
3
- $Id: em.cpp 2457 2006-05-05 14:57:21Z francis $
3
+ $Id: em.cpp 2491 2006-05-12 20:24:19Z francis $
4
4
 
5
5
  File: ed.cpp
6
6
  Date: 06Apr06
@@ -24,6 +24,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24
24
 
25
25
  *****************************************************************************/
26
26
 
27
+ // THIS ENTIRE FILE WILL EVENTUALLY BE FOR UNIX BUILDS ONLY.
28
+ //#ifdef OS_UNIX
29
+
30
+
27
31
  #include "project.h"
28
32
 
29
33
  // Keep a global variable floating around
@@ -83,6 +87,8 @@ EventMachine_t::Run
83
87
  void EventMachine_t::Run()
84
88
  {
85
89
  #ifdef OS_WIN32
90
+ WSADATA w;
91
+ WSAStartup (MAKEWORD (1, 1), &w);
86
92
  HookControlC (true);
87
93
  #endif
88
94
 
@@ -121,7 +127,7 @@ bool EventMachine_t::_RunOnce()
121
127
  if (Descriptors.size() == 0) {
122
128
  #ifdef OS_UNIX
123
129
  timeval tv = {0, 200 * 1000};
124
- select (0, NULL, NULL, NULL, &tv);
130
+ EmSelect (0, NULL, NULL, NULL, &tv);
125
131
  #endif
126
132
  #ifdef OS_WIN32
127
133
  Sleep (200);
@@ -155,7 +161,7 @@ bool EventMachine_t::_RunOnce()
155
161
 
156
162
  { // read and write the sockets
157
163
  timeval tv = {1, 0}; // Solaris fails if the microseconds member is >= 1000000.
158
- int s = select (maxsocket+1, &fdreads, &fdwrites, NULL, &tv);
164
+ int s = EmSelect (maxsocket+1, &fdreads, &fdwrites, NULL, &tv);
159
165
  if (s > 0) {
160
166
  for (i=0; i < Descriptors.size(); i++) {
161
167
  EventableDescriptor *ed = Descriptors[i];
@@ -175,7 +181,7 @@ bool EventMachine_t::_RunOnce()
175
181
  // If the error was EINTR, we probaby caught SIGCHLD or something,
176
182
  // so keep the wait short.
177
183
  timeval tv = {0, ((errno == EINTR) ? 5 : 50) * 1000};
178
- select (0, NULL, NULL, NULL, &tv);
184
+ EmSelect (0, NULL, NULL, NULL, &tv);
179
185
  }
180
186
  }
181
187
 
@@ -295,7 +301,7 @@ const char *EventMachine_t::ConnectToServer (const char *server, int port)
295
301
 
296
302
  HostAddr = inet_addr (server);
297
303
  if (HostAddr == INADDR_NONE) {
298
- hostent *hp = gethostbyname (server);
304
+ hostent *hp = gethostbyname ((char*)server); // Windows requires (char*)
299
305
  if (!hp)
300
306
  return NULL;
301
307
  HostAddr = ((in_addr*)(hp->h_addr))->s_addr;
@@ -416,7 +422,7 @@ const char *EventMachine_t::CreateTcpServer (const char *server, int port)
416
422
  if (server && *server) {
417
423
  sin.sin_addr.s_addr = inet_addr (server);
418
424
  if (sin.sin_addr.s_addr == INADDR_NONE) {
419
- hostent *hp = gethostbyname (server);
425
+ hostent *hp = gethostbyname ((char*)server); // Windows requires the cast.
420
426
  if (hp == NULL) {
421
427
  //__warning ("hostname not resolved: ", server);
422
428
  goto fail;
@@ -503,7 +509,7 @@ const char *EventMachine_t::OpenDatagramSocket (const char *address, int port)
503
509
  if (address && *address) {
504
510
  sin.sin_addr.s_addr = inet_addr (address);
505
511
  if (sin.sin_addr.s_addr == INADDR_NONE) {
506
- hostent *hp = gethostbyname (address);
512
+ hostent *hp = gethostbyname ((char*)address); // Windows requires the cast.
507
513
  if (hp == NULL)
508
514
  goto fail;
509
515
  sin.sin_addr.s_addr = ((in_addr*)(hp->h_addr))->s_addr;
@@ -550,7 +556,7 @@ void EventMachine_t::Add (EventableDescriptor *ed)
550
556
  {
551
557
  if (!ed)
552
558
  throw std::runtime_error ("added bad descriptor");
553
- ed->SetEventCallback (EventCallback);
559
+ ed->SetEventCallback (EventCallback);
554
560
  NewDescriptors.push_back (ed);
555
561
  }
556
562
 
@@ -578,3 +584,5 @@ void EventMachine_t::_AddNewDescriptors()
578
584
  }
579
585
 
580
586
 
587
+ //#endif // OS_UNIX
588
+
data/ext/em.h CHANGED
@@ -1,6 +1,6 @@
1
1
  /*****************************************************************************
2
2
 
3
- $Id: em.h 2412 2006-04-29 01:18:59Z francis $
3
+ $Id: em.h 2469 2006-05-10 18:11:10Z francis $
4
4
 
5
5
  File: ed.h
6
6
  Date: 06Apr06
@@ -25,9 +25,24 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
25
  *****************************************************************************/
26
26
 
27
27
 
28
+
29
+ #ifdef OS_WIN32
30
+ #include "emwin.h"
31
+ #endif
32
+
33
+
34
+ // THIS ENTIRE FILE WILL EVENTUALLY BE FOR UNIX BUILDS ONLY.
35
+ //#ifdef OS_UNIX
36
+
28
37
  #ifndef __EventMachine__H_
29
38
  #define __EventMachine__H_
30
39
 
40
+ #ifdef BUILD_FOR_RUBY
41
+ #include <ruby.h>
42
+ #define EmSelect rb_thread_select
43
+ #else
44
+ #define EmSelect select
45
+ #endif
31
46
 
32
47
  extern time_t gCurrentLoopTime;
33
48
 
@@ -89,3 +104,4 @@ class EventMachine_t
89
104
 
90
105
  #endif // __EventMachine__H_
91
106
 
107
+ //#endif // OS_UNIX
@@ -0,0 +1,307 @@
1
+ /*****************************************************************************
2
+
3
+ $Id: em.cpp 2457 2006-05-05 14:57:21Z francis $
4
+
5
+ File: edwin.cpp
6
+ Date: 05May06
7
+
8
+ Copyright (C) 2006 by Francis Cianfrocca. All Rights Reserved.
9
+ Gmail: garbagecat10
10
+
11
+ This program is free software; you can redistribute it and/or modify
12
+ it under the terms of the GNU General Public License as published by
13
+ the Free Software Foundation; either version 2 of the License, or
14
+ (at your option) any later version.
15
+
16
+ This program is distributed in the hope that it will be useful,
17
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ GNU General Public License for more details.
20
+
21
+ You should have received a copy of the GNU General Public License
22
+ along with this program; if not, write to the Free Software
23
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24
+
25
+ *****************************************************************************/
26
+
27
+
28
+ // THIS ENTIRE FILE IS FOR WINDOWS BUILDS ONLY
29
+ // INCOMPLETE AND DISABLED FOR NOW.
30
+ #ifdef xOS_WIN32
31
+
32
+ #include "project.h"
33
+
34
+
35
+ // Keep a global variable floating around
36
+ // with the current loop time as set by the Event Machine.
37
+ // This avoids the need for frequent expensive calls to time(NULL);
38
+ time_t gCurrentLoopTime;
39
+
40
+
41
+ /******************************
42
+ EventMachine_t::EventMachine_t
43
+ ******************************/
44
+
45
+ EventMachine_t::EventMachine_t (void (*event_callback)(const char*, int, const char*, int)):
46
+ EventCallback (event_callback),
47
+ NextHeartbeatTime (0)
48
+ {
49
+ gTerminateSignalReceived = false;
50
+ Iocp = NULL;
51
+ }
52
+
53
+
54
+ /*******************************
55
+ EventMachine_t::~EventMachine_t
56
+ *******************************/
57
+
58
+ EventMachine_t::~EventMachine_t()
59
+ {
60
+ cerr << "EM __dt\n";
61
+ if (Iocp)
62
+ CloseHandle (Iocp);
63
+ }
64
+
65
+
66
+ /****************************
67
+ EventMachine_t::ScheduleHalt
68
+ ****************************/
69
+
70
+ void EventMachine_t::ScheduleHalt()
71
+ {
72
+ /* This is how we stop the machine.
73
+ * This can be called by clients. Signal handlers will probably
74
+ * set the global flag.
75
+ * For now this means there can only be one EventMachine ever running at a time.
76
+ */
77
+ gTerminateSignalReceived = true;
78
+ }
79
+
80
+
81
+
82
+ /*******************
83
+ EventMachine_t::Run
84
+ *******************/
85
+
86
+ void EventMachine_t::Run()
87
+ {
88
+ HookControlC (true);
89
+
90
+ Iocp = CreateIoCompletionPort (INVALID_HANDLE_VALUE, NULL, 0, 0);
91
+ if (Iocp == NULL)
92
+ throw std::runtime_error ("no completion port");
93
+
94
+
95
+ DWORD nBytes, nCompletionKey;
96
+ LPOVERLAPPED Overlapped;
97
+
98
+ do {
99
+ gCurrentLoopTime = time(NULL);
100
+ // Have some kind of strategy that will dequeue maybe up to 10 completions
101
+ // without running the timers as long as they are available immediately.
102
+ // Otherwise in a busy server we're calling them every time through the loop.
103
+ if (!_RunTimers())
104
+ break;
105
+ if (GetQueuedCompletionStatus (Iocp, &nBytes, &nCompletionKey, &Overlapped, 1000)) {
106
+ }
107
+ cerr << "+";
108
+ } while (!gTerminateSignalReceived);
109
+
110
+
111
+ /*
112
+ while (true) {
113
+ gCurrentLoopTime = time(NULL);
114
+ if (!_RunTimers())
115
+ break;
116
+ _AddNewDescriptors();
117
+ if (!_RunOnce())
118
+ break;
119
+ if (gTerminateSignalReceived)
120
+ break;
121
+ }
122
+ */
123
+
124
+ HookControlC (false);
125
+ }
126
+
127
+
128
+ /**************************
129
+ EventMachine_t::_RunTimers
130
+ **************************/
131
+
132
+ bool EventMachine_t::_RunTimers()
133
+ {
134
+ // These are caller-defined timer handlers.
135
+ // Return T/F to indicate whether we should continue the main loop.
136
+ // We rely on the fact that multimaps sort by their keys to avoid
137
+ // inspecting the whole list every time we come here.
138
+ // Just keep inspecting and processing the list head until we hit
139
+ // one that hasn't expired yet.
140
+
141
+ while (true) {
142
+ multimap<time_t,Timer_t>::iterator i = Timers.begin();
143
+ if (i == Timers.end())
144
+ break;
145
+ if (i->first > gCurrentLoopTime)
146
+ break;
147
+ if (EventCallback)
148
+ (*EventCallback) ("", TIMER_FIRED, i->second.GetBinding().c_str(), i->second.GetBinding().length());
149
+ Timers.erase (i);
150
+ }
151
+ return true;
152
+ }
153
+
154
+
155
+ /***********************************
156
+ EventMachine_t::InstallOneshotTimer
157
+ ***********************************/
158
+
159
+ const char *EventMachine_t::InstallOneshotTimer (int seconds)
160
+ {
161
+ if (Timers.size() > MaxOutstandingTimers)
162
+ return false;
163
+ // Don't use the global loop-time variable here, because we might
164
+ // get called before the main event machine is running.
165
+
166
+ Timer_t t;
167
+ Timers.insert (make_pair (time(NULL) + seconds, t));
168
+ return t.GetBinding().c_str();
169
+ }
170
+
171
+
172
+ /**********************************
173
+ EventMachine_t::OpenDatagramSocket
174
+ **********************************/
175
+
176
+ const char *EventMachine_t::OpenDatagramSocket (const char *address, int port)
177
+ {
178
+ cerr << "OPEN DATAGRAM SOCKET\n";
179
+ return "Unimplemented";
180
+ }
181
+
182
+
183
+ /*******************************
184
+ EventMachine_t::CreateTcpServer
185
+ *******************************/
186
+
187
+ const char *EventMachine_t::CreateTcpServer (const char *server, int port)
188
+ {
189
+ /* Create a TCP-acceptor (server) socket and add it to the event machine.
190
+ * Return the binding of the new acceptor to the caller.
191
+ * This binding will be referenced when the new acceptor sends events
192
+ * to indicate accepted connections.
193
+ */
194
+
195
+ const char *output_binding = NULL;
196
+
197
+ struct sockaddr_in sin;
198
+
199
+ SOCKET sd_accept = socket (AF_INET, SOCK_STREAM, 0);
200
+ if (sd_accept == INVALID_SOCKET) {
201
+ goto fail;
202
+ }
203
+
204
+ memset (&sin, 0, sizeof(sin));
205
+ sin.sin_family = AF_INET;
206
+ sin.sin_addr.s_addr = INADDR_ANY;
207
+ sin.sin_port = htons (port);
208
+
209
+ if (server && *server) {
210
+ sin.sin_addr.s_addr = inet_addr (server);
211
+ if (sin.sin_addr.s_addr == INADDR_NONE) {
212
+ hostent *hp = gethostbyname (server);
213
+ if (hp == NULL) {
214
+ //__warning ("hostname not resolved: ", server);
215
+ goto fail;
216
+ }
217
+ sin.sin_addr.s_addr = ((in_addr*)(hp->h_addr))->s_addr;
218
+ }
219
+ }
220
+
221
+
222
+ // No need to set reuseaddr on Windows.
223
+
224
+
225
+ if (bind (sd_accept, (struct sockaddr*)&sin, sizeof(sin))) {
226
+ //__warning ("binding failed");
227
+ goto fail;
228
+ }
229
+
230
+ if (listen (sd_accept, 100)) {
231
+ //__warning ("listen failed");
232
+ goto fail;
233
+ }
234
+
235
+ { // Looking good.
236
+ AcceptorDescriptor *ad = new AcceptorDescriptor (this, sd_accept);
237
+ if (!ad)
238
+ throw std::runtime_error ("unable to allocate acceptor");
239
+ Add (ad);
240
+ output_binding = ad->GetBinding().c_str();
241
+
242
+ CreateIoCompletionPort ((HANDLE)sd_accept, Iocp, NULL, 0);
243
+ SOCKET sd = socket (AF_INET, SOCK_STREAM, 0);
244
+ CreateIoCompletionPort ((HANDLE)sd, Iocp, NULL, 0);
245
+ AcceptEx (sd_accept, sd,
246
+ }
247
+
248
+ return output_binding;
249
+
250
+ fail:
251
+ if (sd_accept != INVALID_SOCKET)
252
+ closesocket (sd_accept);
253
+ return NULL;
254
+ }
255
+
256
+
257
+ /*******************************
258
+ EventMachine_t::ConnectToServer
259
+ *******************************/
260
+
261
+ const char *EventMachine_t::ConnectToServer (const char *server, int port)
262
+ {
263
+ if (!server || !*server || !port)
264
+ return NULL;
265
+
266
+ sockaddr_in pin;
267
+ unsigned long HostAddr;
268
+
269
+ HostAddr = inet_addr (server);
270
+ if (HostAddr == INADDR_NONE) {
271
+ hostent *hp = gethostbyname (server);
272
+ if (!hp)
273
+ return NULL;
274
+ HostAddr = ((in_addr*)(hp->h_addr))->s_addr;
275
+ }
276
+
277
+ memset (&pin, 0, sizeof(pin));
278
+ pin.sin_family = AF_INET;
279
+ pin.sin_addr.s_addr = HostAddr;
280
+ pin.sin_port = htons (port);
281
+
282
+ int sd = socket (AF_INET, SOCK_STREAM, 0);
283
+ if (sd == INVALID_SOCKET)
284
+ return NULL;
285
+
286
+
287
+ LPOVERLAPPED olap = (LPOVERLAPPED) calloc (1, sizeof (OVERLAPPED));
288
+ cerr << "I'm dying now\n";
289
+ throw runtime_error ("UNIMPLEMENTED!!!\n");
290
+
291
+ }
292
+
293
+
294
+
295
+ /*******************
296
+ EventMachine_t::Add
297
+ *******************/
298
+
299
+ void EventMachine_t::Add (EventableDescriptor *ed)
300
+ {
301
+ cerr << "ADD\n";
302
+ }
303
+
304
+
305
+
306
+ #endif // OS_WIN32
307
+
@@ -0,0 +1,99 @@
1
+ /*****************************************************************************
2
+
3
+ $Id: em.h 2362 2006-04-23 13:57:09Z francis $
4
+
5
+ File: edwin.h
6
+ Date: 05May06
7
+
8
+ Copyright (C) 2006 by Francis Cianfrocca. All Rights Reserved.
9
+ Gmail: garbagecat10
10
+
11
+ This program is free software; you can redistribute it and/or modify
12
+ it under the terms of the GNU General Public License as published by
13
+ the Free Software Foundation; either version 2 of the License, or
14
+ (at your option) any later version.
15
+
16
+ This program is distributed in the hope that it will be useful,
17
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ GNU General Public License for more details.
20
+
21
+ You should have received a copy of the GNU General Public License
22
+ along with this program; if not, write to the Free Software
23
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24
+
25
+ *****************************************************************************/
26
+
27
+
28
+ // THIS ENTIRE FILE IS FOR WINDOWS BUILDS ONLY.
29
+ // INCOMPLETE AND DISABLED FOR NOW.
30
+ #ifdef xOS_WIN32
31
+
32
+ #ifndef __EventMachine__H_
33
+ #define __EventMachine__H_
34
+
35
+
36
+ extern time_t gCurrentLoopTime;
37
+
38
+ class EventableDescriptor;
39
+
40
+
41
+ /********************
42
+ class EventMachine_t
43
+ ********************/
44
+
45
+ class EventMachine_t
46
+ {
47
+ public:
48
+ EventMachine_t (void(*event_callback)(const char*, int, const char*, int));
49
+ virtual ~EventMachine_t();
50
+
51
+ void Run();
52
+ void ScheduleHalt();
53
+ const char *InstallOneshotTimer (int);
54
+ const char *ConnectToServer (const char *, int);
55
+ const char *CreateTcpServer (const char *, int);
56
+ const char *OpenDatagramSocket (const char *, int);
57
+
58
+ void Add (EventableDescriptor*);
59
+
60
+ public:
61
+ enum { // Event names
62
+ TIMER_FIRED = 100,
63
+ CONNECTION_READ = 101,
64
+ CONNECTION_UNBOUND = 102,
65
+ CONNECTION_ACCEPTED = 103
66
+ };
67
+
68
+ private:
69
+ HANDLE Iocp;
70
+
71
+ private:
72
+ bool _RunOnce();
73
+ bool _RunTimers();
74
+ void _AddNewDescriptors();
75
+
76
+ private:
77
+ enum {
78
+ MaxOutstandingTimers = 40,
79
+ HeartbeatInterval = 2
80
+ };
81
+ void (*EventCallback)(const char*, int, const char*, int);
82
+
83
+ class Timer_t: public Bindable_t {
84
+ };
85
+
86
+ multimap<time_t, Timer_t> Timers;
87
+ vector<EventableDescriptor*> Descriptors;
88
+ vector<EventableDescriptor*> NewDescriptors;
89
+
90
+ time_t NextHeartbeatTime;
91
+ };
92
+
93
+
94
+
95
+
96
+ #endif // __EventMachine__H_
97
+
98
+ #endif // OS_WIN32
99
+
@@ -1,4 +1,4 @@
1
- # $Id: extconf.rb 2451 2006-05-05 03:16:31Z francis $
1
+ # $Id: extconf.rb 2493 2006-05-12 20:57:03Z francis $
2
2
  #
3
3
  #----------------------------------------------------------------------------
4
4
  #
@@ -41,6 +41,7 @@ when 'mswin32', 'mingw32', 'bccwin32'
41
41
  end
42
42
 
43
43
  flags << "-D OS_WIN32"
44
+ flags << '-D BUILD_FOR_RUBY'
44
45
  flags << "-GX"
45
46
  flags << "-GR"
46
47
 
@@ -52,13 +53,57 @@ when 'mswin32', 'mingw32', 'bccwin32'
52
53
  else
53
54
  flags << '-D WITHOUT_SSL'
54
55
  end
56
+
57
+ when 'solaris2.8'
58
+ unless have_library('pthread') and
59
+ have_library('nsl') and
60
+ have_library('socket')
61
+ exit
62
+ end
63
+
64
+ flags << '-D OS_UNIX'
65
+ flags << '-D OS_SOLARIS8'
66
+ flags << '-D BUILD_FOR_RUBY'
67
+
68
+ dir_config('ssl')
69
+ if have_library('ssl') and
70
+ have_library('crypto') and
71
+ have_header('openssl/ssl.h') and
72
+ have_header('openssl/err.h')
73
+ flags << '-D WITH_SSL'
74
+ else
75
+ flags << '-D WITHOUT_SSL'
76
+ end
77
+
78
+ # on Unix we need a g++ link, not gcc.
79
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
80
+
81
+ when 'darwin8.0'
82
+ flags << '-D OS_UNIX'
83
+ flags << '-D BUILD_FOR_RUBY'
84
+
85
+ dir_config('ssl')
86
+ if have_library('ssl') and
87
+ have_library('crypto') and
88
+ have_library('C') and
89
+ have_header('openssl/ssl.h') and
90
+ have_header('openssl/err.h')
91
+ flags << '-D WITH_SSL'
92
+ else
93
+ flags << '-D WITHOUT_SSL'
94
+ end
95
+ # on Unix we need a g++ link, not gcc.
96
+ CONFIG['LDSHARED'] = "$(CXX) $(RC_CFLAGS) -bundle"
97
+
55
98
  else
56
99
  unless have_library('pthread')
57
100
  exit
58
101
  end
59
102
 
60
103
  flags << '-D OS_UNIX'
104
+ flags << '-D BUILD_FOR_RUBY'
61
105
 
106
+ dir_config('ssl')
62
107
  if have_library('ssl') and
63
108
  have_library('crypto') and
64
109
  have_header('openssl/ssl.h') and
@@ -1,6 +1,6 @@
1
1
  /*****************************************************************************
2
2
 
3
- $Id: project.h 2452 2006-05-05 03:57:39Z francis $
3
+ $Id: project.h 2473 2006-05-11 06:37:31Z francis $
4
4
 
5
5
  File: project.h
6
6
  Date: 06Apr06
@@ -58,6 +58,9 @@ typedef int SOCKET;
58
58
  #define closesocket close
59
59
  #define INVALID_SOCKET -1
60
60
  #define SOCKET_ERROR -1
61
+ #ifdef OS_SOLARIS8
62
+ #define INADDR_NONE ((unsigned long)-1)
63
+ #endif
61
64
  #endif
62
65
 
63
66
 
@@ -74,9 +77,10 @@ typedef int socklen_t;
74
77
 
75
78
  using namespace std;
76
79
 
80
+ #ifdef WITH_SSL
77
81
  #include <openssl/ssl.h>
78
82
  #include <openssl/err.h>
79
-
83
+ #endif
80
84
 
81
85
  #include "binder.h"
82
86
  #include "em.h"
@@ -128,10 +128,15 @@ t_run_machine
128
128
 
129
129
  static VALUE t_run_machine (VALUE self)
130
130
  {
131
+ // This whole method and the whole UseThreads mechanism is
132
+ // tentatively OBSOLETE. If we replace calls to select with
133
+ // rb_thread_select, then we appear able to interoperate with
134
+ // Ruby threads.
135
+
131
136
  #ifdef OS_UNIX
132
137
  UseThreads = true;
133
138
 
134
- int sp = socketpair (AF_LOCAL, SOCK_STREAM, 0, SyncSockets);
139
+ int sp = socketpair (AF_UNIX, SOCK_STREAM, 0, SyncSockets);
135
140
  if (sp)
136
141
  throw std::runtime_error ("no socket pair");
137
142
 
@@ -354,10 +359,12 @@ Init_rubyeventmachine
354
359
 
355
360
  extern "C" void Init_rubyeventmachine()
356
361
  {
357
- // INCOMPLETE, we need to define class Connectons inside module EventMachine
362
+ // INCOMPLETE, we need to define class Connections inside module EventMachine
363
+ // run_machine and run_machine_without_threads are now identical.
364
+ // Must deprecate the without_threads variant.
358
365
  EmModule = rb_define_module ("EventMachine");
359
366
  rb_define_module_function (EmModule, "initialize_event_machine", (VALUE(*)(...))t_initialize_event_machine, 0);
360
- rb_define_module_function (EmModule, "run_machine", (VALUE(*)(...))t_run_machine, 0);
367
+ rb_define_module_function (EmModule, "run_machine", (VALUE(*)(...))t_run_machine_without_threads, 0);
361
368
  rb_define_module_function (EmModule, "run_machine_without_threads", (VALUE(*)(...))t_run_machine_without_threads, 0);
362
369
  rb_define_module_function (EmModule, "add_oneshot_timer", (VALUE(*)(...))t_add_oneshot_timer, 1);
363
370
  rb_define_module_function (EmModule, "start_tcp_server", (VALUE(*)(...))t_start_server, 2);
@@ -370,11 +377,9 @@ extern "C" void Init_rubyeventmachine()
370
377
  rb_define_module_function (EmModule, "release_machine", (VALUE(*)(...))t_release_machine, 0);
371
378
  rb_define_module_function (EmModule, "stop", (VALUE(*)(...))t_stop, 0);
372
379
 
373
- // Why am I missing the rb_ function that converts a class/module name to a VALUE?
374
- VALUE exception = rb_eval_string ("Exception");
375
- rb_define_class_under (EmModule, "ConnectionNotBound", exception);
376
- rb_define_class_under (EmModule, "NoHandlerForAcceptedConnection", exception);
377
- rb_define_class_under (EmModule, "UnknownTimerFired", exception);
380
+ rb_define_class_under (EmModule, "ConnectionNotBound", rb_eException);
381
+ rb_define_class_under (EmModule, "NoHandlerForAcceptedConnection", rb_eException);
382
+ rb_define_class_under (EmModule, "UnknownTimerFired", rb_eException);
378
383
 
379
384
  rb_define_const (EmModule, "TimerFired", (100 << 1) | 1);
380
385
  rb_define_const (EmModule, "ConnectionData", (101 << 1) | 1);
@@ -1,12 +1,12 @@
1
1
  /*****************************************************************************
2
2
 
3
- $Id: ssl.cpp 2458 2006-05-05 17:07:17Z francis $
3
+ $Id: ssl.cpp 2491 2006-05-12 20:24:19Z francis $
4
4
 
5
5
  File: ssl.cpp
6
6
  Date: 30Apr06
7
7
 
8
8
  Copyright (C) 2006 by Francis Cianfrocca. All Rights Reserved.
9
- Gmail: garbagecat20
9
+ Gmail: garbagecat10
10
10
 
11
11
  This program is free software; you can redistribute it and/or modify
12
12
  it under the terms of the GNU General Public License as published by
@@ -25,6 +25,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
25
  *****************************************************************************/
26
26
 
27
27
 
28
+ #ifdef WITH_SSL
29
+
28
30
  #include "project.h"
29
31
 
30
32
 
@@ -36,45 +38,45 @@ static void InitializeDefaultCredentials();
36
38
  static EVP_PKEY *DefaultPrivateKey = NULL;
37
39
  static X509 *DefaultCertificate = NULL;
38
40
 
39
- static char PrivateMaterials[] = {"\
40
- -----BEGIN RSA PRIVATE KEY-----\n\
41
- MIICXAIBAAKBgQDCYYhcw6cGRbhBVShKmbWm7UVsEoBnUf0cCh8AX+MKhMxwVDWV\n\
42
- Igdskntn3cSJjRtmgVJHIK0lpb/FYHQB93Ohpd9/Z18pDmovfFF9nDbFF0t39hJ/\n\
43
- AqSzFB3GiVPoFFZJEE1vJqh+3jzsSF5K56bZ6azz38VlZgXeSozNW5bXkQIDAQAB\n\
44
- AoGALA89gIFcr6BIBo8N5fL3aNHpZXjAICtGav+kTUpuxSiaym9cAeTHuAVv8Xgk\n\
45
- H2Wbq11uz+6JMLpkQJH/WZ7EV59DPOicXrp0Imr73F3EXBfR7t2EQDYHPMthOA1D\n\
46
- I9EtCzvV608Ze90hiJ7E3guGrGppZfJ+eUWCPgy8CZH1vRECQQDv67rwV/oU1aDo\n\
47
- 6/+d5nqjeW6mWkGqTnUU96jXap8EIw6B+0cUKskwx6mHJv+tEMM2748ZY7b0yBlg\n\
48
- w4KDghbFAkEAz2h8PjSJG55LwqmXih1RONSgdN9hjB12LwXL1CaDh7/lkEhq0PlK\n\
49
- PCAUwQSdM17Sl0Xxm2CZiekTSlwmHrtqXQJAF3+8QJwtV2sRJp8u2zVe37IeH1cJ\n\
50
- xXeHyjTzqZ2803fnjN2iuZvzNr7noOA1/Kp+pFvUZUU5/0G2Ep8zolPUjQJAFA7k\n\
51
- xRdLkzIx3XeNQjwnmLlncyYPRv+qaE3FMpUu7zftuZBnVCJnvXzUxP3vPgKTlzGa\n\
52
- dg5XivDRfsV+okY5uQJBAMV4FesUuLQVEKb6lMs7rzZwpeGQhFDRfywJzfom2TLn\n\
53
- 2RdJQQ3dcgnhdVDgt5o1qkmsqQh8uJrJ9SdyLIaZQIc=\n\
54
- -----END RSA PRIVATE KEY-----\n\
55
- -----BEGIN CERTIFICATE-----\n\
56
- MIID6TCCA1KgAwIBAgIJANm4W/Tzs+s+MA0GCSqGSIb3DQEBBQUAMIGqMQswCQYD\n\
57
- VQQGEwJVUzERMA8GA1UECBMITmV3IFlvcmsxETAPBgNVBAcTCE5ldyBZb3JrMRYw\n\
58
- FAYDVQQKEw1TdGVhbWhlYXQubmV0MRQwEgYDVQQLEwtFbmdpbmVlcmluZzEdMBsG\n\
59
- A1UEAxMUb3BlbmNhLnN0ZWFtaGVhdC5uZXQxKDAmBgkqhkiG9w0BCQEWGWVuZ2lu\n\
60
- ZWVyaW5nQHN0ZWFtaGVhdC5uZXQwHhcNMDYwNTA1MTcwNjAzWhcNMjQwMjIwMTcw\n\
61
- NjAzWjCBqjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQH\n\
62
- EwhOZXcgWW9yazEWMBQGA1UEChMNU3RlYW1oZWF0Lm5ldDEUMBIGA1UECxMLRW5n\n\
63
- aW5lZXJpbmcxHTAbBgNVBAMTFG9wZW5jYS5zdGVhbWhlYXQubmV0MSgwJgYJKoZI\n\
64
- hvcNAQkBFhllbmdpbmVlcmluZ0BzdGVhbWhlYXQubmV0MIGfMA0GCSqGSIb3DQEB\n\
65
- AQUAA4GNADCBiQKBgQDCYYhcw6cGRbhBVShKmbWm7UVsEoBnUf0cCh8AX+MKhMxw\n\
66
- VDWVIgdskntn3cSJjRtmgVJHIK0lpb/FYHQB93Ohpd9/Z18pDmovfFF9nDbFF0t3\n\
67
- 9hJ/AqSzFB3GiVPoFFZJEE1vJqh+3jzsSF5K56bZ6azz38VlZgXeSozNW5bXkQID\n\
68
- AQABo4IBEzCCAQ8wHQYDVR0OBBYEFPJvPd1Fcmd8o/Tm88r+NjYPICCkMIHfBgNV\n\
69
- HSMEgdcwgdSAFPJvPd1Fcmd8o/Tm88r+NjYPICCkoYGwpIGtMIGqMQswCQYDVQQG\n\
70
- EwJVUzERMA8GA1UECBMITmV3IFlvcmsxETAPBgNVBAcTCE5ldyBZb3JrMRYwFAYD\n\
71
- VQQKEw1TdGVhbWhlYXQubmV0MRQwEgYDVQQLEwtFbmdpbmVlcmluZzEdMBsGA1UE\n\
72
- AxMUb3BlbmNhLnN0ZWFtaGVhdC5uZXQxKDAmBgkqhkiG9w0BCQEWGWVuZ2luZWVy\n\
73
- aW5nQHN0ZWFtaGVhdC5uZXSCCQDZuFv087PrPjAMBgNVHRMEBTADAQH/MA0GCSqG\n\
74
- SIb3DQEBBQUAA4GBAC1CXey/4UoLgJiwcEMDxOvW74plks23090iziFIlGgcIhk0\n\
75
- Df6hTAs7H3MWww62ddvR8l07AWfSzSP5L6mDsbvq7EmQsmPODwb6C+i2aF3EDL8j\n\
76
- uw73m4YIGI0Zw2XdBpiOGkx2H56Kya6mJJe/5XORZedh1wpI7zki01tHYbcy\n\
77
- -----END CERTIFICATE-----\n"};
41
+ static char PrivateMaterials[] = {
42
+ "-----BEGIN RSA PRIVATE KEY-----\n"
43
+ "MIICXAIBAAKBgQDCYYhcw6cGRbhBVShKmbWm7UVsEoBnUf0cCh8AX+MKhMxwVDWV\n"
44
+ "Igdskntn3cSJjRtmgVJHIK0lpb/FYHQB93Ohpd9/Z18pDmovfFF9nDbFF0t39hJ/\n"
45
+ "AqSzFB3GiVPoFFZJEE1vJqh+3jzsSF5K56bZ6azz38VlZgXeSozNW5bXkQIDAQAB\n"
46
+ "AoGALA89gIFcr6BIBo8N5fL3aNHpZXjAICtGav+kTUpuxSiaym9cAeTHuAVv8Xgk\n"
47
+ "H2Wbq11uz+6JMLpkQJH/WZ7EV59DPOicXrp0Imr73F3EXBfR7t2EQDYHPMthOA1D\n"
48
+ "I9EtCzvV608Ze90hiJ7E3guGrGppZfJ+eUWCPgy8CZH1vRECQQDv67rwV/oU1aDo\n"
49
+ "6/+d5nqjeW6mWkGqTnUU96jXap8EIw6B+0cUKskwx6mHJv+tEMM2748ZY7b0yBlg\n"
50
+ "w4KDghbFAkEAz2h8PjSJG55LwqmXih1RONSgdN9hjB12LwXL1CaDh7/lkEhq0PlK\n"
51
+ "PCAUwQSdM17Sl0Xxm2CZiekTSlwmHrtqXQJAF3+8QJwtV2sRJp8u2zVe37IeH1cJ\n"
52
+ "xXeHyjTzqZ2803fnjN2iuZvzNr7noOA1/Kp+pFvUZUU5/0G2Ep8zolPUjQJAFA7k\n"
53
+ "xRdLkzIx3XeNQjwnmLlncyYPRv+qaE3FMpUu7zftuZBnVCJnvXzUxP3vPgKTlzGa\n"
54
+ "dg5XivDRfsV+okY5uQJBAMV4FesUuLQVEKb6lMs7rzZwpeGQhFDRfywJzfom2TLn\n"
55
+ "2RdJQQ3dcgnhdVDgt5o1qkmsqQh8uJrJ9SdyLIaZQIc=\n"
56
+ "-----END RSA PRIVATE KEY-----\n"
57
+ "-----BEGIN CERTIFICATE-----\n"
58
+ "MIID6TCCA1KgAwIBAgIJANm4W/Tzs+s+MA0GCSqGSIb3DQEBBQUAMIGqMQswCQYD\n"
59
+ "VQQGEwJVUzERMA8GA1UECBMITmV3IFlvcmsxETAPBgNVBAcTCE5ldyBZb3JrMRYw\n"
60
+ "FAYDVQQKEw1TdGVhbWhlYXQubmV0MRQwEgYDVQQLEwtFbmdpbmVlcmluZzEdMBsG\n"
61
+ "A1UEAxMUb3BlbmNhLnN0ZWFtaGVhdC5uZXQxKDAmBgkqhkiG9w0BCQEWGWVuZ2lu\n"
62
+ "ZWVyaW5nQHN0ZWFtaGVhdC5uZXQwHhcNMDYwNTA1MTcwNjAzWhcNMjQwMjIwMTcw\n"
63
+ "NjAzWjCBqjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQH\n"
64
+ "EwhOZXcgWW9yazEWMBQGA1UEChMNU3RlYW1oZWF0Lm5ldDEUMBIGA1UECxMLRW5n\n"
65
+ "aW5lZXJpbmcxHTAbBgNVBAMTFG9wZW5jYS5zdGVhbWhlYXQubmV0MSgwJgYJKoZI\n"
66
+ "hvcNAQkBFhllbmdpbmVlcmluZ0BzdGVhbWhlYXQubmV0MIGfMA0GCSqGSIb3DQEB\n"
67
+ "AQUAA4GNADCBiQKBgQDCYYhcw6cGRbhBVShKmbWm7UVsEoBnUf0cCh8AX+MKhMxw\n"
68
+ "VDWVIgdskntn3cSJjRtmgVJHIK0lpb/FYHQB93Ohpd9/Z18pDmovfFF9nDbFF0t3\n"
69
+ "9hJ/AqSzFB3GiVPoFFZJEE1vJqh+3jzsSF5K56bZ6azz38VlZgXeSozNW5bXkQID\n"
70
+ "AQABo4IBEzCCAQ8wHQYDVR0OBBYEFPJvPd1Fcmd8o/Tm88r+NjYPICCkMIHfBgNV\n"
71
+ "HSMEgdcwgdSAFPJvPd1Fcmd8o/Tm88r+NjYPICCkoYGwpIGtMIGqMQswCQYDVQQG\n"
72
+ "EwJVUzERMA8GA1UECBMITmV3IFlvcmsxETAPBgNVBAcTCE5ldyBZb3JrMRYwFAYD\n"
73
+ "VQQKEw1TdGVhbWhlYXQubmV0MRQwEgYDVQQLEwtFbmdpbmVlcmluZzEdMBsGA1UE\n"
74
+ "AxMUb3BlbmNhLnN0ZWFtaGVhdC5uZXQxKDAmBgkqhkiG9w0BCQEWGWVuZ2luZWVy\n"
75
+ "aW5nQHN0ZWFtaGVhdC5uZXSCCQDZuFv087PrPjAMBgNVHRMEBTADAQH/MA0GCSqG\n"
76
+ "SIb3DQEBBQUAA4GBAC1CXey/4UoLgJiwcEMDxOvW74plks23090iziFIlGgcIhk0\n"
77
+ "Df6hTAs7H3MWww62ddvR8l07AWfSzSP5L6mDsbvq7EmQsmPODwb6C+i2aF3EDL8j\n"
78
+ "uw73m4YIGI0Zw2XdBpiOGkx2H56Kya6mJJe/5XORZedh1wpI7zki01tHYbcy\n"
79
+ "-----END CERTIFICATE-----\n"};
78
80
 
79
81
  /* These private materials were made with:
80
82
  * openssl req -new -x509 -keyout cakey.pem -out cacert.pem -nodes -days 6500
@@ -375,3 +377,6 @@ int SslBox_t::PutPlaintext (const char *buf, int bufsize)
375
377
  return 0;
376
378
  }
377
379
 
380
+
381
+ #endif // WITH_SSL
382
+
data/ext/ssl.h CHANGED
@@ -1,6 +1,6 @@
1
1
  /*****************************************************************************
2
2
 
3
- $Id: ssl.h 2421 2006-04-29 23:48:49Z francis $
3
+ $Id: ssl.h 2473 2006-05-11 06:37:31Z francis $
4
4
 
5
5
  File: ssl.h
6
6
  Date: 30Apr06
@@ -31,6 +31,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
31
31
 
32
32
 
33
33
 
34
+ #ifdef WITH_SSL
34
35
 
35
36
  /******************
36
37
  class SslContext_t
@@ -85,7 +86,7 @@ class SslBox_t
85
86
 
86
87
  PageList OutboundQ;
87
88
  };
88
-
89
+ #endif // WITH_SSL
89
90
 
90
91
 
91
92
  #endif // __SslBox__H_
@@ -1,4 +1,4 @@
1
- # $Id: eventmachine.rb 2431 2006-04-30 22:17:20Z francis $
1
+ # $Id: eventmachine.rb 2469 2006-05-10 18:11:10Z francis $
2
2
  #
3
3
  # Author:: blackhedd (gmail address: garbagecat20).
4
4
  # Date:: 8 Apr 2006
@@ -163,23 +163,30 @@ module EventMachine
163
163
  #
164
164
  # See the description of stop_event_loop for an extremely simple client example.
165
165
  #
166
-
167
- def EventMachine::run use_threads = true, &block
166
+ #--
167
+ # Obsoleted the use_threads mechanism.
168
+ #
169
+ def EventMachine::run &block
170
+ #def EventMachine::run use_threads = true, &block
168
171
  @conns = {}
169
172
  @acceptors = {}
170
173
  @timers = {}
171
174
  initialize_event_machine
172
175
  block and add_timer 0, block
173
- use_threads ? run_machine : run_machine_without_threads
176
+ #use_threads ? run_machine : run_machine_without_threads
177
+ run_machine
174
178
  release_machine
175
179
  end
176
180
 
181
+ # +deprecated+
182
+ #--
177
183
  # EventMachine#run_without_threads is semantically identical
178
184
  # to EventMachine#run, but it runs somewhat faster.
179
185
  # However, it must not be used in applications that spin
180
186
  # Ruby threads.
181
187
  def EventMachine::run_without_threads &block
182
- EventMachine::run false, &block
188
+ #EventMachine::run false, &block
189
+ EventMachine::run &block
183
190
  end
184
191
 
185
192
  # EventMachine#add_timer adds a one-shot timer to the event loop.
metadata CHANGED
@@ -3,16 +3,15 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: eventmachine
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.5.1
7
- date: 2006-05-05 00:00:00 -04:00
6
+ version: 0.5.2
7
+ date: 2006-05-12 00:00:00 -04:00
8
8
  summary: Ruby/EventMachine socket engine library
9
9
  require_paths:
10
10
  - lib
11
- - ext
12
11
  email: garbagecat10@gmail.com
13
- homepage: http://rubyforge.org/projects/eventmachine
14
- rubyforge_project:
15
- description:
12
+ homepage: http://rubyeventmachine.com
13
+ rubyforge_project: eventmachine
14
+ description: ""
16
15
  autorequire:
17
16
  default_executable:
18
17
  bindir: bin
@@ -26,8 +25,8 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
26
25
  platform: ruby
27
26
  signing_key:
28
27
  cert_chain:
29
- authors: []
30
-
28
+ authors:
29
+ - Francis Cianfrocca
31
30
  files:
32
31
  - tests/testem.rb
33
32
  - lib/eventmachine.rb
@@ -41,11 +40,13 @@ files:
41
40
  - ext/binder.h
42
41
  - ext/em.h
43
42
  - ext/ed.h
43
+ - ext/emwin.h
44
44
  - ext/ssl.cpp
45
45
  - ext/project.h
46
46
  - ext/eventmachine.h
47
47
  - ext/em.cpp
48
48
  - ext/extconf.rb
49
+ - ext/emwin.cpp
49
50
  - ext/page.cpp
50
51
  - ext/ssl.h
51
52
  - README
@@ -53,8 +54,12 @@ files:
53
54
  - COPYING
54
55
  test_files:
55
56
  - tests/testem.rb
56
- rdoc_options: []
57
-
57
+ rdoc_options:
58
+ - --title
59
+ - EventMachine
60
+ - --main
61
+ - README
62
+ - --line-numbers
58
63
  extra_rdoc_files:
59
64
  - README
60
65
  - RELEASE_NOTES