hiredis-client 0.19.0 → 0.20.0
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 +4 -4
- data/ext/redis_client/hiredis/hiredis_connection.c +43 -9
- data/hiredis-client.gemspec +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41d0ae1321b4fb22b38c20af34e1e2f67d188ee6fb0afab5322ce39b8ed68ff0
|
4
|
+
data.tar.gz: d9c9f964c7e2b06cc709e02f1114e81ade65db7faf9c881552bdc43c32c4715d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26f784d95050d5fd3995082794dd831647d6d5195b2ddde2eff53a347d333ab85f3f39af50015a7ea31d1333de831712f3ef0d4f199c2ce3457c586709ffa6e5
|
7
|
+
data.tar.gz: 73b33d2c21c79c262a96d73cbf4e66e5afbd670f3767cf1d2293f7ddb03d522af244d3620b8700957d0bf3c80debcc720e1e5d957fb2ebd10f37666ebdbdc170
|
@@ -155,6 +155,7 @@ static void *reply_append(const redisReadTask *task, VALUE value) {
|
|
155
155
|
if (task->idx % 2) {
|
156
156
|
VALUE key = rb_ary_pop(state->stack);
|
157
157
|
rb_hash_aset(parent, key, value);
|
158
|
+
RB_GC_GUARD(key);
|
158
159
|
} else {
|
159
160
|
rb_ary_push(state->stack, value);
|
160
161
|
}
|
@@ -163,8 +164,10 @@ static void *reply_append(const redisReadTask *task, VALUE value) {
|
|
163
164
|
rb_bug("[hiredis] Unexpected task parent type %d", task->parent->type);
|
164
165
|
break;
|
165
166
|
}
|
167
|
+
RB_GC_GUARD(parent);
|
166
168
|
}
|
167
169
|
rb_ary_store(state->stack, task_index, value);
|
170
|
+
RB_GC_GUARD(value);
|
168
171
|
return (void*)value;
|
169
172
|
}
|
170
173
|
|
@@ -464,6 +467,19 @@ static int hiredis_wait_readable(int fd, const struct timeval *timeout, int *iss
|
|
464
467
|
return 0;
|
465
468
|
}
|
466
469
|
|
470
|
+
struct fd_select {
|
471
|
+
rb_fdset_t *write_fds;
|
472
|
+
struct timeval *timeout;
|
473
|
+
int max;
|
474
|
+
int return_value;
|
475
|
+
};
|
476
|
+
|
477
|
+
static VALUE protected_writable_select(VALUE _args) {
|
478
|
+
struct fd_select *args = (struct fd_select *)_args;
|
479
|
+
args->return_value = rb_thread_fd_select(args->max, NULL, args->write_fds, NULL, args->timeout);
|
480
|
+
return Qnil;
|
481
|
+
}
|
482
|
+
|
467
483
|
static int hiredis_wait_writable(int fd, const struct timeval *timeout, int *isset) {
|
468
484
|
struct timeval to;
|
469
485
|
struct timeval *toptr = NULL;
|
@@ -480,7 +496,18 @@ static int hiredis_wait_writable(int fd, const struct timeval *timeout, int *iss
|
|
480
496
|
toptr = &to;
|
481
497
|
}
|
482
498
|
|
483
|
-
|
499
|
+
struct fd_select args = {
|
500
|
+
.max = fd + 1,
|
501
|
+
.write_fds = &fds,
|
502
|
+
.timeout = toptr,
|
503
|
+
};
|
504
|
+
int status;
|
505
|
+
|
506
|
+
(void)rb_protect(protected_writable_select, (VALUE)&args, &status);
|
507
|
+
|
508
|
+
// Error in case an exception arrives in rb_thread_fd_select()
|
509
|
+
// (e.g. from Thread.raise)
|
510
|
+
if (status || args.return_value < 0) {
|
484
511
|
rb_fd_term(&fds);
|
485
512
|
return -1;
|
486
513
|
}
|
@@ -498,7 +525,6 @@ static VALUE hiredis_connect_finish(hiredis_connection_t *connection, redisConte
|
|
498
525
|
redisFree(context);
|
499
526
|
rb_raise(rb_eRuntimeError, "HiredisConnection is already connected, must be a bug");
|
500
527
|
}
|
501
|
-
connection->context = context;
|
502
528
|
|
503
529
|
if (context->err) {
|
504
530
|
redis_raise_error_and_disconnect(context, rb_eRedisClientCannotConnectError);
|
@@ -533,6 +559,7 @@ static VALUE hiredis_connect_finish(hiredis_connection_t *connection, redisConte
|
|
533
559
|
|
534
560
|
context->reader->fn = &reply_functions;
|
535
561
|
redisSetPushCallback(context, NULL);
|
562
|
+
connection->context = context;
|
536
563
|
return Qtrue;
|
537
564
|
}
|
538
565
|
|
@@ -598,9 +625,14 @@ static VALUE hiredis_reconnect(VALUE self, VALUE is_unix, VALUE ssl_param) {
|
|
598
625
|
return Qfalse;
|
599
626
|
}
|
600
627
|
|
601
|
-
|
628
|
+
// Clear context on the connection, since the nogvl call can raise an
|
629
|
+
// exception after the redisReconnect() call succeeds and leave the
|
630
|
+
// connection in a half-initialized state.
|
631
|
+
redisContext *context = connection->context;
|
632
|
+
connection->context = NULL;
|
633
|
+
hiredis_reconnect_nogvl(context);
|
602
634
|
|
603
|
-
VALUE success = hiredis_connect_finish(connection,
|
635
|
+
VALUE success = hiredis_connect_finish(connection, context);
|
604
636
|
|
605
637
|
if (RTEST(success)) {
|
606
638
|
if (!RTEST(is_unix)) {
|
@@ -693,8 +725,9 @@ static int hiredis_read_internal(hiredis_connection_t *connection, VALUE *reply)
|
|
693
725
|
// We use that to avoid having to have a `mark` function with write barriers.
|
694
726
|
// Not that it would be too hard, but if we mark the response objects, we'll likely end up
|
695
727
|
// promoting them to the old generation which isn't desirable.
|
728
|
+
VALUE stack = rb_ary_new();
|
696
729
|
hiredis_reader_state_t reader_state = {
|
697
|
-
.stack =
|
730
|
+
.stack = stack,
|
698
731
|
.task_index = &connection->context->reader->ridx,
|
699
732
|
};
|
700
733
|
connection->context->reader->privdata = &reader_state;
|
@@ -759,10 +792,10 @@ static int hiredis_read_internal(hiredis_connection_t *connection, VALUE *reply)
|
|
759
792
|
|
760
793
|
/* Set reply object */
|
761
794
|
if (reply != NULL) {
|
762
|
-
*reply = (
|
795
|
+
*reply = rb_ary_entry(stack, 0);
|
763
796
|
}
|
764
797
|
|
765
|
-
RB_GC_GUARD(
|
798
|
+
RB_GC_GUARD(stack);
|
766
799
|
|
767
800
|
return 0;
|
768
801
|
}
|
@@ -789,6 +822,7 @@ static VALUE hiredis_read(VALUE self) {
|
|
789
822
|
// See reply_create_bool
|
790
823
|
reply = Qfalse;
|
791
824
|
}
|
825
|
+
RB_GC_GUARD(self);
|
792
826
|
return reply;
|
793
827
|
}
|
794
828
|
|
@@ -806,7 +840,7 @@ static inline double diff_timespec_ms(const struct timespec *time1, const struct
|
|
806
840
|
}
|
807
841
|
|
808
842
|
static inline int timeval_to_msec(struct timeval duration) {
|
809
|
-
return duration.tv_sec * 1000 + duration.tv_usec / 1000;
|
843
|
+
return (int)(duration.tv_sec * 1000 + duration.tv_usec / 1000);
|
810
844
|
}
|
811
845
|
|
812
846
|
typedef struct {
|
@@ -895,8 +929,8 @@ RUBY_FUNC_EXPORTED void Init_hiredis_connection(void) {
|
|
895
929
|
redisInitOpenSSL();
|
896
930
|
|
897
931
|
id_parse = rb_intern("parse");
|
898
|
-
Redis_Qfalse = rb_obj_alloc(rb_cObject);
|
899
932
|
rb_global_variable(&Redis_Qfalse);
|
933
|
+
Redis_Qfalse = rb_obj_alloc(rb_cObject);
|
900
934
|
|
901
935
|
VALUE rb_cRedisClient = rb_const_get(rb_cObject, rb_intern("RedisClient"));
|
902
936
|
|
data/hiredis-client.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
11
11
|
spec.summary = "Hiredis binding for redis-client"
|
12
12
|
spec.homepage = "https://github.com/redis-rb/redis-client"
|
13
13
|
spec.license = "MIT"
|
14
|
-
spec.required_ruby_version = ">= 2.
|
14
|
+
spec.required_ruby_version = ">= 2.6.0"
|
15
15
|
|
16
16
|
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
17
17
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hiredis-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.20.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean Boussier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis-client
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.20.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.20.0
|
27
27
|
description:
|
28
28
|
email:
|
29
29
|
- jean.boussier@gmail.com
|
@@ -98,14 +98,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
98
98
|
requirements:
|
99
99
|
- - ">="
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: 2.
|
101
|
+
version: 2.6.0
|
102
102
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
103
|
requirements:
|
104
104
|
- - ">="
|
105
105
|
- !ruby/object:Gem::Version
|
106
106
|
version: '0'
|
107
107
|
requirements: []
|
108
|
-
rubygems_version: 3.
|
108
|
+
rubygems_version: 3.5.5
|
109
109
|
signing_key:
|
110
110
|
specification_version: 4
|
111
111
|
summary: Hiredis binding for redis-client
|