noderb 0.0.3 → 0.0.4

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 (51) hide show
  1. data/README.md +157 -7
  2. data/ext/noderb_extension/extconf.rb +1 -3
  3. data/ext/noderb_extension/libuv/BSDmakefile +2 -0
  4. data/ext/noderb_extension/libuv/all.gyp +326 -0
  5. data/ext/noderb_extension/libuv/config-mingw.mk +0 -1
  6. data/ext/noderb_extension/libuv/config-unix.mk +7 -1
  7. data/ext/noderb_extension/libuv/create-msvs-files.bat +13 -6
  8. data/ext/noderb_extension/libuv/{build/gyp_uv → gyp_uv} +1 -2
  9. data/ext/noderb_extension/libuv/include/uv.h +5 -0
  10. data/ext/noderb_extension/libuv/src/eio/config_cygwin.h +3 -0
  11. data/ext/noderb_extension/libuv/src/eio/config_freebsd.h +3 -0
  12. data/ext/noderb_extension/libuv/src/eio/config_sunos.h +3 -0
  13. data/ext/noderb_extension/libuv/src/eio/ecb.h +1 -1
  14. data/ext/noderb_extension/libuv/src/eio/eio.c +8 -1
  15. data/ext/noderb_extension/libuv/src/uv-common.c +1 -0
  16. data/ext/noderb_extension/libuv/src/uv-sunos.c +1 -1
  17. data/ext/noderb_extension/libuv/src/uv-unix.c +72 -59
  18. data/ext/noderb_extension/libuv/src/win/core.c +3 -0
  19. data/ext/noderb_extension/libuv/src/win/internal.h +11 -0
  20. data/ext/noderb_extension/libuv/src/win/ntdll.h +130 -0
  21. data/ext/noderb_extension/libuv/src/win/pipe.c +105 -27
  22. data/ext/noderb_extension/libuv/src/win/process.c +76 -5
  23. data/ext/noderb_extension/libuv/src/win/req.c +7 -0
  24. data/ext/noderb_extension/libuv/src/win/winapi.c +52 -0
  25. data/ext/noderb_extension/libuv/test/benchmark-pound.c +50 -48
  26. data/ext/noderb_extension/libuv/test/echo-server.c +2 -2
  27. data/ext/noderb_extension/libuv/test/test-list.h +2 -0
  28. data/ext/noderb_extension/libuv/test/test-spawn.c +48 -1
  29. data/ext/noderb_extension/noderb.c +38 -339
  30. data/ext/noderb_extension/noderb.h +18 -2
  31. data/ext/noderb_extension/noderb_common.h +13 -0
  32. data/ext/noderb_extension/noderb_dns.c +37 -0
  33. data/ext/noderb_extension/noderb_dns.h +15 -0
  34. data/ext/noderb_extension/noderb_process.c +126 -0
  35. data/ext/noderb_extension/noderb_process.h +17 -0
  36. data/ext/noderb_extension/noderb_tcp.c +127 -0
  37. data/ext/noderb_extension/noderb_tcp.h +19 -0
  38. data/ext/noderb_extension/noderb_timers.c +58 -0
  39. data/ext/noderb_extension/noderb_timers.h +16 -0
  40. data/ext/noderb_extension/noderb_tools.c +127 -0
  41. data/ext/noderb_extension/noderb_tools.h +33 -0
  42. data/lib/noderb/dns.rb +11 -0
  43. data/lib/noderb/next_tick.rb +2 -1
  44. data/lib/noderb/tcp.rb +27 -0
  45. data/lib/noderb/timers.rb +24 -0
  46. data/lib/noderb/version.rb +1 -1
  47. data/lib/noderb.rb +6 -1
  48. metadata +23 -7
  49. data/ext/noderb_extension/libuv/build/all.gyp +0 -254
  50. data/ext/noderb_extension/libuv/doc/desired-api.md +0 -159
  51. /data/ext/noderb_extension/libuv/{build/common.gypi → common.gypi} +0 -0
data/README.md CHANGED
@@ -1,21 +1,171 @@
1
1
  # NodeRb
2
2
 
3
- ## What is it?
4
-
5
- NodeJs - JavaScript + Ruby
3
+ NodeRb = NodeJs - JavaScript + Ruby
6
4
 
7
5
  ## Status
8
6
 
