polyphony 0.87 → 0.91

Sign up to get free protection for your applications and to get access to all the features.
@@ -35,6 +35,9 @@
35
35
 
36
36
  #define BACKEND() (rb_ivar_get(rb_thread_current(), ID_ivar_backend))
37
37
 
38
+ // SAFE is used to cast functions used in rb_ensure
39
+ #define SAFE(f) (VALUE (*)(VALUE))(f)
40
+
38
41
  extern VALUE mPolyphony;
39
42
  extern VALUE cPipe;
40
43
  extern VALUE cQueue;
@@ -114,6 +117,10 @@ VALUE Backend_sleep(VALUE self, VALUE duration);
114
117
  VALUE Backend_splice(VALUE self, VALUE src, VALUE dest, VALUE maxlen);
115
118
  VALUE Backend_splice_to_eof(VALUE self, VALUE src, VALUE dest, VALUE chunksize);
116
119
 
120
+ #ifdef POLYPHONY_BACKEND_LIBURING
121
+ VALUE Backend_double_splice_to_eof(VALUE self, VALUE src, VALUE dest);
122
+ #endif
123
+
117
124
  #ifdef POLYPHONY_LINUX
118
125
  VALUE Backend_tee(VALUE self, VALUE src, VALUE dest, VALUE maxlen);
119
126
  #endif
@@ -210,7 +210,7 @@ VALUE Queue_capped_p(VALUE self) {
210
210
  Queue_t *queue;
211
211
  GetQueue(self, queue);
212
212
 
213
- return queue->capacity ? UINT2NUM(queue->capacity) : Qnil;
213
+ return queue->capacity ? INT2FIX(queue->capacity) : Qnil;
214
214
  }
215
215
 
