rbuv 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 308a6259f4457d5dd3ccd17dfd092940a75359ca
4
- data.tar.gz: b8f8ef7b0a3aca6e69539fe09d047fc865f46614
3
+ metadata.gz: 1a1dfffa85f5a82907b4f1f80843450aecd5f8a4
4
+ data.tar.gz: 3ee4a61701cbc7cfbdc7f111ba42f5ca7856ad07
5
5
  SHA512:
6
- metadata.gz: d9d906a50927d5e8c81439cce4f73a800e2e86812050dcfb91dda274a4ba4ef78bb69e06fc301f3fdfb66dbb63580d41d4b86a1e2be25cd1e09295e815132fde
7
- data.tar.gz: 1b784c9a54821db879f02335f17067d59d90176c5618bb0e571c8cd2591f51043fbc05f0184db052e0f1c323b65be16783ee50acbf580c8931b8ceaa01d172da
6
+ metadata.gz: cca669ba3307ed5adb8b863e97a2933fe4d0adcc919b6546e5053e0ab2865b207f48fdbbc05ae75d5c2fa7caff24acba9adfdb440b62418097a3e423641c9f81
7
+ data.tar.gz: 791a1ebff000cbe65ebde2066ad334088f6c2401251c3de5dad9a8b13a2503bc5e8bb03583fa99320d9e4f9c483c68180d4741c5dc4f28776d9f8ade94672604
@@ -0,0 +1,18 @@
1
+ lib = File.expand_path('../../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'rbuv'
4
+
5
+ puts "Rbuv version #{Rbuv::VERSION}"
6
+
7
+ Rbuv.run do
8
+ client = Rbuv::Tcp.new
9
+ client.connect "127.0.0.1", 1234 do
10
+ client.read_start do |data, error|
11
+ puts data unless error
12
+ client.close
13
+ end
14
+ client.write "Hello, world"
15
+ end
16
+ end
17
+
18
+ puts "Stopped!"
@@ -0,0 +1,35 @@
1
+ lib = File.expand_path('../../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'rbuv'
4
+
5
+ puts "Rbuv version #{Rbuv::VERSION}"
6
+
7
+ clients = []
8
+
9
+ Rbuv.run do
10
+ signal = Rbuv::Signal.new
11
+ server = Rbuv::Tcp.new
12
+
13
+ signal.start Rbuv::Signal::INT do
14
+ clients.each(&:close)
15
+ signal.close
16
+ server.close
17
+ end
18
+
19
+ server.bind "127.0.0.1", 1234
20
+ server.listen 10 do
21
+ client = Rbuv::Tcp.new
22
+ server.accept client
23
+ clients << client
24
+ client.read_start do |data, error|
25
+ if error
26
+ client.close
27
+ clients.delete client
28
+ else
29
+ client.write data
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ puts "Stopped!"
@@ -40,6 +40,7 @@ static VALUE rbuv_stream_write(VALUE self, VALUE data);
40
40
  /* Private methods */
41
41
  static void _uv_stream_on_connection(uv_stream_t *server, int status);
42
42
  static void _uv_stream_on_connection_no_gvl(_uv_stream_on_connection_arg_t *arg);
43
+ void __uv_stream_on_connection_no_gvl(uv_stream_t *stream, int status);
43
44
  static uv_buf_t _uv_alloc_buffer(uv_handle_t *handle, size_t suggested_size);
44
45
  static void _uv_stream_on_read(uv_stream_t *stream, ssize_t nread, uv_buf_t buf);
45
46
  static void _uv_stream_on_read_no_gvl(_uv_stream_on_read_arg_t *arg);
@@ -166,33 +167,44 @@ VALUE rbuv_stream_write(VALUE self, VALUE data) {
166
167
  return data;
167
168
  }
168
169
 
169
- void _uv_stream_on_connection(uv_stream_t *uv_server, int status) {
170
- _uv_stream_on_connection_arg_t arg = { .uv_stream = uv_server, .status = status };
170
+ void _uv_stream_on_connection(uv_stream_t *uv_stream, int status) {
171
+ _uv_stream_on_connection_arg_t arg = { .uv_stream = uv_stream, .status = status };
171
172
  rb_thread_call_with_gvl((rbuv_rb_blocking_function_t)_uv_stream_on_connection_no_gvl, &arg);
172
173
  }
173
174
 
174
175
  void _uv_stream_on_connection_no_gvl(_uv_stream_on_connection_arg_t *arg) {
175
- uv_stream_t *uv_server = arg->uv_stream;
176
+ uv_stream_t *uv_stream = arg->uv_stream;
176
177
  int status = arg->status;
177
178
 
178
- VALUE server;
179
- rbuv_stream_t *rbuv_server;
179
+ __uv_stream_on_connection_no_gvl(uv_stream, status);
180
+ }
181
+
182
+ void __uv_stream_on_connection_no_gvl(uv_stream_t *uv_stream, int status) {
183
+ VALUE stream;
184
+ rbuv_stream_t *rbuv_stream;
180
185
  VALUE on_connection;
186
+ VALUE error;
187
+ uv_err_t uv_err;
181
188
 
182
- RBUV_DEBUG_LOG("uv_server: %p, status: %d", uv_server, status);
183
- if (status == -1) {
184
- return;
185
- }
189
+ RBUV_DEBUG_LOG("uv_stream: %p, status: %d", uv_stream, status);
186
190
 
187
- server = (VALUE)uv_server->data;
188
- Data_Get_Struct(server, rbuv_stream_t, rbuv_server);
189
- on_connection = rbuv_server->cb_on_connection;
191
+ stream = (VALUE)uv_stream->data;
192
+ Data_Get_Struct(stream, rbuv_stream_t, rbuv_stream);
193
+ on_connection = rbuv_stream->cb_on_connection;
190
194
 
191
- RBUV_DEBUG_LOG_DETAIL("server: %s, on_connection: %s",
192
- RSTRING_PTR(rb_inspect(server)),
195
+ RBUV_DEBUG_LOG_DETAIL("stream: %s, on_connection: %s",
196
+ RSTRING_PTR(rb_inspect(stream)),
193
197
  RSTRING_PTR(rb_inspect(on_connection)));
194
198
 
195
- rb_funcall(on_connection, id_call, 1, server);
199
+ if (status == -1) {
200
+ uv_err = uv_last_error(uv_default_loop());
201
+ RBUV_DEBUG_LOG_DETAIL("uv_stream: %p, status: %d, error: %s", uv_stream, status,
202
+ uv_strerror(uv_err));
203
+ error = rb_exc_new2(eRbuvError, uv_strerror(uv_err));
204
+ rb_funcall(on_connection, id_call, 2, stream, error);
205
+ } else {
206
+ rb_funcall(on_connection, id_call, 1, stream);
207
+ }
196
208
  }
197
209
 
198
210
  uv_buf_t _uv_alloc_buffer(uv_handle_t *handle, size_t suggested_size) {
@@ -215,7 +227,7 @@ void _uv_stream_on_read_no_gvl(_uv_stream_on_read_arg_t *arg) {
215
227
  uv_err_t uv_err;
216
228
  VALUE error;
217
229
 
218
- RBUV_DEBUG_LOG("uv_stream: %p, nread: %s", uv_stream, RSTRING_PTR(rb_inspect(nread)));
230
+ RBUV_DEBUG_LOG("uv_stream: %p, nread: %lu", uv_stream, nread);
219
231
 
220
232
  stream = (VALUE)uv_stream->data;
221
233
  Data_Get_Struct(stream, rbuv_stream_t, rbuv_stream);
@@ -7,6 +7,11 @@ struct rbuv_tcp_s {
7
7
  VALUE cb_on_read;
8
8
  };
9
9
 
10
+ typedef struct {
11
+ uv_connect_t *uv_connect;
12
+ int status;
13
+ } _uv_tcp_on_connect_arg_t;
14
+
10
15
  VALUE cRbuvTcp;
11
16
 
12
17
  /* Allocator/deallocator */
@@ -30,6 +35,13 @@ static void rbuv_tcp_free(rbuv_tcp_t *rbuv_tcp);
30
35
  */
31
36
  static VALUE rbuv_tcp_bind(VALUE self, VALUE ip, VALUE port);
32
37
  //static VALUE rbuv_tcp_bind6(VALUE self, VALUE ip, VALUE port);
38
+ static VALUE rbuv_tcp_connect(VALUE self, VALUE ip, VALUE port);
39
+ //static VALUE rbuv_tcp_connect6(VALUE self, VALUE ip, VALUE port);
40
+
41
+ /* Private methods */
42
+ static void _uv_tcp_on_connect(uv_connect_t *uv_connect, int status);
43
+ static void _uv_tcp_on_connect_no_gvl(_uv_tcp_on_connect_arg_t *arg);
44
+ extern void __uv_stream_on_connection_no_gvl(uv_stream_t *uv_stream, int status);
33
45
 
34
46
  void Init_rbuv_tcp() {
35
47
  cRbuvTcp = rb_define_class_under(mRbuv, "Tcp", cRbuvStream);
@@ -37,6 +49,8 @@ void Init_rbuv_tcp() {
37
49
 
38
50
  rb_define_method(cRbuvTcp, "bind", rbuv_tcp_bind, 2);
39
51
  //rb_define_method(cRbuvTcp, "bind6", rbuv_tcp_bind6, 2);
52
+ rb_define_method(cRbuvTcp, "connect", rbuv_tcp_connect, 2);
53
+ //rb_define_method(cRbuvTcp, "connect6", rbuv_tcp_connect6, 2);
40
54
  }
41
55
 
42
56
  VALUE rbuv_tcp_alloc(VALUE klass) {
@@ -100,3 +114,44 @@ VALUE rbuv_tcp_bind(VALUE self, VALUE ip, VALUE port) {
100
114
 
101
115
  return self;
102
116
  }
117
+
118
+ VALUE rbuv_tcp_connect(VALUE self, VALUE ip, VALUE port) {
119
+ VALUE block;
120
+ const char *uv_ip;
121
+ int uv_port;
122
+ rbuv_tcp_t *rbuv_tcp;
123
+ struct sockaddr_in connect_addr;
124
+ uv_connect_t uv_connect;
125
+
126
+ rb_need_block();
127
+ block = rb_block_proc();
128
+
129
+ uv_ip = RSTRING_PTR(ip);
130
+ uv_port = FIX2INT(port);
131
+
132
+ Data_Get_Struct(self, rbuv_tcp_t, rbuv_tcp);
133
+ rbuv_tcp->cb_on_connection = block;
134
+
135
+ connect_addr = uv_ip4_addr(uv_ip, uv_port);
136
+
137
+ RBUV_CHECK_UV_RETURN(uv_tcp_connect(&uv_connect, rbuv_tcp->uv_handle,
138
+ connect_addr, _uv_tcp_on_connect));
139
+
140
+ RBUV_DEBUG_LOG_DETAIL("self: %s, ip: %s, port: %d, rbuv_tcp: %p, uv_handle: %p",
141
+ RSTRING_PTR(rb_inspect(self)), uv_ip, uv_port, rbuv_tcp,
142
+ rbuv_tcp->uv_handle);
143
+
144
+ return self;
145
+ }
146
+
147
+ void _uv_tcp_on_connect(uv_connect_t *uv_connect, int status) {
148
+ _uv_tcp_on_connect_arg_t arg = { .uv_connect = uv_connect, .status = status };
149
+ rb_thread_call_with_gvl((rbuv_rb_blocking_function_t)_uv_tcp_on_connect_no_gvl, &arg);
150
+ }
151
+
152
+ void _uv_tcp_on_connect_no_gvl(_uv_tcp_on_connect_arg_t *arg) {
153
+ uv_connect_t *uv_connect = arg->uv_connect;
154
+ int status = arg->status;
155
+
156
+ __uv_stream_on_connection_no_gvl(uv_connect->handle, status);
157
+ }
@@ -1,3 +1,3 @@
1
1
  module Rbuv
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -155,6 +155,35 @@ describe Rbuv::Tcp do
155
155
  no_on_close.call
156
156
  end
157
157
  end
158
+ end # context "#close"
159
+
160
+ context "#connect" do
161
+ it "when server does not exist" do
162
+ Rbuv.run do
163
+ c = Rbuv::Tcp.new
164
+ c.connect('127.0.0.1', 60000) do |client, error|
165
+ error.should be_a_kind_of Rbuv::Error
166
+ c.close
167
+ end
168
+ end
169
+ end
170
+
171
+ it "when server exists" do
172
+ s = TCPServer.new '127.0.0.1', 60000
173
+ s.listen 10
174
+
175
+ on_connect = mock
176
+ on_connect.should_receive(:call).once
177
+
178
+ Rbuv.run do
179
+ c = Rbuv::Tcp.new
180
+ c.connect('127.0.0.1', 60000) do
181
+ on_connect.call
182
+ c.close
183
+ s.close
184
+ end
185
+ end
186
+ end
158
187
  end
159
188
 
160
189
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbuv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hanfei Shen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-10 00:00:00.000000000 Z
11
+ date: 2013-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -301,6 +301,8 @@ files:
301
301
  - deps/libuv/test/test-walk-handles.c
302
302
  - deps/libuv/uv.gyp
303
303
  - deps/libuv/vcbuild.bat
304
+ - examples/echo_client_tcp.rb
305
+ - examples/echo_server_tcp.rb
304
306
  - ext/rbuv/extconf.rb
305
307
  - ext/rbuv/libuv.mk
306
308
  - ext/rbuv/rbuv.c