9
7
  It could not be more prototype than it is.
10
8
 
11
- ## Does it work?
12
-
13
- Somehow.
14
-
15
9
  ## Instalation
16
10
 
17
11
  gem install noderb
18
12
 
13
+ ## Usage
14
+
15
+ ### Starting loop
16
+
17
+ require "noderb"
18
+
19
+ NodeRb.start do
20
+ # Do something
21
+ end
22
+
23
+ ### Running code on next tick
24
+
25
+ NodeRb.next_tick do
26
+ # Do something
27
+ end
28
+
29
+ ### Connecting to server
30
+
31
+ Connects to specific hostname/IP address and port using TCP.
32
+
33
+ class Handler
34
+
35
+ include NodeRb::Connection
36
+
37
+ def on_connect
38
+ # Do something
39
+ write_data("Some data")
40
+ end
41
+
42
+ def on_data data
43
+ # Do something
44
+ close_connection
45
+ end
46
+
47
+ def on_close
48
+ # Do something
49
+ end
50
+
51
+ end
52
+
53
+ NodeRb.start_client("host", port, Handler.new)
54
+
55
+ ### Starting server
56
+
57
+ Starts new server on specific hostname/IP address and port using TCP.
58
+
59
+ class Handler
60
+
61
+ include NodeRb::Connection
62
+
63
+ def on_connect
64
+ # Do something
65
+ write_data("Some data")
66
+ end
67
+
68
+ def on_data data
69
+ # Do something
70
+ close_connection
71
+ end
72
+
73
+ def on_close
74
+ # Do something
75
+ end
76
+
77
+ end
78
+
79
+ NodeRb.start_server("host", port, Handler)
80
+
81
+ ### Starting child process
82
+
83
+ Starts new process in specific directory and with specific environment.
84
+
85
+ class Handler
86
+
87
+ include NodeRb::Process
88
+
89
+ def on_start
90
+ # Do something
91
+ write_data("Some data")
92
+ end
93
+
94
+ def on_stdout data
95
+ # Do something
96
+ kill_process
97
+ end
98
+
99
+ def on_stderr data
100
+ # Do something
101
+ end
102
+
103
+ def on_exit status, signal
104
+ # Do something
105
+ end
106
+ end
107
+
108
+ args = ["argument", "list"]
109
+ env = ["VAR1=value", "VAR2=value"]
110
+
111
+ NodeRb.start_process("executable", args, env, "working_directory", Handler.new)
112
+
113
+ ### Resolving hostnames
114
+
115
+ Resolves hostname to IP address.
116
+
117
+ NodeRb.resolve("hostname") do |ip|
118
+ # Do something with the IP address
119
+ end
120
+
121
+ ### Scheduling events
122
+
123
+ Runs specified code in the future of *timeout* seconds.
124
+
125
+ NodeRb.once(timeout) do
126
+ # Do something
127
+ end
128
+
129
+ Schedules new repeated event that will be called every *timeout* seconds.
130
+
131
+ class Handler
132
+
133
+ include NodeRb::Timer
134
+
135
+ def call
136
+ # Do something
137
+ stop_timer
138
+ end
139
+
140
+ end
141
+
142
+ NodeRb.repeat(timeout, Handler.new)
143
+
144
+ ## ToDo
145
+
146
+ * File IO
147
+ * UDP support
148
+ * Better documentation
149
+ * Tests
150
+ * ensure Windows support
151
+ * lots, lots more
152
+
153
+ ## Changelog
154
+
155
+ ### 0.0.4
156
+
157
+ * Hostname resolution
158
+ * Timers support
159
+ * Huge code refactorings
160
+
161
+ ## Compatibility
162
+
163
+ * Full
164
+ ** Ruby 1.8
165
+ ** Ruby 1.9
166
+ * Preliminary
167
+ ** Rubinius
168
+
19
169
  ## Dependencies
20
170
 
21
171
  No external dependencies except compiler for native extension.
@@ -1,8 +1,6 @@
1
1
  require "mkmf"
2
2
 
3
- LIBUV = "75c109055d330bdd6177"
4
-
5
- `cd libuv; git fetch; git reset --hard #{LIBUV}; make; cd ..; cp libuv/uv.a libuv.a`
3
+ `cd libuv; make; cd ..; cp libuv/uv.a libuv.a`
6
4
 