216
216
  VALUE Queue_clear(VALUE self) {
@@ -280,14 +280,14 @@ VALUE Queue_num_waiting(VALUE self) {
280
280
  Queue_t *queue;
281
281
  GetQueue(self, queue);
282
282
 
283
- return INT2NUM(queue->shift_queue.count);
283
+ return INT2FIX(queue->shift_queue.count);
284
284
  }
285
285
 
286
286
  VALUE Queue_size_m(VALUE self) {
287
287
  Queue_t *queue;
288
288
  GetQueue(self, queue);
289
289
 
290
- return INT2NUM(queue->values.count);
290
+ return INT2FIX(queue->values.count);
291
291
  }
292
292
 
293
293
  VALUE Queue_closed_p(VALUE self) {
@@ -6,13 +6,13 @@ VALUE Socket_send(VALUE self, VALUE msg, VALUE flags) {
6
6
 
7
7
  VALUE Socket_write(int argc, VALUE *argv, VALUE self) {
8
8
  VALUE ary = rb_ary_new_from_values(argc, argv);
9
- VALUE result = Backend_sendv(BACKEND(), self, ary, INT2NUM(0));
9
+ VALUE result = Backend_sendv(BACKEND(), self, ary, INT2FIX(0));
10
10
  RB_GC_GUARD(ary);
11
11
  return result;
12
12
  }
13
13
 
14
14
  VALUE Socket_double_chevron(VALUE self, VALUE msg) {
15
- Backend_send(BACKEND(), self, msg, INT2NUM(0));
15
+ Backend_send(BACKEND(), self, msg, INT2FIX(0));
16
16
  return self;
17
17
  }
18
18
 
@@ -83,6 +83,10 @@ class ::IO
83
83
  end
84
84
 
85
85
  if RUBY_PLATFORM =~ /linux/
86
+ def double_splice_to_eof(src, dest)
87
+ Polyphony.backend_double_splice_to_eof(src, dest)
88
+ end
89
+
86
90
  def tee(src, dest, maxlen)
87
91
  Polyphony.backend_tee(src, dest, maxlen)
88
92
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Polyphony
4
- VERSION = '0.87'
4
+ VERSION = '0.91'
5
5
  end
data/test/stress.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  count = ARGV[0] ? ARGV[0].to_i : 100
4
4
  test_name = ARGV[1]
5
5
 
6
- $test_cmd = +'ruby test/run.rb --name test_cross_thread_send_receive'
6
+ $test_cmd = +'ruby test/run.rb --name test_signal_handler_trace'
7
7
  if test_name
8
8
  $test_cmd << " --name #{test_name}"
9
9
  end
data/test/test_io.rb CHANGED
@@ -368,6 +368,31 @@ class IOTest < MiniTest::Test
368
368
  end
369
369
  end
370
370
 
371
+ def test_double_splice_to_eof
372
+ if Thread.current.backend.kind == :io_uring
373
+ skip "IO.double_splice_to_eof available only with io_uring"
374
+ end
375
+
376
+ src = Polyphony.pipe
377
+ dest = Polyphony.pipe
378
+ ret = nil
379
+ data = 'foobar' * 10
380
+
381
+ f1 = spin {
382
+ ret = IO.double_splice_to_eof(src, dest)
383
+ dest.close
384
+ }
385
+
386
+ src << data
387
+ src.close
388
+
389
+ f1.await
390
+
391
+ spliced = dest.read
392
+ assert_equal data, spliced
393
+ assert_equal data.bytesize, ret
394
+ end
395
+
371
396
  def test_tee_from
372
397
  skip "tested only on Linux" unless RUBY_PLATFORM =~ /linux/
373
398
 
@@ -656,19 +681,75 @@ class IOExtensionsTest < MiniTest::Test
656
681
  i, o = IO.pipe
657
682
  r, w = IO.pipe
658
683
 
659
- spin {
660
- IO.deflate(i, w)
684
+ ret = nil
685
+ f = spin {
686
+ ret = IO.deflate(i, w)
661
687
  w.close
662
688
  }
663
689
 
664
690
  o << 'foobar' * 20
665
691
  o.close
666
692
 
693
+ f.await
694
+ assert_equal 17, ret
695
+
667
696
  data = r.read
668
697
  msg = Zlib::Inflate.inflate(data)
669
698
  assert_equal 'foobar' * 20, msg
670
699
  end
671
700
 
701
+ def test_deflate_to_string
702
+ i, o = IO.pipe
703
+ r, w = IO.pipe
704
+ str = +''
705
+
706
+ ret = nil
707
+ f = spin {
708
+ ret = IO.deflate(i, str)
709
+ w << str
710
+ w.close
711
+ }
712
+
713
+ o << 'foobar' * 20
714
+ o.close
715
+
716
+ f.await
717
+ assert_equal 17, ret
718
+
719
+ data = r.read
720
+ msg = Zlib::Inflate.inflate(data)
721
+ assert_equal 'foobar' * 20, msg
722
+ end
723
+
724
+ def test_deflate_to_frozen_string
725
+ i, o = IO.pipe
726
+ str = '' # frozen
727
+
728
+ f = spin {
729
+ o << 'foobar' * 20
730
+ o.close
731
+ }
732
+
733
+ assert_raises(FrozenError) { IO.deflate(i, str) }
734
+ end
735
+
736
+ def test_deflate_from_string
737
+ r, w = IO.pipe
738
+ str = 'foobar' * 10000
739
+ ret = nil
740
+
741
+ f = spin {
742
+ ret = IO.deflate(str, w)
743
+ w.close
744
+ }
745
+ f.await
746
+ assert_equal 118, ret
747
+
748
+ data = r.read
749
+ msg = Zlib::Inflate.inflate(data)
750
+ assert_equal str, msg
751
+ end
752
+
672
753
  def test_inflate
673
754
  i, o = IO.pipe
674
755
  r, w = IO.pipe
@@ -679,7 +760,35 @@ class IOExtensionsTest < MiniTest::Test
679
760
  o.close
680
761
  }
681
762
 
682
- IO.inflate(i, w)
763
+ ret = IO.inflate(i, w)
764
+ assert_equal 6, ret
765
+ w.close
766
+ msg = r.read
767
+ assert_equal 'foobar', msg
768
+ end
769
+
770
+ def test_inflate_to_string
771
+ i, o = IO.pipe
772
+ str = +''
773
+
774
+ spin {
775
+ data = Zlib::Deflate.deflate('foobar', 9)
776
+ o << data
777
+ o.close
778
+ }
779
+
780
+ ret = IO.inflate(i, str)
781
+ assert_equal 6, ret
782
+ assert_equal 6, str.bytesize
783
+ assert_equal 'foobar', str
784
+ end
785
+
786
+ def test_inflate_from_string
787
+ r, w = IO.pipe
788
+ str = Zlib::Deflate.deflate('foobar', 9)
789
+
790
+ ret = IO.inflate(str, w)
791
+ assert_equal 6, ret
683
792
  w.close
684
793
  msg = r.read
685
794
  assert_equal 'foobar', msg
@@ -690,7 +799,7 @@ class IOExtensionsTest < MiniTest::Test
690
799
  dest = Polyphony.pipe
691
800
  now = nil
692
801
 
693
- spin {
802
+ f = spin {
694
803
  now = Time.now
695
804
  IO.gzip(src, dest)
696
805
  dest.close
@@ -698,6 +807,32 @@ class IOExtensionsTest < MiniTest::Test
698
807
 
699
808
  src << IO.read(__FILE__)
700
809
  src.close
810
+ f.await
811
+
812
+ gz = Zlib::GzipReader.new(dest)
813
+ data = gz.read
814
+ assert_equal IO.read(__FILE__), data
815
+ assert_in_range (now-2)..(now+1), gz.mtime
816
+ assert_nil gz.orig_name
817
+ assert_nil gz.comment
818
+ end
819
+
820
+ def test_gzip_to_string
821
+ src = Polyphony.pipe
822
+ dest = Polyphony.pipe
823
+ str = +''
824
+ now = nil
825
+
826
+ f = spin {
827
+ now = Time.now
828
+ IO.gzip(src, str)
829
+ dest << str
830
+ dest.close
831
+ }
832
+
833
+ src << IO.read(__FILE__)
834
+ src.close
835
+ f.await
701
836
 
702
837
  gz = Zlib::GzipReader.new(dest)
703
838
  data = gz.read
@@ -707,6 +842,39 @@ class IOExtensionsTest < MiniTest::Test
707
842
  assert_nil gz.comment
708
843
  end
709
844
 
845
+ def test_gzip_from_string
846
+ str = IO.read(__FILE__)
847
+ dest = Polyphony.pipe
848
+ now = nil
849
+
850
+ IO.gzip(str, dest)
851
+ dest.close
852
+
853
+ gz = Zlib::GzipReader.new(dest)
854
+ data = gz.read
855
+ assert_equal IO.read(__FILE__), data
856
+ end
857
+
858
+ def test_gzip_return_value
859
+ src = Polyphony.pipe
860
+ dest = Polyphony.pipe
861
+ now = nil
862
+ ret = nil
863
+
864
+ f = spin {
865
+ now = Time.now
866
+ ret = IO.gzip(src, dest)
867
+ dest.close
868
+ }
869
+
870
+ src << IO.read(__FILE__)
871
+ src.close
872
+ f.await
873
+
874
+ gzipped = dest.read
875
+ assert_equal gzipped.bytesize, ret
876
+ end
877
+
710
878
  def test_gzip_with_mtime_int
711
879
  src = Polyphony.pipe
712
880
  dest = Polyphony.pipe
@@ -801,19 +969,51 @@ class IOExtensionsTest < MiniTest::Test
801
969
  def test_gunzip
802
970
  src = Polyphony.pipe
803
971
  dest = Polyphony.pipe
972
+ ret = nil
804
973
 
805
- spin {
806
- IO.gunzip(src, dest)
974
+ f = spin {
975
+ ret = IO.gunzip(src, dest)
807
976
  dest.close
808
977
  }
809
978
 
810
979
  gz = Zlib::GzipWriter.new(src, 9)
811
- gz << 'foobar'#IO.read(__FILE__)
980
+ gz << IO.read(__FILE__)
812
981
  gz.close
982
+ f.await
813
983
 
814
984
  data = dest.read
815
- # assert_equal IO.read(__FILE__), data
816
- assert_equal 'foobar', data
985
+ assert_equal IO.read(__FILE__).bytesize, ret
986
+ assert_equal IO.read(__FILE__), data
987
+ end
988
+
989
+ def test_gunzip_to_string
990
+ src = Polyphony.pipe
991
+ str = +''
992
+ ret = nil
993
+
994
+ f = spin {
995
+ ret = IO.gunzip(src, str)
996
+ }
997
+
998
+ gz = Zlib::GzipWriter.new(src, 9)
999
+ gz << IO.read(__FILE__)
1000
+ gz.close
1001
+ f.await
1002
+
1003
+ assert_equal IO.read(__FILE__).bytesize, ret
1004
+ assert_equal IO.read(__FILE__), str
1005
+ end
1006
+
1007
+ def test_gunzip_from_string
1008
+ src_data = 'foobar' * 1000
1009
+ str = Zlib.gzip(src_data, level: 9)
1010
+ dest = Polyphony.pipe
1011
+ ret = IO.gunzip(str, dest)
1012
+ dest.close
1013
+
1014
+ dest_data = dest.read
1015
+ assert_equal src_data.bytesize, ret
1016
+ assert_equal src_data, dest_data
817
1017
  end
818
1018
 
819
1019
  def test_gunzip_multi
@@ -893,4 +1093,24 @@ class IOExtensionsTest < MiniTest::Test
893
1093
  assert_equal 'foo.bar', dest_info[:orig_name]
894
1094
  assert_equal 'hello!', dest_info[:comment]
895
1095
  end
1096
+
1097
+ def test_deflate_inflate_strings
1098
+ src_data = IO.read(__FILE__)
1099
+ deflated = +''
1100
+ IO.deflate(src_data, deflated)
1101
+ inflated = +''
1102
+ IO.inflate(deflated, inflated)
1103
+
1104
+ assert_equal src_data, inflated
1105
+ end
1106
+
1107
+ def test_gzip_gunzip_strings
1108
+ src_data = IO.read(__FILE__)
1109
+ gzipped = +''
1110
+ IO.gzip(src_data, gzipped)
1111
+ gunzipped = +''
1112
+ IO.gunzip(gzipped, gunzipped)
1113
+
1114
+ assert_equal src_data, gunzipped
1115
+ end
896
1116
  end
data/test/test_signal.rb CHANGED
@@ -32,11 +32,15 @@ class SignalTrapTest < Minitest::Test
32
32
  trap ('SIGINT') { raise Interrupt }
33
33
  end
34
34
 
35
+ # remove [:spin, :oob], [:schedule, :oob], since they are generated inside
36
+ # the signal handler, which occur while the trace proc is running.
37
+ events = events.reject do |e|
38
+ e == [:spin, :oob] || e == [:schedule, :oob]
39
+ end
40
+
35
41
  expected = [
36
42
  [:block, :main],
37
43
  [:enter_poll, :main],
38
- [:spin, :oob],
39
- [:schedule, :oob],
40
44
  [:leave_poll, :main],
41
45
  [:unblock, :oob],
42
46
  [:terminate, :oob],
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polyphony
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.87'
4
+ version: '0.91'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-17 00:00:00.000000000 Z
11
+ date: 2022-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -305,6 +305,12 @@ files:
305
305
  - examples/performance/thread-vs-fiber/threaded_server.rb
306
306
  - examples/performance/thread_pool_perf.rb
307
307
  - examples/performance/thread_switch.rb
308
+ - examples/pipes/echo_server.rb
309
+ - examples/pipes/gunzip.rb
310
+ - examples/pipes/gzip.rb
311
+ - examples/pipes/gzip_http_server.rb
312
+ - examples/pipes/tcp_proxy.rb
313
+ - examples/pipes/tee.rb
308
314
  - ext/libev/Changes
309
315
  - ext/libev/LICENSE
310
316
  - ext/libev/README