surro-gate 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/ext/surro-gate/selector_ext.c +19 -4
- data/ext/surro-gate/selector_ext.h +10 -0
- data/lib/surro-gate/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 90e1123d3d92d4d2aa63a242e70b1cb892841f55
|
4
|
+
data.tar.gz: f49f4c35d280a89d1baf88b1bcca0ad4289d3320
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69ab774b8c3c9de0839cfaf00d63b0ba73e614ba058cee91f0bb6460726f32f2fc92261b3e3591b8662f3ae3735221eeca2adffca246a37e937c9850afd6003a
|
7
|
+
data.tar.gz: 6d4009bcaa479bd414a0dcf039e3a32d11f2a913041f560b8fc33c2486ef6f4ef76ffc4c8e25e17ab5b0d576be71e1a12998000273756682b30040886e675098
|
@@ -22,6 +22,13 @@ void epoll_rearm(int *epoll, int socket, int ltr, int rtl, int events) {
|
|
22
22
|
epoll_ctl(*epoll, EPOLL_CTL_MOD, socket, &ev);
|
23
23
|
}
|
24
24
|
|
25
|
+
void* wait_func(void *ptr) {
|
26
|
+
struct epoll_wait_args *args;
|
27
|
+
args = (struct epoll_wait_args*) ptr;
|
28
|
+
args->result = epoll_wait(args->epfd, args->events, args->maxevents, args->timeout);
|
29
|
+
return NULL;
|
30
|
+
}
|
31
|
+
|
25
32
|
static VALUE pairing_compare(VALUE pair, VALUE sockets) {
|
26
33
|
int i;
|
27
34
|
VALUE left = rb_iv_get(pair, "@left");
|
@@ -139,16 +146,24 @@ static VALUE SurroGate_Selector_pop(VALUE self, VALUE sockets) {
|
|
139
146
|
}
|
140
147
|
|
141
148
|
static VALUE SurroGate_Selector_select(VALUE self, VALUE timeout) {
|
142
|
-
int i,
|
149
|
+
int i, *selector, source, target;
|
143
150
|
struct epoll_event events[256];
|
151
|
+
struct epoll_wait_args wait_args;
|
144
152
|
VALUE read, write, socket;
|
145
153
|
|
146
154
|
VALUE pairing = rb_iv_get(self, "@pairing");
|
147
155
|
Data_Get_Struct(self, int, selector);
|
148
156
|
|
149
|
-
|
157
|
+
// The code after the comments has the same result as the code below, but with GVL
|
158
|
+
// args.result = epoll_wait(*selector, events, 256, NUM2INT(timeout));
|
159
|
+
wait_args.epfd = *selector;
|
160
|
+
wait_args.events = events;
|
161
|
+
wait_args.maxevents = 256;
|
162
|
+
wait_args.timeout = NUM2INT(timeout);
|
163
|
+
wait_args.result = 0;
|
164
|
+
rb_thread_call_without_gvl(wait_func, &wait_args, NULL, NULL);
|
150
165
|
|
151
|
-
for (i=0; i<
|
166
|
+
for (i=0; i<wait_args.result; i++) {
|
152
167
|
source = (int)((events[i].data.u64 & 0xFFFFFFFF00000000LL) >> 32);
|
153
168
|
target = (int)(events[i].data.u64 & 0xFFFFFFFFLL);
|
154
169
|
|
@@ -176,7 +191,7 @@ static VALUE SurroGate_Selector_select(VALUE self, VALUE timeout) {
|
|
176
191
|
}
|
177
192
|
}
|
178
193
|
|
179
|
-
return INT2NUM(
|
194
|
+
return INT2NUM(wait_args.result);
|
180
195
|
}
|
181
196
|
|
182
197
|
static VALUE SurroGate_Selector_each_ready(VALUE self) {
|
@@ -3,12 +3,22 @@
|
|
3
3
|
|
4
4
|
#include "ruby.h"
|
5
5
|
#include "ruby/io.h"
|
6
|
+
#include "ruby/thread.h"
|
6
7
|
#include "stdlib.h"
|
7
8
|
#include "sys/epoll.h"
|
8
9
|
|
9
10
|
#define SOCK_PTR(X) RFILE(X)->fptr->fd
|
10
11
|
#define IVAR_TRUE(X, Y) rb_iv_get(X, Y) == Qtrue
|
11
12
|
|
13
|
+
struct epoll_wait_args {
|
14
|
+
unsigned int epfd;
|
15
|
+
struct epoll_event *events;
|
16
|
+
int maxevents;
|
17
|
+
int timeout;
|
18
|
+
|
19
|
+
int result;
|
20
|
+
};
|
21
|
+
|
12
22
|
static VALUE SurroGate_Selector_allocate(VALUE self);
|
13
23
|
static VALUE SurroGate_Selector_initialize(VALUE self, VALUE logger);
|
14
24
|
static VALUE SurroGate_Selector_push(VALUE self, VALUE left, VALUE right);
|
data/lib/surro-gate/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: surro-gate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dávid Halász
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -129,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
129
|
version: '0'
|
130
130
|
requirements: []
|
131
131
|
rubyforge_project:
|
132
|
-
rubygems_version: 2.
|
132
|
+
rubygems_version: 2.6.14.1
|
133
133
|
signing_key:
|
134
134
|
specification_version: 4
|
135
135
|
summary: A generic purrpose TCP-to-TCP proxy in Ruby
|