7
5
  dir_config("uv", File.expand_path("../libuv/include", __FILE__), File.expand_path("../libuv", __FILE__))
8
6
 
@@ -0,0 +1,2 @@
1
+ all:
2
+ @echo "I need GNU make. Please run \`gmake\` instead."
@@ -0,0 +1,326 @@
1
+ {
2
+ 'target_defaults': {
3
+ 'default_configuration': 'Debug',
4
+ 'configurations': {
5
+ # TODO: hoist these out and put them somewhere common, because
6
+ # RuntimeLibrary MUST MATCH across the entire project
7
+ 'Debug': {
8
+ 'defines': [ 'DEBUG', '_DEBUG' ],
9
+ 'msvs_settings': {
10
+ 'VCCLCompilerTool': {
11
+ 'RuntimeLibrary': 1, # static debug
12
+ },
13
+ },
14
+ },
15
+ 'Release': {
16
+ 'defines': [ 'NDEBUG' ],
17
+ 'msvs_settings': {
18
+ 'VCCLCompilerTool': {
19
+ 'RuntimeLibrary': 0, # static release
20
+ },
21
+ },
22
+ }
23
+ },
24
+ 'msvs_settings': {
25
+ 'VCCLCompilerTool': {
26
+ },
27
+ 'VCLibrarianTool': {
28
+ },
29
+ 'VCLinkerTool': {
30
+ 'GenerateDebugInformation': 'true',
31
+ },
32
+ },
33
+ 'conditions': [
34
+ ['OS == "win"', {
35
+ 'defines': [
36
+ 'WIN32'
37
+ ],
38
+ }]
39
+ ],
40
+ },
41
+
42
+ 'targets': [
43
+ {
44
+ 'target_name': 'uv',
45
+ 'type': 'static_library',
46
+ 'include_dirs': [ 'include' ],
47
+ 'direct_dependent_settings': {
48
+ 'include_dirs': [ 'include' ],
49
+ },
50
+
51
+ 'defines': [
52
+ 'HAVE_CONFIG_H'
53
+ ],
54
+ 'sources': [
55
+ 'include/ares.h',
56
+ 'include/ares_version.h',
57
+ 'include/uv.h',
58
+ 'src/uv-common.c',
59
+ 'src/uv-common.h',
60
+ 'src/ares/ares__close_sockets.c',
61
+ 'src/ares/ares__get_hostent.c',
62
+ 'src/ares/ares__read_line.c',
63
+ 'src/ares/ares__timeval.c',
64
+ 'src/ares/ares_cancel.c',
65
+ 'src/ares/ares_data.c',
66
+ 'src/ares/ares_data.h',
67
+ 'src/ares/ares_destroy.c',
68
+ 'src/ares/ares_dns.h',
69
+ 'src/ares/ares_expand_name.c',
70
+ 'src/ares/ares_expand_string.c',
71
+ 'src/ares/ares_fds.c',
72
+ 'src/ares/ares_free_hostent.c',
73
+ 'src/ares/ares_free_string.c',
74
+ 'src/ares/ares_gethostbyaddr.c',
75
+ 'src/ares/ares_gethostbyname.c',
76
+ 'src/ares/ares_getnameinfo.c',
77
+ 'src/ares/ares_getopt.c',
78
+ 'src/ares/ares_getopt.h',
79
+ 'src/ares/ares_getsock.c',
80
+ 'src/ares/ares_init.c',
81
+ 'src/ares/ares_ipv6.h',
82
+ 'src/ares/ares_library_init.c',
83
+ 'src/ares/ares_library_init.h',
84
+ 'src/ares/ares_llist.c',
85
+ 'src/ares/ares_llist.h',
86
+ 'src/ares/ares_mkquery.c',
87
+ 'src/ares/ares_nowarn.c',
88
+ 'src/ares/ares_nowarn.h',
89
+ 'src/ares/ares_options.c',
90
+ 'src/ares/ares_parse_a_reply.c',
91
+ 'src/ares/ares_parse_aaaa_reply.c',
92
+ 'src/ares/ares_parse_mx_reply.c',
93
+ 'src/ares/ares_parse_ns_reply.c',
94
+ 'src/ares/ares_parse_ptr_reply.c',
95
+ 'src/ares/ares_parse_srv_reply.c',
96
+ 'src/ares/ares_parse_txt_reply.c',
97
+ 'src/ares/ares_private.h',
98
+ 'src/ares/ares_process.c',
99
+ 'src/ares/ares_query.c',
100
+ 'src/ares/ares_rules.h',
101
+ 'src/ares/ares_search.c',
102
+ 'src/ares/ares_send.c',
103
+ 'src/ares/ares_setup.h',
104
+ 'src/ares/ares_strcasecmp.c',
105
+ 'src/ares/ares_strcasecmp.h',
106
+ 'src/ares/ares_strdup.c',
107
+ 'src/ares/ares_strdup.h',
108
+ 'src/ares/ares_strerror.c',
109
+ 'src/ares/ares_timeout.c',
110
+ 'src/ares/ares_version.c',
111
+ 'src/ares/ares_writev.c',
112
+ 'src/ares/ares_writev.h',
113
+ 'src/ares/bitncmp.c',
114
+ 'src/ares/bitncmp.h',
115
+ 'src/ares/inet_net_pton.c',
116
+ 'src/ares/inet_net_pton.h',
117
+ 'src/ares/inet_ntop.c',
118
+ 'src/ares/inet_ntop.h',
119
+ 'src/ares/nameser.h',
120
+ 'src/ares/setup_once.h',
121
+ ],
122
+ 'conditions': [
123
+ [ 'OS=="win"', {
124
+ 'include_dirs': [
125
+ 'src/ares/config_win32'
126
+ ],
127
+ 'sources': [ 'src/ares/windows_port.c' ],
128
+ 'defines': [
129
+ '_WIN32_WINNT=0x0502',
130
+ 'EIO_STACKSIZE=262144',
131
+ '_GNU_SOURCE',
132
+ ],
133
+ 'sources': [
134
+ 'include/tree.h',
135
+ 'include/uv-win.h',
136
+ 'src/ares/config_win32/ares_config.h',
137
+ 'src/win/async.c',
138
+ 'src/win/cares.c',
139
+ 'src/win/core.c',
140
+ 'src/win/error.c',
141
+ 'src/win/getaddrinfo.c',
142
+ 'src/win/handle.c',
143
+ 'src/win/internal.h',
144
+ 'src/win/loop-watcher.c',
145
+ 'src/win/ntdll.h',
146
+ 'src/win/pipe.c',
147
+ 'src/win/process.c',
148
+ 'src/win/req.c',
149
+ 'src/win/stdio.c',
150
+ 'src/win/stream.c',
151
+ 'src/win/tcp.c',
152
+ 'src/win/timer.c',
153
+ 'src/win/util.c',
154
+ 'src/win/winapi.c',
155
+ ]
156
+ }, { # Not Windows i.e. POSIX
157
+ 'cflags': [
158
+ '-g',
159
+ '--std=gnu89',
160
+ '-pedantic',
161
+ '-Wall',
162
+ '-Wextra',
163
+ '-Wno-unused-parameter'
164
+ ],
165
+ 'sources': [
166
+ 'include/eio.h',
167
+ 'include/ev.h',
168
+ 'include/ngx-queue.h',
169
+ 'include/uv-unix.h',
170
+ 'src/uv-eio.c',
171
+ 'src/uv-eio.h',
172
+ 'src/uv-unix.c',
173
+ 'src/ares/config_cygwin/ares_config.h',
174
+ 'src/ares/config_darwin/ares_config.h',
175
+ 'src/ares/config_freebsd/ares_config.h',
176
+ 'src/ares/config_linux/ares_config.h',
177
+ 'src/ares/config_openbsd/ares_config.h',
178
+ 'src/ares/config_sunos/ares_config.h',
179
+ 'src/eio/config_cygwin.h',
180
+ 'src/eio/config_darwin.h',
181
+ 'src/eio/config_freebsd.h',
182
+ 'src/eio/config_linux.h',
183
+ 'src/eio/config_sunos.h',
184
+ 'src/eio/ecb.h',
185
+ 'src/eio/eio.c',
186
+ 'src/eio/xthread.h',
187
+ 'src/ev/config_cygwin.h',
188
+ 'src/ev/config_darwin.h',
189
+ 'src/ev/config_freebsd.h',
190
+ 'src/ev/config_linux.h',
191
+ 'src/ev/config_sunos.h',
192
+ 'src/ev/ev.c',
193
+ 'src/ev/ev_vars.h',
194
+ 'src/ev/ev_wrap.h',
195
+ 'src/ev/event.h',
196
+ ],
197
+ 'include_dirs': [
198
+ 'src/ev'
199
+ ],
200
+ 'defines': [
201
+ '_LARGEFILE_SOURCE',
202
+ '_FILE_OFFSET_BITS=64',
203
+ '_GNU_SOURCE',
204
+ 'EIO_STACKSIZE=262144'
205
+ ],
206
+ 'libraries': [ '-lm' ]
207
+ }],
208
+ [ 'OS=="mac"', {
209
+ 'include_dirs': [ 'src/ares/config_darwin' ],
210
+ 'sources': [ 'src/uv-darwin.c' ],
211
+ 'direct_dependent_settings': {
212
+ 'libraries': [ '-framework CoreServices' ],
213
+ },
214
+ 'defines': [
215
+ 'EV_CONFIG_H="config_darwin.h"',
216
+ 'EIO_CONFIG_H="config_darwin.h"',
217
+ ]
218
+ }],
219
+ [ 'OS=="linux"', {
220
+ 'include_dirs': [ 'src/ares/config_linux' ],
221
+ 'sources': [ 'src/uv-linux.c' ],
222
+ 'defines': [
223
+ 'EV_CONFIG_H="config_linux.h"',
224
+ 'EIO_CONFIG_H="config_linux.h"',
225
+ ],
226
+ 'direct_dependent_settings': {
227
+ 'libraries': [ '-lrt' ],
228
+ },
229
+ }],
230
+ # TODO add OS=='sun'
231
+ ]
232
+ },
233
+
234
+ {
235
+ 'target_name': 'run-tests',
236
+ 'type': 'executable',
237
+ 'dependencies': [ 'uv' ],
238
+ 'sources': [
239
+ 'test/echo-server.c',
240
+ 'test/run-tests.c',
241
+ 'test/runner.c',
242
+ 'test/runner.h',
243
+ 'test/task.h',
244
+ 'test/test-async.c',
245
+ 'test/test-callback-stack.c',
246
+ 'test/test-connection-fail.c',
247
+ 'test/test-delayed-accept.c',
248
+ 'test/test-fail-always.c',
249
+ 'test/test-get-currentexe.c',
250
+ 'test/test-getaddrinfo.c',
251
+ 'test/test-gethostbyname.c',
252
+ 'test/test-getsockname.c',
253
+ 'test/test-hrtime.c',
254
+ 'test/test-idle.c',
255
+ 'test/test-list.h',
256
+ 'test/test-loop-handles.c',
257
+ 'test/test-pass-always.c',
258
+ 'test/test-ping-pong.c',
259
+ 'test/test-pipe-bind-error.c',
260
+ 'test/test-ref.c',
261
+ 'test/test-shutdown-eof.c',
262
+ 'test/test-spawn.c',
263
+ 'test/test-tcp-bind-error.c',
264
+ 'test/test-tcp-bind6-error.c',
265
+ 'test/test-tcp-writealot.c',
266
+ 'test/test-timer-again.c',
267
+ 'test/test-timer.c',
268
+ ],
269
+ 'conditions': [
270
+ [ 'OS=="win"', {
271
+ 'sources': [
272
+ 'test/runner-win.c',
273
+ 'test/runner-win.h'
274
+ ],
275
+ 'libraries': [ 'ws2_32.lib' ]
276
+ }, { # POSIX
277
+ 'defines': [ '_GNU_SOURCE' ],
278
+ 'ldflags': [ '-pthread' ],
279
+ 'sources': [
280
+ 'test/runner-unix.c',
281
+ 'test/runner-unix.h',
282
+ ]
283
+ }]
284
+ ]
285
+ },
286
+
287
+ {
288
+ 'target_name': 'run-benchmarks',
289
+ 'type': 'executable',
290
+ 'dependencies': [ 'uv' ],
291
+ 'sources': [
292
+ 'test/benchmark-ares.c',
293
+ 'test/benchmark-getaddrinfo.c',
294
+ 'test/benchmark-list.h',
295
+ 'test/benchmark-ping-pongs.c',
296
+ 'test/benchmark-pound.c',
297
+ 'test/benchmark-pump.c',
298
+ 'test/benchmark-sizes.c',
299
+ 'test/benchmark-spawn.c',
300
+ 'test/dns-server.c',
301
+ 'test/echo-server.c',
302
+ 'test/run-benchmarks.c',
303
+ 'test/runner.c',
304
+ 'test/runner.h',
305
+ 'test/task.h',
306
+ ],
307
+ 'conditions': [
308
+ [ 'OS=="win"', {
309
+ 'sources': [
310
+ 'test/runner-win.c',
311
+ 'test/runner-win.h',
312
+ ],
313
+ 'libraries': [ 'ws2_32.lib' ]
314
+ }, { # POSIX
315
+ 'defines': [ '_GNU_SOURCE' ],
316
+ 'ldflags': [ '-pthread' ],
317
+ 'sources': [
318
+ 'test/runner-unix.c',
319
+ 'test/runner-unix.h',
320
+ ]
321
+ }]
322
+ ]
323
+ }
324
+ ]
325
+ }
326
+
@@ -46,7 +46,6 @@ src/uv-common.o: src/uv-common.c include/uv.h include/uv-win.h
46
46
  $(CC) $(CFLAGS) -c src/uv-common.c -o src/uv-common.o
