cool.io 1.2.3-x86-mingw32 → 1.4.1-x86-mingw32

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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/.travis.yml +3 -3
  4. data/CHANGES.md +35 -0
  5. data/README.md +1 -3
  6. data/Rakefile +11 -13
  7. data/cool.io.gemspec +3 -2
  8. data/examples/callbacked_echo_server.rb +24 -0
  9. data/ext/cool.io/extconf.rb +8 -24
  10. data/ext/cool.io/loop.c +1 -1
  11. data/ext/iobuffer/iobuffer.c +2 -0
  12. data/ext/libev/Changes +123 -4
  13. data/ext/libev/LICENSE +2 -1
  14. data/ext/libev/README +8 -8
  15. data/ext/libev/ev.c +313 -144
  16. data/ext/libev/ev.h +18 -10
  17. data/ext/libev/ev_epoll.c +4 -1
  18. data/ext/libev/ev_kqueue.c +1 -1
  19. data/ext/libev/ev_select.c +3 -4
  20. data/ext/libev/ev_vars.h +3 -2
  21. data/ext/libev/ev_win32.c +1 -1
  22. data/ext/libev/win_select.patch +115 -0
  23. data/lib/cool.io.rb +6 -4
  24. data/lib/cool.io/dns_resolver.rb +4 -10
  25. data/lib/cool.io/dsl.rb +6 -2
  26. data/lib/cool.io/io.rb +36 -16
  27. data/lib/cool.io/loop.rb +3 -11
  28. data/lib/cool.io/meta.rb +2 -2
  29. data/lib/cool.io/version.rb +4 -2
  30. data/spec/async_watcher_spec.rb +5 -5
  31. data/spec/dns_spec.rb +11 -7
  32. data/spec/iobuffer_spec.rb +147 -0
  33. data/spec/spec_helper.rb +2 -2
  34. data/spec/stat_watcher_spec.rb +3 -3
  35. data/spec/tcp_server_spec.rb +98 -5
  36. data/spec/tcp_socket_spec.rb +185 -0
  37. data/spec/timer_watcher_spec.rb +23 -19
  38. data/spec/udp_socket_spec.rb +58 -0
  39. data/spec/unix_listener_spec.rb +7 -7
  40. data/spec/unix_server_spec.rb +7 -7
  41. metadata +83 -103
  42. data/examples/httpclient.rb +0 -38
  43. data/ext/http11_client/.gitignore +0 -5
  44. data/ext/http11_client/LICENSE +0 -31
  45. data/ext/http11_client/ext_help.h +0 -14
  46. data/ext/http11_client/extconf.rb +0 -6
  47. data/ext/http11_client/http11_client.c +0 -300
  48. data/ext/http11_client/http11_parser.c +0 -403
  49. data/ext/http11_client/http11_parser.h +0 -48
  50. data/ext/http11_client/http11_parser.rl +0 -173
  51. data/lib/cool.io/eventmachine.rb +0 -234
  52. data/lib/cool.io/http_client.rb +0 -427
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libev native API header
3
3
  *
4
- * Copyright (c) 2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007,2008,2009,2010,2011,2012,2015 Marc Alexander Lehmann <libev@schmorp.de>
5
5
  * All rights reserved.
6
6
  *
7
7
  * Redistribution and use in source and binary forms, with or without modifica-
@@ -42,12 +42,16 @@
42
42
 
43
43
  #ifdef __cplusplus
44
44
  # define EV_CPP(x) x
45
+ # if __cplusplus >= 201103L
46
+ # define EV_THROW noexcept
47
+ # else
48
+ # define EV_THROW throw ()
49
+ # endif
45
50
  #else
46
51
  # define EV_CPP(x)
52
+ # define EV_THROW
47
53
  #endif
48
54
 
