hiredis-client 0.19.0 → 0.19.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3aa2f8ffa2883aebac37552a2e128a13bf36e79aa9da6ba9be3cc00369230583
4
- data.tar.gz: d786c010f218c5866db63a5e176438d3aee9d7539d443db034aa2b2f788f67f4
3
+ metadata.gz: 6fca3cf8fc6ec3d278b045025946060403d0ab94f8222a114364afad034ca94b
4
+ data.tar.gz: aa46473c0bbe84c4b279cb9bbab14246b39a74578d55932b602ccca15c79eb51
5
5
  SHA512:
6
- metadata.gz: 230789e6acf2e3bd62c0050b1d13f58546811be59364cb7fe0281d5f7c05970f111eae67665361f23a403ba60931aad33bda5ddaaaca823a02724b13cca0adbb
7
- data.tar.gz: 5e336e18352fc4698794f7885576256027f6d3deb45df3a88fe3533359a7fc6a0ad66fa7616c617ee462831f0f6696e018df9b477f49beca0574734be13adb4a
6
+ metadata.gz: 9944f993c9c111c504a66e5a2a976e3480ed10943732410bf68e6142a0c0b0c01c545133f4e021e08c0c8205113b41170bd1ee3da937ae198ef0c9ab768c6a1b
7
+ data.tar.gz: efa20c614f0224f8ea72fbe5bee26a9a260a12b8ee0b4dac4f9a0bd6a2c1e9146e0dbb273419f24c1abc2cf141d0d8272d021e64d55a62db21ac5b7068b45b26
@@ -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
- if (rb_thread_fd_select(fd + 1, NULL, &fds, NULL, toptr) < 0) {
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
- hiredis_reconnect_nogvl(connection->context);
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, connection->context);
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 = rb_ary_new(),
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 = (VALUE)redis_reply;
795
+ *reply = rb_ary_entry(stack, 0);
763
796
  }
764
797
 
765
- RB_GC_GUARD(reader_state.stack);
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
 
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.19.0
4
+ version: 0.19.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-07 00:00:00.000000000 Z
11
+ date: 2023-12-21 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.0
19
+ version: 0.19.1
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.19.0
26
+ version: 0.19.1
27
27
  description:
28
28
  email:
29
29
  - jean.boussier@gmail.com