47
47
 
48
48
  EIO_CPPFLAGS += $(CPPFLAGS)
49
- EIO_CPPFLAGS += -DEIO_CONFIG_H=\"$(EIO_CONFIG)\"
50
49
  EIO_CPPFLAGS += -DEIO_STACKSIZE=65536
51
50
  EIO_CPPFLAGS += -D_GNU_SOURCE
52
51
 
@@ -74,8 +74,14 @@ endif
74
74
 
75
75
  # Need _GNU_SOURCE for strdup?
76
76
  RUNNER_CFLAGS=$(CFLAGS) -D_GNU_SOURCE
77
+ RUNNER_LINKFLAGS=$(LINKFLAGS)
78
+
79
+ ifeq (SunOS,$(uname_S))
80
+ RUNNER_LINKFLAGS += -pthreads
81
+ else
82
+ RUNNER_LINKFLAGS += -pthread
83
+ endif
77
84
 
78
- RUNNER_LINKFLAGS=$(LINKFLAGS) -pthread
79
85
  RUNNER_LIBS=
80
86
  RUNNER_SRC=test/runner-unix.c
81
87
 
@@ -1,14 +1,21 @@
1
- @REM Hello World
1
+ @echo off
2
2
 
3
3
  cd %~dp0
4
4
 