49
- #define EV_THROW EV_CPP(throw())
50
-
51
55
  EV_CPP(extern "C" {)
52
56
 
53
57
  /*****************************************************************************/
@@ -148,6 +152,8 @@ EV_CPP(extern "C" {)
148
152
 
149
153
  typedef double ev_tstamp;
150
154
 
155
+ #include <string.h> /* for memmove */
156
+
151
157
  #ifndef EV_ATOMIC_T
152
158
  # include <signal.h>
153
159
  # define EV_ATOMIC_T sig_atomic_t volatile
@@ -205,7 +211,7 @@ struct ev_loop;
205
211
  /*****************************************************************************/
206
212
 
207
213
  #define EV_VERSION_MAJOR 4
208
- #define EV_VERSION_MINOR 15
214
+ #define EV_VERSION_MINOR 20
209
215
 
210
216
  /* eventmask, revents, events... */
211
217
  enum {
@@ -658,8 +664,10 @@ EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_T
658
664
  /* advanced stuff for threading etc. support, see docs */
659
665
  EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_THROW;
660
666
  EV_API_DECL void *ev_userdata (EV_P) EV_THROW;
661
- EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ void (*invoke_pending_cb)(EV_P)) EV_THROW;
662
- EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P), void (*acquire)(EV_P) EV_THROW) EV_THROW;
667
+ typedef void (*ev_loop_callback)(EV_P);
668
+ EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_THROW;
669
+ /* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */
670
+ EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_THROW, void (*acquire)(EV_P) EV_THROW) EV_THROW;
663
671
 
664
672
  EV_API_DECL unsigned int ev_pending_count (EV_P) EV_THROW; /* number of pending events, if any */
665
673
  EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */
@@ -713,7 +721,8 @@ EV_API_DECL void ev_resume (EV_P) EV_THROW;
713
721
  #define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */
714
722
  #define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */
715
723
 
716
- #define ev_cb(ev) (ev)->cb /* rw */
724
+ #define ev_cb_(ev) (ev)->cb /* rw */
725
+ #define ev_cb(ev) (memmove (&ev_cb_ (ev), &((ev_watcher *)(ev))->cb, sizeof (ev_cb_ (ev))), (ev)->cb)
717
726
 
718
727
  #if EV_MINPRI == EV_MAXPRI
719
728
  # define ev_priority(ev) ((ev), EV_MINPRI)
@@ -726,11 +735,11 @@ EV_API_DECL void ev_resume (EV_P) EV_THROW;
726
735
  #define ev_periodic_at(ev) (+((ev_watcher_time *)(ev))->at)
727
736
 
728
737
  #ifndef ev_set_cb
729
- # define ev_set_cb(ev,cb_) ev_cb (ev) = (cb_)
738
+ # define ev_set_cb(ev,cb_) (ev_cb_ (ev) = (cb_), memmove (&((ev_watcher *)(ev))->cb, &ev_cb_ (ev), sizeof (ev_cb_ (ev))))
730
739
  #endif
731
740
 
732
741
  /* stopping (enabling, adding) a watcher does nothing if it is already running */
733
- /* stopping (disabling, deleting) a watcher does nothing unless its already running */
742
+ /* stopping (disabling, deleting) a watcher does nothing unless it's already running */
734
743
  #if EV_PROTOTYPES
735
744
 
736
745
  /* feeds an event into a watcher as if the event actually occurred */
@@ -842,4 +851,3 @@ EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_THROW;
842
851
  EV_CPP(})
843
852
 
844
853
  #endif
845
-
@@ -228,7 +228,10 @@ epoll_poll (EV_P_ ev_tstamp timeout)
228
228
  if (anfds [fd].emask & EV_EMASK_EPERM && events)
229
229
  fd_event (EV_A_ fd, events);
230
230
  else
231
- epoll_eperms [i] = epoll_eperms [--epoll_epermcnt];
231
+ {
232
+ epoll_eperms [i] = epoll_eperms [--epoll_epermcnt];
233
+ anfds [fd].emask = 0;
234
+ }
232
235
  }
233
236
  }
