MattHulse-eventmachine 0.0.1

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 (156) hide show
  1. data/.gitignore +14 -0
  2. data/README +82 -0
  3. data/Rakefile +279 -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 +41 -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 +821 -0
  25. data/ext/cplusplus.cpp +202 -0
  26. data/ext/ed.cpp +1868 -0
  27. data/ext/ed.h +416 -0
  28. data/ext/em.cpp +2270 -0
  29. data/ext/em.h +228 -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 +138 -0
  37. data/ext/fastfilereader/extconf.rb +84 -0
  38. data/ext/fastfilereader/mapper.cpp +214 -0
  39. data/ext/fastfilereader/mapper.h +59 -0
  40. data/ext/fastfilereader/rubymain.cpp +127 -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 +147 -0
  48. data/ext/rubymain.cpp +1152 -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/Application.java +192 -0
  56. data/java/src/com/rubyeventmachine/Connection.java +74 -0
  57. data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
  58. data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
  59. data/java/src/com/rubyeventmachine/EmReactor.java +557 -0
  60. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  61. data/java/src/com/rubyeventmachine/EventableChannel.java +69 -0
  62. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +189 -0
  63. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
  64. data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
  65. data/java/src/com/rubyeventmachine/Timer.java +54 -0
  66. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
  67. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +146 -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 +74 -0
  71. data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -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 +187 -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.rb +35 -0
  83. data/lib/em/protocols/header_and_content.rb +138 -0
  84. data/lib/em/protocols/httpclient.rb +263 -0
  85. data/lib/em/protocols/httpclient2.rb +582 -0
  86. data/lib/em/protocols/line_and_text.rb +126 -0
  87. data/lib/em/protocols/linetext2.rb +160 -0
  88. data/lib/em/protocols/memcache.rb +323 -0
  89. data/lib/em/protocols/object_protocol.rb +45 -0
  90. data/lib/em/protocols/postgres3.rb +247 -0
  91. data/lib/em/protocols/saslauth.rb +175 -0
  92. data/lib/em/protocols/smtpclient.rb +350 -0
  93. data/lib/em/protocols/smtpserver.rb +547 -0
  94. data/lib/em/protocols/stomp.rb +200 -0
  95. data/lib/em/protocols/tcptest.rb +53 -0
  96. data/lib/em/queue.rb +61 -0
  97. data/lib/em/spawnable.rb +85 -0
  98. data/lib/em/streamer.rb +130 -0
  99. data/lib/em/timers.rb +55 -0
  100. data/lib/em/version.rb +3 -0
  101. data/lib/eventmachine.rb +1698 -0
  102. data/lib/evma.rb +32 -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/jeventmachine.rb +246 -0
  109. data/lib/pr_eventmachine.rb +1022 -0
  110. data/setup.rb +1585 -0
  111. data/tasks/cpp.rake +77 -0
  112. data/tasks/project.rake +79 -0
  113. data/tasks/tests.rake +193 -0
  114. data/tests/client.crt +31 -0
  115. data/tests/client.key +51 -0
  116. data/tests/test_attach.rb +126 -0
  117. data/tests/test_basic.rb +284 -0
  118. data/tests/test_channel.rb +63 -0
  119. data/tests/test_connection_count.rb +35 -0
  120. data/tests/test_defer.rb +47 -0
  121. data/tests/test_epoll.rb +160 -0
  122. data/tests/test_error_handler.rb +35 -0
  123. data/tests/test_errors.rb +82 -0
  124. data/tests/test_exc.rb +55 -0
  125. data/tests/test_file_watch.rb +49 -0
  126. data/tests/test_futures.rb +198 -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_process_watch.rb +48 -0
  138. data/tests/test_processes.rb +128 -0
  139. data/tests/test_proxy_connection.rb +92 -0
  140. data/tests/test_pure.rb +125 -0
  141. data/tests/test_queue.rb +44 -0
  142. data/tests/test_running.rb +42 -0
  143. data/tests/test_sasl.rb +72 -0
  144. data/tests/test_send_file.rb +242 -0
  145. data/tests/test_servers.rb +76 -0
  146. data/tests/test_smtpclient.rb +83 -0
  147. data/tests/test_smtpserver.rb +85 -0
  148. data/tests/test_spawn.rb +322 -0
  149. data/tests/test_ssl_args.rb +68 -0
  150. data/tests/test_ssl_methods.rb +50 -0
  151. data/tests/test_ssl_verify.rb +82 -0
  152. data/tests/test_timers.rb +162 -0
  153. data/tests/test_ud.rb +36 -0
  154. data/tests/testem.rb +31 -0
  155. data/web/whatis +7 -0
  156. metadata +223 -0