5
- IF EXIST %~dp0build\gyp GOTO WINDIR
6
-
5
+ if exist build\gyp goto have_gyp
7
6
 
7
+ echo svn co http://gyp.googlecode.com/svn/trunk@983 build/gyp
8
8
  svn co http://gyp.googlecode.com/svn/trunk@983 build/gyp
9
+ if errorlevel 1 goto gyp_install_failed
10
+ goto have_gyp
9
11
 
10
- :WINDIR
11
-
12
- @python build\gyp_uv
12
+ :gyp_install_failed
13
+ echo Failed to download gyp. Make sure you have subversion installed, or
14
+ echo manually install gyp into %~dp0build\gyp.
15
+ goto exit
13
16
 
17
+ :have_gyp
18
+ python gyp_uv
19
+ if not errorlevel 1 echo Done.
14
20
 
21
+ :exit
@@ -5,8 +5,7 @@ import shlex
5
5
  import sys
6
6
 
7
7
  script_dir = os.path.dirname(__file__)
8
- uv_root = os.path.normpath(os.path.join(script_dir, os.pardir))
9
- print("uv_root " + uv_root)
8
+ uv_root = os.path.abspath(script_dir)
10
9
 
11
10
  sys.path.insert(0, os.path.join(uv_root, 'build', 'gyp', 'pylib'))