234
237
 
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libev kqueue backend
3
3
  *
4
- * Copyright (c) 2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann <libev@schmorp.de>
5
5
  * All rights reserved.
6
6
  *
7
7
  * Redistribution and use in source and binary forms, with or without modifica-
@@ -106,6 +106,7 @@ if (__i == ((fd_set *)(set))->fd_count) {\
106
106
  } while(0)
107
107
  #define EV_WIN_FD_ZERO(set) (((fd_set *)(set))->fd_count=0)
108
108
  #define EV_WIN_FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set))
109
+ #define EV_WIN_FD_COUNT(set) (((fd_set *)(set))->fd_count)
109
110
  /* ######################################## */
110
111
  #else
111
112
  #define EV_WIN_FD_CLR FD_CLR
@@ -183,8 +184,6 @@ select_modify (EV_P_ int fd, int oev, int nev)
183
184
  }
184
185
  }
185
186
 
186
- #undef socket
187
-
188
187
  static void
189
188
  select_poll (EV_P_ ev_tstamp timeout)
190
189
  {
@@ -246,8 +245,8 @@ select_poll (EV_P_ ev_tstamp timeout)
246
245
  {
247
246
  if (timeout)
248
247
  {
249
- unsigned long ms = timeout * 1e3;
250
- Sleep (ms ? ms : 1);
248
+ unsigned long ms = (unsigned long)(timeout * 1e3);
249
+ SleepEx (ms ? ms : 1, TRUE);
251
250
  }
252
251
 
253
252
  return;
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * loop member variable declarations
3
3
  *
4
- * Copyright (c) 2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann <libev@schmorp.de>
5
5
  * All rights reserved.
6
6
  *
7
7
  * Redistribution and use in source and binary forms, with or without modifica-
@@ -194,9 +194,10 @@ VARx(unsigned int, loop_count) /* total number of loop iterations/blocks */
194
194
  VARx(unsigned int, loop_depth) /* #ev_run enters - #ev_run leaves */
195
195
 
196
196
  VARx(void *, userdata)
197
+ /* C++ doesn't support the ev_loop_callback typedef here. stinks. */
197
198
  VAR (release_cb, void (*release_cb)(EV_P) EV_THROW)
198
199
  VAR (acquire_cb, void (*acquire_cb)(EV_P) EV_THROW)
199
- VAR (invoke_cb , void (*invoke_cb) (EV_P))
200
+ VAR (invoke_cb , ev_loop_callback invoke_cb)
200
201
  #endif
201
202
 
202
203
  #undef VARx
@@ -143,7 +143,7 @@ fail:
143
143
 
144
144
  #undef pipe
145
145
  #define pipe(filedes) ev_pipe (filedes)
146
-
146
+
147
147
  #define EV_HAVE_EV_TIME 1
148
148
  ev_tstamp
149
149
  ev_time (void)
@@ -0,0 +1,115 @@
1
+ diff --git a/ext/libev/ev_select.c b/ext/libev/ev_select.c
2
+ index f38d6ca..3a32642 100644
3
+ --- a/ext/libev/ev_select.c
4
+ +++ b/ext/libev/ev_select.c
5
+ @@ -67,6 +67,53 @@
6
+
7
+ #include <string.h>
8
+
9
+ +#ifdef _WIN32
10
+ +/*
11
+ +########## COOLIO PATCHERY HO! ##########
12
+ +
13
+ +Ruby undefs FD_* utilities for own implementation.
14
+ +It converts fd argument into socket handle internally on Windows,
15
+ +so libev should not use Ruby's FD_* utilities.
16
+ +
17
+ +Following FD_* utilities come from MinGW.
18
+ +RubyInstaller is built by MinGW so this should work.
19
+ +*/
20
+ +int PASCAL __WSAFDIsSet(SOCKET,fd_set*);
21
+ +#define EV_WIN_FD_CLR(fd,set) do { u_int __i;\
22
+ +for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\
23
+ + if (((fd_set *)(set))->fd_array[__i] == (fd)) {\
24
+ + while (__i < ((fd_set *)(set))->fd_count-1) {\
25
+ + ((fd_set*)(set))->fd_array[__i] = ((fd_set*)(set))->fd_array[__i+1];\
26
+ + __i++;\
27
+ + }\
28
+ + ((fd_set*)(set))->fd_count--;\
29
+ + break;\
30
+ + }\
31
+ +}\
32
+ +} while (0)
33
+ +#define EV_WIN_FD_SET(fd, set) do { u_int __i;\
34
+ +for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\
35
+ + if (((fd_set *)(set))->fd_array[__i] == (fd)) {\
36
+ + break;\
37
+ + }\
38
+ +}\
39
+ +if (__i == ((fd_set *)(set))->fd_count) {\
40
+ + if (((fd_set *)(set))->fd_count < FD_SETSIZE) {\
41
+ + ((fd_set *)(set))->fd_array[__i] = (fd);\
42
+ + ((fd_set *)(set))->fd_count++;\
43
+ + }\
44
+ +}\
45
+ +} while(0)
46
+ +#define EV_WIN_FD_ZERO(set) (((fd_set *)(set))->fd_count=0)
47
+ +#define EV_WIN_FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set))
48
+ +/* ######################################## */
49
+ +#else
50
+ +#define EV_WIN_FD_CLR FD_CLR
51
+ +#define EV_WIN_FD_SET FD_SET
52
+ +#define EV_WIN_FD_ZERO FD_ZERO
53
+ +#define EV_WIN_FD_ISSET FD_ISSET
54
+ +#endif
55
+ +
56
+ static void
57
+ select_modify (EV_P_ int fd, int oev, int nev)
58
+ {
59
+ @@ -91,17 +138,17 @@ select_modify (EV_P_ int fd, int oev, int nev)
60
+ if ((oev ^ nev) & EV_READ)
61
+ #endif
62
+ if (nev & EV_READ)
63
+ - FD_SET (handle, (fd_set *)vec_ri);
64
+ + EV_WIN_FD_SET (handle, (fd_set *)vec_ri);
65
+ else
66
+ - FD_CLR (handle, (fd_set *)vec_ri);
67
+ + EV_WIN_FD_CLR (handle, (fd_set *)vec_ri);
68
+
69
+ #if EV_SELECT_IS_WINSOCKET
70
+ if ((oev ^ nev) & EV_WRITE)
71
+ #endif
72
+ if (nev & EV_WRITE)
73
+ - FD_SET (handle, (fd_set *)vec_wi);
74
+ + EV_WIN_FD_SET (handle, (fd_set *)vec_wi);
75
+ else
76
+ - FD_CLR (handle, (fd_set *)vec_wi);
77
+ + EV_WIN_FD_CLR (handle, (fd_set *)vec_wi);
78
+
79
+ #else
80
+
81
+ @@ -136,6 +183,8 @@ select_modify (EV_P_ int fd, int oev, int nev)
82
+ }
83
+ }
84
+
85
+ +#undef socket
86
+ +
87
+ static void
88
+ select_poll (EV_P_ ev_tstamp timeout)
89
+ {
90
+ @@ -230,10 +279,10 @@ select_poll (EV_P_ ev_tstamp timeout)
91
+ int handle = fd;
92
+ #endif
93
+
94
+ - if (FD_ISSET (handle, (fd_set *)vec_ro)) events |= EV_READ;
95
+ - if (FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE;
96
+ + if (EV_WIN_FD_ISSET (handle, (fd_set *)vec_ro)) events |= EV_READ;
97
+ + if (EV_WIN_FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE;
98
+ #ifdef _WIN32
99
+ - if (FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE;
100
+ + if (EV_WIN_FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE;
101
+ #endif
102
+
103
+ if (expect_true (events))
104
+ @@ -279,9 +328,9 @@ select_init (EV_P_ int flags)
105
+ backend_poll = select_poll;
106
+
107
+ #if EV_SELECT_USE_FD_SET
108
+ - vec_ri = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_ri);
109
+ + vec_ri = ev_malloc (sizeof (fd_set)); EV_WIN_FD_ZERO ((fd_set *)vec_ri);
110
+ vec_ro = ev_malloc (sizeof (fd_set));
111
+ - vec_wi = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_wi);
112
+ + vec_wi = ev_malloc (sizeof (fd_set)); EV_WIN_FD_ZERO ((fd_set *)vec_wi);
113
+ vec_wo = ev_malloc (sizeof (fd_set));
114
+ #ifdef _WIN32
115
+ vec_eo = ev_malloc (sizeof (fd_set));
@@ -19,14 +19,16 @@ require "cool.io/listener"
19
19
  require "cool.io/dns_resolver"
20
20
  require "cool.io/socket"
21
21
  require "cool.io/server"
22
- require "cool.io/http_client"
23
- require "cool.io/dsl"
24
22
 
25
23
  module Coolio
26
- def self.inspect; "Cool.io"; end
24
+ def self.inspect
25
+ "Cool.io"
26
+ end
27
27
  end
28
28
 
29
29
  module Cool
30
30
  # Allow Coolio module to be referenced as Cool.io
31
- def self.io; Coolio; end
31
+ def self.io
32
+ Coolio
33
+ end
32
34
  end
@@ -17,6 +17,8 @@
17
17
  #
18
18
  #++
19
19
 
20
+ require 'resolv'
21
+
20
22
  module Coolio
21
23
  # A non-blocking DNS resolver. It provides interfaces for querying both
22
24
  # /etc/hosts and nameserves listed in /etc/resolv.conf, or nameservers of
@@ -31,12 +33,6 @@ module Coolio
31
33
  # again.
32
34
  class DNSResolver < IOWatcher
33
35
  #--
34
- # TODO check if it's caching right
35
- if RUBY_PLATFORM =~ /mingw|win32/
36
- HOSTS = 'c:\WINDOWS\system32\drivers\etc\hosts'
37
- else
38
- HOSTS = '/etc/hosts'
39
- end
40
36
  DNS_PORT = 53
41
37
  DATAGRAM_SIZE = 512
42
38
  TIMEOUT = 3 # Retry timeout for each datagram sent
@@ -44,7 +40,7 @@ module Coolio
44
40
  # so currently total is 12s before it will err due to timeouts
45
41
  # if it errs due to inability to reach the DNS server [Errno::EHOSTUNREACH], same
46
42
  # Query /etc/hosts (or the specified hostfile) for the given host
47
- def self.hosts(host, hostfile = HOSTS)
43
+ def self.hosts(host, hostfile = Resolv::Hosts::DefaultFileName)
48
44
  hosts = {}
49
45
  File.open(hostfile) do |f|
50
46
  f.each_line do |host_entry|
@@ -63,7 +59,6 @@ module Coolio
63
59
  # use nameservers listed in /etc/resolv.conf
64
60
  def initialize(hostname, *nameservers)
65
61
  if nameservers.empty?
66
- require 'resolv'
67
62
  nameservers = Resolv::DNS::Config.default_config_hash[:nameserver]
68
63
  raise RuntimeError, "no nameservers found" if nameservers.empty? # TODO just call resolve_failed, not raise [also handle Errno::ENOENT)]
69
64
  end
@@ -111,9 +106,8 @@ module Coolio
111
106
  def send_request
112
107
  nameserver = @nameservers.shift
113
108
  @nameservers << nameserver # rotate them
114
- @socket.connect @nameservers.first, DNS_PORT
115
109
  begin
116
- @socket.send request_message, 0
110
+ @socket.send request_message, 0, @nameservers.first, DNS_PORT
117
111
  rescue Errno::EHOSTUNREACH # TODO figure out why it has to be wrapper here, when the other wrapper should be wrapping this one!
118
112
  end
119
113
  end
@@ -124,11 +124,15 @@ end
124
124
  # The Cool module containing all our coolness
125
125
  module Cool
126
126
  module Coolness
127
- def cool; Cool::IOThunk; end
127
+ def cool
128
+ Cool::IOThunk
129
+ end
128
130
  end
129
131
 
130
132
  module IOThunk
131
- def self.io; Coolio::DSL; end
133
+ def self.io
134
+ Coolio::DSL
135
+ end
132
136
  end
133
137
  end
134
138
 
@@ -31,25 +31,45 @@ module Coolio
31
31
  #
32
32
 
33
33
  # Attach to the event loop
34
- def attach(loop); @_read_watcher.attach loop; schedule_write if !@_write_buffer.empty?; self; end
34
+ def attach(loop)
35
+ @_read_watcher.attach(loop)
36
+ schedule_write if !@_write_buffer.empty?
37
+ self
38
+ end
35
39
 
36
40
  # Detach from the event loop
37
- def detach; @_read_watcher.detach; self; end # TODO should these detect write buffers, as well?
41
+ def detach
42
+ # TODO should these detect write buffers, as well?
43
+ @_read_watcher.detach
44
+ self
45
+ end
38
46
 
39
47
  # Enable the watcher
40
- def enable; @_read_watcher.enable; self; end
48
+ def enable
49
+ @_read_watcher.enable
50
+ self
51
+ end
41
52
 
42
53
  # Disable the watcher
43
- def disable; @_read_watcher.disable; self; end
54
+ def disable
55
+ @_read_watcher.disable
56
+ self
57
+ end
44
58
 
45
59
  # Is the watcher attached?
46
- def attached?; @_read_watcher.attached?; end
60
+ def attached?
61
+ @_read_watcher.attached?
62
+ end
47
63
 
48
64
  # Is the watcher enabled?
49
- def enabled?; @_read_watcher.enabled?; end
65
+ def enabled?
66
+ @_read_watcher.enabled?
67
+ end
50
68
 
51
69
  # Obtain the event loop associated with this object
52
- def evloop; @_read_watcher.evloop; end
70
+ def evloop
71
+ @_read_watcher.evloop
72
+ end
53
73
 
54
74
  #
55
75
  # Callbacks for asynchronous events
@@ -78,16 +98,11 @@ module Coolio
78
98
  data.size
79
99
  end
80
100
 
81
- # Number of bytes are currently in the output buffer
82
- def output_buffer_size
83
- @_write_buffer.size
84
- end
85
-
86
101
  # Close the IO stream
87
102
  def close
88
103
  detach if attached?
89
104
  detach_write_watcher
90
- @_io.close unless @_io.closed?
105
+ @_io.close unless closed?
91
106
 
92
107
  on_close
93
108
  nil
@@ -136,7 +151,7 @@ module Coolio
136
151
  # Schedule a write to be performed when the IO object becomes writable
137
152
  def schedule_write
138
153
  return unless @_io # this would mean 'we are still pre DNS here'
139
- return unless attached? # this would mean 'currently unattached' -- ie still pre DNS, or just plain not attached, which is ok
154
+ return unless @_read_watcher.attached? # this would mean 'currently unattached' -- ie still pre DNS, or just plain not attached, which is ok
140
155
  begin
141
156
  enable_write_watcher
142
157
  rescue IOError
@@ -167,8 +182,13 @@ module Coolio
167
182
  end
168
183
 
169
184
  # Configure IOWatcher event callbacks to call the method passed to #initialize
170
- def on_readable; @coolio_io.__send__(:on_readable); end
171
- def on_writable; @coolio_io.__send__(:on_writable); end
185
+ def on_readable
186
+ @coolio_io.__send__(:on_readable)
187
+ end
188
+
189
+ def on_writable
190
+ @coolio_io.__send__(:on_writable)
191
+ end
172
192
  end
173
193
  end
174
194
  end