data/ext/emwin.h ADDED
@@ -0,0 +1,94 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: emwin.h
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
+ #ifndef __EventMachine__H_
26
+ #define __EventMachine__H_
27
+
28
+
29
+ extern time_t gCurrentLoopTime;
30
+
31
+ class EventableDescriptor;
32
+
33
+
34
+ /********************
35
+ class EventMachine_t
36
+ ********************/
37
+
38
+ class EventMachine_t
39
+ {
40
+ public:
41
+ EventMachine_t (void(*event_callback)(const char*, int, const char*, int));
42
+ virtual ~EventMachine_t();
43
+
44
+ void Run();
45
+ void ScheduleHalt();
46
+ const char *InstallOneshotTimer (int);
47
+ const char *ConnectToServer (const char *, int);
48
+ const char *CreateTcpServer (const char *, int);
49
+ const char *OpenDatagramSocket (const char *, int);
50
+
51
+ void Add (EventableDescriptor*);
52
+
53
+ public:
54
+ enum { // Event names
55
+ TIMER_FIRED = 100,
56
+ CONNECTION_READ = 101,
57
+ CONNECTION_UNBOUND = 102,
58
+ CONNECTION_ACCEPTED = 103,
59
+ CONNECTION_COMPLETED = 104,
60
+ LOOPBREAK_SIGNAL = 105
61
+ };
62
+
63
+ private:
64
+ HANDLE Iocp;
65
+
66
+ private:
67
+ bool _RunOnce();
68
+ bool _RunTimers();
69
+ void _AddNewDescriptors();
70
+
71
+ private:
72
+ enum {
73
+ MaxOutstandingTimers = 40,
74
+ HeartbeatInterval = 2
75
+ };
76
+ void (*EventCallback)(const char*, int, const char*, int);
77
+
78
+ class Timer_t: public Bindable_t {
79
+ };
80
+
81
+ multimap<time_t, Timer_t> Timers;
82
+ vector<EventableDescriptor*> Descriptors;
83
+ vector<EventableDescriptor*> NewDescriptors;
84
+
85
+ time_t NextHeartbeatTime;
86
+ };
87
+
88
+
89
+
90
+
91
+ #endif // __EventMachine__H_
92
+
93
+ #endif // OS_WIN32
94
+
data/ext/epoll.cpp ADDED
@@ -0,0 +1,26 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: epoll.cpp
6
+ Date: 06Jun07
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
+ #ifdef HAVE_EPOLL
22
+
23
+ #include "project.h"
24
+
25
+ #endif // HAVE_EPOLL
26
+
data/ext/epoll.h ADDED
@@ -0,0 +1,25 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: epoll.h
6
+ Date: 06Jun07
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
+ #ifdef HAVE_EPOLL
22
+
23
+
24
+ #endif // HAVE_EPOLL
25
+
@@ -0,0 +1,122 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: eventmachine.h
6
+ Date: 15Apr06
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 __EVMA_EventMachine__H_
21
+ #define __EVMA_EventMachine__H_
22
+
23
+ #if __cplusplus
24
+ extern "C" {
25
+ #endif
26
+
27
+ enum { // Event names
28
+ EM_TIMER_FIRED = 100,
29
+ EM_CONNECTION_READ = 101,
30
+ EM_CONNECTION_UNBOUND = 102,
31
+ EM_CONNECTION_ACCEPTED = 103,
32
+ EM_CONNECTION_COMPLETED = 104,
33
+ EM_LOOPBREAK_SIGNAL = 105,
34
+ EM_CONNECTION_NOTIFY_READABLE = 106,
35
+ EM_CONNECTION_NOTIFY_WRITABLE = 107,
36
+ EM_SSL_HANDSHAKE_COMPLETED = 108,
37
+ EM_SSL_VERIFY = 109,
38
+ EM_PROXY_TARGET_UNBOUND = 110
39
+
40
+ };
41
+
42
+ void evma_initialize_library (void(*)(const unsigned long, int, const char*, const unsigned long));
43
+ void evma_run_machine();
44
+ void evma_release_library();
45
+ const unsigned long evma_install_oneshot_timer (int seconds);
46
+ const unsigned long evma_connect_to_server (const char *bind_addr, int bind_port, const char *server, int port);
47
+ const unsigned long evma_connect_to_unix_server (const char *server);
48
+
49
+ const unsigned long evma_attach_fd (int file_descriptor, int watch_mode);
50
+ int evma_detach_fd (const unsigned long binding);
51
+ int evma_get_file_descriptor (const unsigned long binding);
52
+ int evma_is_notify_readable (const unsigned long binding);
53
+ void evma_set_notify_readable (const unsigned long binding, int mode);
54
+ int evma_is_notify_writable (const unsigned long binding);
55
+ void evma_set_notify_writable (const unsigned long binding, int mode);
56
+
57
+ int evma_pause(const unsigned long binding);
58
+ int evma_is_paused(const unsigned long binding);
59
+ int evma_resume(const unsigned long binding);
60
+
61
+ void evma_stop_tcp_server (const unsigned long signature);
62
+ const unsigned long evma_create_tcp_server (const char *address, int port);
63
+ const unsigned long evma_create_unix_domain_server (const char *filename);
64
+ const unsigned long evma_open_datagram_socket (const char *server, int port);
65
+ const unsigned long evma_open_keyboard();
66
+ void evma_set_tls_parms (const unsigned long binding, const char *privatekey_filename, const char *certchain_filenane, int verify_peer);
67
+ void evma_start_tls (const unsigned long binding);
68
+
69
+ #ifdef WITH_SSL
70
+ X509 *evma_get_peer_cert (const unsigned long binding);
71
+ void evma_accept_ssl_peer (const unsigned long binding);
72
+ #endif
73
+
74
+ int evma_get_peername (const unsigned long binding, struct sockaddr*);
75
+ int evma_get_sockname (const unsigned long binding, struct sockaddr*);
76
+ int evma_get_subprocess_pid (const unsigned long binding, pid_t*);
77
+ int evma_get_subprocess_status (const unsigned long binding, int*);
78
+ int evma_get_connection_count();
79
+ int evma_send_data_to_connection (const unsigned long binding, const char *data, int data_length);
80
+ int evma_send_datagram (const unsigned long binding, const char *data, int data_length, const char *address, int port);
81
+ float evma_get_comm_inactivity_timeout (const unsigned long binding);
82
+ int evma_set_comm_inactivity_timeout (const unsigned long binding, float value);
83
+ float evma_get_pending_connect_timeout (const unsigned long binding);
84
+ int evma_set_pending_connect_timeout (const unsigned long binding, float value);
85
+ int evma_get_outbound_data_size (const unsigned long binding);
86
+ int evma_send_file_data_to_connection (const unsigned long binding, const char *filename);
87
+
88
+ void evma_close_connection (const unsigned long binding, int after_writing);
89
+ int evma_report_connection_error_status (const unsigned long binding);
90
+ void evma_signal_loopbreak();
91
+ void evma_set_timer_quantum (int);
92
+ int evma_get_max_timer_count();
93
+ void evma_set_max_timer_count (int);
94
+ void evma_setuid_string (const char *username);
95
+ void evma_stop_machine();
96
+ float evma_get_heartbeat_interval();
97
+ int evma_set_heartbeat_interval(float);
98
+
99
+ const unsigned long evma__write_file (const char *filename);
100
+ const unsigned long evma_popen (char * const*cmd_strings);
101
+
102
+ const unsigned long evma_watch_filename (const char *fname);
103
+ void evma_unwatch_filename (const unsigned long);
104
+
105
+ const unsigned long evma_watch_pid (int);
106
+ void evma_unwatch_pid (const unsigned long);
107
+
108
+ void evma_start_proxy(const unsigned long, const unsigned long);
109
+ void evma_stop_proxy(const unsigned long);
110
+
111
+ int evma_set_rlimit_nofile (int n_files);
112
+
113
+ void evma_set_epoll (int use);
114
+ void evma_set_kqueue (int use);
115
+
116
+ #if __cplusplus
117
+ }
118
+ #endif
119
+
120
+
121
+ #endif // __EventMachine__H_
122
+
@@ -0,0 +1,96 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: eventmachine_cpp.h
6
+ Date: 27Jul07
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
+ #ifndef __EVMA_EventmachineCpp__H_
22
+ #define __EVMA_EventmachineCpp__H_
23
+
24
+
25
+ // This material is only for directly integrating EM into C++ programs.
26
+
27
+ namespace EM {
28
+
29
+ void Callback (const unsigned long sig, int event, const char *data, const unsigned long length);
30
+ void Run (void(*)(void));
31
+ void AddTimer (int, void(*)());
32
+ void StopReactor();
33
+
34
+ /***************
35
+ class Eventable
36
+ ***************/
37
+
38
+ class Eventable {
39
+ public:
40
+ Eventable() {}
41
+ virtual ~Eventable() {}
42
+
43
+ unsigned long Signature;
44
+
45
+ // Called by the framework
46
+ virtual void ReceiveData (const char *data, int length) {}
47
+ virtual void ConnectionCompleted() {}
48
+ virtual void Accept (const unsigned long) {}
49
+ virtual void Unbind() {}
50
+ virtual void PostInit() {}
51
+ virtual void SslHandshakeCompleted() {}
52
+
53
+ void StopReactor() {EM::StopReactor();}
54
+ };
55
+
56
+ /****************
57
+ class Connection
58
+ ****************/
59
+
60
+ class Connection: public Eventable {
61
+ public:
62
+ Connection() {}
63
+ virtual ~Connection() {}
64
+
65
+ virtual void Connect (const char*, int);
66
+ virtual void BindConnect (const char *, int, const char*, int);
67
+
68
+ void SendData (const char *data);
69
+ void SendData (const char *data, int length);
70
+ void Close (bool afterWriting);
71
+ };
72
+
73
+
74
+ /**************
75
+ class Acceptor
76
+ **************/
77
+
78
+ class Acceptor: public Eventable {
79
+ public:
80
+ Acceptor() {PostInit();}
81
+ virtual ~Acceptor() {}
82
+
83
+ void Start (const char*, int);
84
+ void Accept (const unsigned long);
85
+
86
+ virtual Connection *MakeConnection() {return new Connection();}
87
+ };
88
+
89
+
90
+ };
91
+
92
+
93
+
94
+
95
+
96
+ #endif // __EVMA_EventmachineCpp__H_
data/ext/extconf.rb ADDED
@@ -0,0 +1,138 @@
1
+ require 'mkmf'
2
+
3
+ def check_libs libs = [], fatal = false
4
+ libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) }
5
+ end
6
+
7
+ def check_heads heads = [], fatal = false
8
+ heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)}
9
+ end
10
+
11
+ def add_define(name)
12
+ $defs.push("-D#{name}")
13
+ end
14
+
15
+ add_define 'BUILD_FOR_RUBY'
16
+ add_define 'HAVE_RBTRAP' if have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h'])
17
+ add_define "HAVE_TBR" if have_func('rb_thread_blocking_region')# and have_macro('RUBY_UBF_IO', 'ruby.h')
18
+ add_define "HAVE_INOTIFY" if inotify = have_func('inotify_init', 'sys/inotify.h')
19
+ add_define "HAVE_OLD_INOTIFY" if !inotify && have_macro('__NR_inotify_init', 'sys/syscall.h')
20
+ add_define 'HAVE_WRITEV' if have_func('writev', 'sys/uio.h')
21
+
22
+ # Minor platform details between *nix and Windows:
23
+
24
+ if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/
25
+ GNU_CHAIN = $1 == 'mingw'
26
+ OS_WIN32 = true
27
+ add_define "OS_WIN32"
28
+ else
29
+ GNU_CHAIN = true
30
+ OS_UNIX = true
31
+ add_define 'OS_UNIX'
32
+
33
+ add_define "HAVE_KQUEUE" if have_header("sys/event.h") and have_header("sys/queue.h")
34
+ end
35
+
36
+ # Main platform invariances:
37
+
38
+ case RUBY_PLATFORM
39
+ when /mswin32/, /mingw32/, /bccwin32/
40
+ check_heads(%w[windows.h winsock.h], true)
41
+ check_libs(%w[kernel32 rpcrt4 gdi32], true)
42
+
43
+ if GNU_CHAIN
44
+ CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
45
+ else
46
+ $defs.push "-EHs"
47
+ $defs.push "-GR"
48
+ end
49
+
50
+ when /solaris/
51
+ check_libs(%w[nsl socket], true)
52
+
53
+ add_define 'OS_SOLARIS8'
54
+
55
+ # Patch by Tim Pease, fixes SUNWspro compile problems.
56
+ if CONFIG['CC'] == 'cc'
57
+ # SUN CHAIN
58
+ $CFLAGS = CONFIG['CFLAGS'] = "-KPIC -G"
59
+ CONFIG['CCDLFLAGS'] = "-KPIC"
60
+ else
61
+ # GNU CHAIN
62
+ # on Unix we need a g++ link, not gcc.
63
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
64
+ end
65
+
66
+ when /openbsd/
67
+ # OpenBSD branch contributed by Guillaume Sellier.
68
+
69
+ # on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
70
+ CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++ -fPIC"
71
+ CONFIG['LDSHAREDXX'] = "$(CXX) -shared -lstdc++ -fPIC"
72
+
73
+ when /darwin/
74
+ # on Unix we need a g++ link, not gcc.
75
+ # Ff line contributed by Daniel Harple.
76
+ CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ')
77
+
78
+ when /linux/
79
+ add_define 'HAVE_EPOLL' if have_func('epoll_create', 'sys/epoll.h')
80
+
81
+ # Original epoll test is inadequate because 2.4 kernels have the header
82
+ # but not the code.
83
+ # add_define 'HAVE_EPOLL' if have_header('sys/epoll.h')
84
+ # if have_header('sys/epoll.h')
85
+ # File.open("hasEpollTest.c", "w") {|f|
86
+ # f.puts "#include <sys/epoll.h>"
87
+ # f.puts "int main() { epoll_create(1024); return 0;}"
88
+ # }
89
+ # (e = system( "gcc hasEpollTest.c -o hasEpollTest " )) and (e = $?.to_i)
90
+ # `rm -f hasEpollTest.c hasEpollTest`
91
+ # add_define 'HAVE_EPOLL' if e == 0
92
+ # end
93
+
94
+ # on Unix we need a g++ link, not gcc.
95
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
96
+
97
+ when /aix/
98
+ CONFIG['LDSHARED'] = "$(CXX) -shared -Wl,-G -Wl,-brtl"
99
+
100
+ else
101
+ # on Unix we need a g++ link, not gcc.
102
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
103
+ end
104
+
105
+ # OpenSSL:
106
+
107
+ def manual_ssl_config
108
+ ssl_libs_heads_args = {
109
+ :unix => [%w[ssl crypto], %w[openssl/ssl.h openssl/err.h]],
110
+ :darwin => [%w[ssl crypto C], %w[openssl/ssl.h openssl/err.h]],
111
+ # openbsd and linux:
112
+ :crypto_hack => [%w[crypto ssl crypto], %w[openssl/ssl.h openssl/err.h]],
113
+ :mswin => [%w[ssleay32 libeay32], %w[openssl/ssl.h openssl/err.h]],
114
+ }
115
+
116
+ dc_flags = ['ssl']
117
+ dc_flags += ["#{ENV['OPENSSL']}/include", ENV['OPENSSL']] if /linux/ =~ RUBY_PLATFORM
118
+
119
+ libs, heads = case RUBY_PLATFORM
120
+ when /mswin/ ; ssl_libs_heads_args[:mswin]
121
+ when /mingw/ ; ssl_libs_heads_args[:unix]
122
+ when /darwin/ ; ssl_libs_heads_args[:darwin]
123
+ when /openbsd/ ; ssl_libs_heads_args[:crypto_hack]
124
+ when /linux/ ; ssl_libs_heads_args[:crypto_hack]
125
+ else ssl_libs_heads_args[:unix]
126
+ end
127
+ dir_config(*dc_flags)
128
+ check_libs(libs) and check_heads(heads)
129
+ end
130
+
131
+ # Try to use pkg_config first, fixes #73
132
+ if pkg_config('openssl') || manual_ssl_config
133
+ add_define "WITH_SSL"
134
+ else
135
+ add_define "WITHOUT_SSL"
136
+ end
137
+
138
+ create_makefile "rubyeventmachine"