12
11
  import gyp
@@ -122,6 +122,7 @@ typedef enum {
122
122
  UV_ENOTCONN,
123
123
  UV_ENOTSOCK,
124
124
  UV_ENOTSUP,
125
+ UV_EPIPE,
125
126
  UV_EPROTO,
126
127
  UV_EPROTONOSUPPORT,
127
128
  UV_EPROTOTYPE,
@@ -228,6 +229,10 @@ int uv_is_active(uv_handle_t* handle);
228
229
  /*
229
230
  * Request handle to be closed. close_cb will be called asynchronously after
230
231
  * this call. This MUST be called on each handle before memory is released.
232
+ *
233
+ * Note that handles that wrap file descriptors are closed immediately but
234
+ * close_cb will still be deferred to the next iteration of the event loop.
235
+ * It gives you a chance to free up any resources associated with the handle.
231
236
  */
232
237
  void uv_close(uv_handle_t* handle, uv_close_cb close_cb);
233
238
 
@@ -7,6 +7,9 @@
7
7
  /* fdatasync(2) is available */
8
8
  #define HAVE_FDATASYNC 1
9
9
 
10
+ /* utimes(2) is available */
11
+ #define HAVE_UTIMES 1
12
+
10
13
  /* futimes(2) is available */
11
14
  #define HAVE_FUTIMES 1
12
15
 
@@ -7,6 +7,9 @@
7
7
  /* fdatasync(2) is available */
8
8
  /* #undef HAVE_FDATASYNC */
9
9
 
10
+ /* utimes(2) is available */
11
+ #define HAVE_UTIMES 1
12
+
10
13
  /* futimes(2) is available */
11
14
  #define HAVE_FUTIMES 1
12
15
 
@@ -7,6 +7,9 @@
7
7
  /* fdatasync(2) is available */
8
8
  #define HAVE_FDATASYNC 1
9
9
 
10
+ /* utimes(2) is available */
11
+ #define HAVE_UTIMES 1
12
+
10
13
  /* futimes(2) is available */
11
14
  /* #undef HAVE_FUTIMES */
12
15
 
@@ -67,7 +67,7 @@
67
67
 
68
68
  #ifndef ECB_MEMORY_FENCE
69
69
  #if ECB_GCC_VERSION(2,5)
70
- #if __x86
70
+ #if defined(__x86) || defined(__i386)
71
71
  #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory")
72
72
  #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE /* non-lock xchg might be enough */
73
73
  #define ECB_MEMORY_FENCE_RELEASE do { } while (0) /* unlikely to change in future cpus */
@@ -110,6 +110,8 @@ static void eio_destroy (eio_req *req);
110
110
 
111
111
  #ifdef _WIN32
112
112
 
113
+ #include <direct.h>
114
+
113
115
  #undef PAGESIZE
114
116
  #define PAGESIZE 4096 /* GetSystemInfo? */
115
117
 
@@ -140,6 +142,9 @@ static void eio_destroy (eio_req *req);
140
142
  #define statvfs(path,buf) EIO_ENOSYS ()
141
143
  #define fstatvfs(fd,buf) EIO_ENOSYS ()
142
144
 
145
+ #define getcwd(buf,s) _getcwd(buf, s)
146
+ #define rmdir(path) _rmdir(path)
147
+
143
148
  /* rename() uses MoveFile, which fails to overwrite */
144
149
  #define rename(old,neu) eio__rename (old, neu)
145
150
 
@@ -187,7 +192,9 @@ static void eio_destroy (eio_req *req);
187
192
  }
188
193
 
189
194
  /* POSIX API only */
190
- #define CreateHardLink(neu,old,flags) 0
195
+ #ifndef CreateHardLink
196
+ # define CreateHardLink(neu,old,flags) 0
197
+ #endif
191
198
  #define CreateSymbolicLink(neu,old,flags) 0
192
199
 
193
200
  struct statvfs
@@ -76,6 +76,7 @@ const char* uv_err_name(uv_err_t err) {
76
76
  case UV_ENOTCONN: return "ENOTCONN";
77
77
  case UV_ENOTSOCK: return "ENOTSOCK";
78
78
  case UV_ENOTSUP: return "ENOTSUP";
79
+ case UV_EPIPE: return "EPIPE";
79
80
  case UV_EPROTO: return "EPROTO";
80
81
  case UV_EPROTONOSUPPORT: return "EPROTONOSUPPORT";
81
82
  case UV_EPROTOTYPE: return "EPROTOTYPE";
@@ -37,7 +37,7 @@ uint64_t uv_hrtime() {
37
37
  * we don't want to potentially create a race condition in the use of snprintf.
38
38
  */
39
39
  int uv_exepath(char* buffer, size_t* size) {
40
- size_t res;
40
+ ssize_t res;
41
41
  pid_t pid;
42
42
  char buf[128];
43
43