ruby-brs 1.1.4 → 1.3.0

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: 169f9d5837ac233e808610055a4edee6c5e133c78bd1047e951c218bd731e74d
4
- data.tar.gz: bd9ddc4653f00f5a5dd855a14f5c2b8013fd90ffce741334f523197621cacb15
3
+ metadata.gz: 519776eef000f690d628b64310be61daf3e8cc144a103fa848586f1165e92de9
4
+ data.tar.gz: 8a0f7b24666a6291b10700a6ddf4dfd8afe90e2286750ca02531126348f0a198
5
5
  SHA512:
6
- metadata.gz: 1f7014703dbf00857e5c829aef7742c85d6251858047ed7bb234ec6b18c433615a5c72f0a48ce943cd34c9074f4104af23077beb27763ad6d8d68aa2a0cace6a
7
- data.tar.gz: 581c2b4e7d0b2cbab7c8b54427c05305238ecda8ef8e6f1a98493e01176f7e98b5a0f1009ec2f95beeb54ed6562511a08994ae24d7f75d0fed4ac7017f7eb21c
6
+ metadata.gz: c1a644ae3619da601177e0985926acffb6a43910c9686dfdb97b33f191814699f0cb6c9e38a5ecedb5f33999ac9cf129d0864bfcb2d065981faf1da61f5ef9c5
7
+ data.tar.gz: f7cf208285d14a9c2ef5b868dee4c1bf2dbe1262479cc250b6ce48d4c462007da431e8c5322097c8bf71cdef009140625ed8439d0c2a878825a4b502599a2086
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Ruby bindings for brotli library
2
2
 
3
- | Travis | AppVeyor | Circle | Codecov |
4
- | :---: | :---: | :---: | :---: |
5
- | [![Travis test status](https://travis-ci.com/andrew-aladev/ruby-brs.svg?branch=master)](https://travis-ci.com/andrew-aladev/ruby-brs) | [![AppVeyor test status](https://ci.appveyor.com/api/projects/status/github/andrew-aladev/ruby-brs?branch=master&svg=true)](https://ci.appveyor.com/project/andrew-aladev/ruby-brs/branch/master) | [![Circle test status](https://circleci.com/gh/andrew-aladev/ruby-brs/tree/master.svg?style=shield)](https://circleci.com/gh/andrew-aladev/ruby-brs/tree/master) | [![Codecov](https://codecov.io/gh/andrew-aladev/ruby-brs/branch/master/graph/badge.svg)](https://codecov.io/gh/andrew-aladev/ruby-brs) |
3
+ | AppVeyor | Circle | Github actions | Codecov | Gem |
4
+ | :------: | :----: | :------------: | :-----: | :--: |
5
+ | [![AppVeyor test status](https://ci.appveyor.com/api/projects/status/github/andrew-aladev/ruby-brs?branch=master&svg=true)](https://ci.appveyor.com/project/andrew-aladev/ruby-brs/branch/master) | [![Circle test status](https://circleci.com/gh/andrew-aladev/ruby-brs/tree/master.svg?style=shield)](https://circleci.com/gh/andrew-aladev/ruby-brs/tree/master) | [![Github Actions test status](https://github.com/andrew-aladev/ruby-brs/workflows/test/badge.svg?branch=master)](https://github.com/andrew-aladev/ruby-brs/actions) | [![Codecov](https://codecov.io/gh/andrew-aladev/ruby-brs/branch/master/graph/badge.svg)](https://codecov.io/gh/andrew-aladev/ruby-brs) | [![Gem](https://img.shields.io/gem/v/ruby-brs.svg)](https://rubygems.org/gems/ruby-brs) |
6
6
 
7
7
  See [brotli library](https://github.com/google/brotli).
8
8
 
@@ -61,7 +61,7 @@ ensure
61
61
  end
62
62
  ```
63
63
 
64
- You can create and read `tar.br` archives with `minitar` for example.
64
+ You can create and read `tar.br` archives with [minitar](https://github.com/halostatue/minitar).
65
65
 
66
66
  ```ruby
67
67
  require "brs"
@@ -83,44 +83,80 @@ BRS::Stream::Reader.open "file.tar.br" do |reader|
83
83
  end
84
84
  ```
85
85
 
86
+ You can also use `Content-Encoding: br` with [sinatra](http://sinatrarb.com):
87
+
88
+ ```ruby
89
+ require "brs"
90
+ require "sinatra"
91
+
92
+ get "/" do
93
+ headers["Content-Encoding"] = "br"
94
+ BRS::String.compress "sample string"
95
+ end
96
+ ```
97
+
98
+ All functionality (including streaming) can be used inside multiple threads with [parallel](https://github.com/grosser/parallel).
99
+ This code will provide heavy load for your CPU.
100
+
101
+ ```ruby
102
+ require "brs"
103
+ require "parallel"
104
+
105
+ Parallel.each large_datas do |large_data|
106
+ BRS::String.compress large_data
107
+ end
108
+ ```
109
+
86
110
  ## Options
87
111
 
88
- | Option | Values | Default | Description |
89
- |------------------------------------|--------------|--------------|-------------|
90
- | `source_buffer_length` | `0 - inf` | `0 (auto)` | internal buffer length for source data |
91
- | `destination_buffer_length` | `0 - inf` | `0 (auto)` | internal buffer length for description data |
92
- | `mode` | `MODES` | `:generic` | compressor mode |
93
- | `quality` | `0 - 11` | `11` | compression level |
94
- | `lgwin` | `10 - 24` | `22` | compressor window size |
95
- | `lgblock` | `16 - 24` | `nil (auto)` | compressor input block size |
96
- | `disable_literal_context_modeling` | `true/false` | `false` | disables literal context modeling format |
97
- | `disable_ring_buffer_reallocation` | `true/false` | `false` | disables ring buffer reallocation |
98
- | `size_hint` | `0 - inf` | `0 (auto)` | size of input (if known) |
99
- | `large_window` | `true/false` | `false` | enables large window |
112
+ | Option | Values | Default | Description |
113
+ |------------------------------------|------------|------------|-------------|
114
+ | `source_buffer_length` | 0 - inf | 0 (auto) | internal buffer length for source data |
115
+ | `destination_buffer_length` | 0 - inf | 0 (auto) | internal buffer length for description data |
116
+ | `gvl` | true/false | false | enables global VM lock where possible |
117
+ | `mode` | `MODES` | `:generic` | compressor mode |
118
+ | `quality` | 0 - 11 | 11 | compression level |
119
+ | `lgwin` | 10 - 24 | 22 | compressor window size |
120
+ | `lgblock` | 16 - 24 | nil (auto) | compressor input block size |
121
+ | `npostfix` | 0 - 3 | nil (auto) | Recommended number of postfix bits |
122
+ | `ndirect` | 0 - 120 | nil (auto) | Recommended number of direct distance codes (step 1 << npostfix, max 15 << npostfix) |
123
+ | `disable_literal_context_modeling` | true/false | false | disables literal context modeling format |
124
+ | `disable_ring_buffer_reallocation` | true/false | false | disables ring buffer reallocation |
125
+ | `size_hint` | 0 - inf | 0 (auto) | size of input (if known) |
126
+ | `large_window` | true/false | false | enables large window |
100
127
 
101
128
  There are internal buffers for compressed and decompressed data.
102
129
  For example you want to use 1 KB as `source_buffer_length` for compressor - please use 256 B as `destination_buffer_length`.
103
130
  You want to use 256 B as `source_buffer_length` for decompressor - please use 1 KB as `destination_buffer_length`.
104
131
 
132
+ `gvl` is disabled by default, this mode allows running multiple compressors/decompressors in different threads simultaneously.
133
+ Please consider enabling `gvl` if you don't want to launch processors in separate threads.
134
+ If `gvl` is enabled ruby won't waste time on acquiring/releasing VM lock.
135
+
105
136
  `String` and `File` will set `:size_hint` automaticaly.
106
137
 
107
138
  You can also read brotli docs for more info about options.
108
139
 
109
- | Option | Related constants |
110
- |-----------|-------------------|
111
- | `mode` | `BRS::Option::MODES = %i[text font generic]` |
112
- | `quality` | `BRS::Option::MIN_QUALITY = 0`, `BRS::Option::MAX_QUALITY = 11` |
113
- | `lgwin` | `BRS::Option::MIN_LGWIN = 10`, `BRS::Option::MAX_LGWIN = 24` |
114
- | `lgblock` | `BRS::Option::MIN_LGBLOCK = 16`, `BRS::Option::MAX_LGBLOCK = 24` |
140
+ | Option | Related constants |
141
+ |------------|-------------------|
142
+ | `mode` | `BRS::Option::MODES` = `%i[text font generic]` |
143
+ | `quality` | `BRS::Option::MIN_QUALITY` = 0, `BRS::Option::MAX_QUALITY` = 11 |
144
+ | `lgwin` | `BRS::Option::MIN_LGWIN` = 10, `BRS::Option::MAX_LGWIN` = 24 |
145
+ | `lgblock` | `BRS::Option::MIN_LGBLOCK` = 16, `BRS::Option::MAX_LGBLOCK` = 24 |
146
+ | `npostfix` | `BRS::Option::MIN_NPOSTFIX` = 0, `BRS::Option::MAX_NPOSTFIX` = 3 |
147
+ | `ndirect` | `BRS::Option::MIN_NDIRECT` = 0, `BRS::Option::MAX_NDIRECT` = 120, `BRS::Option::NDIRECT_NPOSTFIX_STEP_BASE` = 1, `BRS::Option::NDIRECT_NPOSTFIX_MAX_BASE` = 15 |
115
148
 
116
149
  Possible compressor options:
117
150
  ```
118
151
  :source_buffer_length
119
152
  :destination_buffer_length
153
+ :gvl
120
154
  :mode
121
155
  :quality
122
156
  :lgwin
123
157
  :lgblock
158
+ :npostfix
159
+ :ndirect
124
160
  :disable_literal_context_modeling
125
161
  :size_hint
126
162
  :large_window
@@ -130,6 +166,7 @@ Possible decompressor options:
130
166
  ```
131
167
  :source_buffer_length
132
168
  :destination_buffer_length
169
+ :gvl
133
170
  :disable_ring_buffer_reallocation
134
171
  :large_window
135
172
  ```
@@ -143,18 +180,6 @@ data = BRS::String.compress "sample string", :quality => 5
143
180
  puts BRS::String.decompress(data, :disable_ring_buffer_reallocation => true)
144
181
  ```
145
182
 
146
- HTTP encoding (`Content-Encoding: br`) using default options:
147
-
148
- ```ruby
149
- require "brs"
150
- require "sinatra"
151
-
152
- get "/" do
153
- headers["Content-Encoding"] = "br"
154
- BRS::String.compress "sample string"
155
- end
156
- ```
157
-
158
183
  ## String
159
184
 
160
185
  String maintains destination buffer only, so it accepts `destination_buffer_length` option only.
@@ -179,7 +204,7 @@ File maintains both source and destination buffers, it accepts both `source_buff
179
204
 
180
205
  ## Stream::Writer
181
206
 
182
- Its behaviour is similar to builtin [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipWriter.html).
207
+ Its behaviour is similar to builtin [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipWriter.html).
183
208
 
184
209
  Writer maintains destination buffer only, so it accepts `destination_buffer_length` option only.
185
210
 
@@ -217,7 +242,7 @@ Set another encodings, `nil` is just for compatibility with `IO`.
217
242
  #tell
218
243
  ```
219
244
 
220
- See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
245
+ See [`IO`](https://ruby-doc.org/core/IO.html) docs.
221
246
 
222
247
  ```
223
248
  #write(*objects)
@@ -227,7 +252,7 @@ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
227
252
  #closed?
228
253
  ```
229
254
 
230
- See [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
255
+ See [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
231
256
 
232
257
  ```
233
258
  #write_nonblock(object, *options)
@@ -241,6 +266,9 @@ Special asynchronous methods missing in `Zlib::GzipWriter`.
241
266
  So it is possible to have asynchronous variants for these synchronous methods.
242
267
  Behaviour is the same as `IO#write_nonblock` method.
243
268
 
269
+ All nonblock operations for file will raise `EBADF` error on Windows.
270
+ Setting file into nonblocking mode is [not available on Windows](https://github.com/ruby/ruby/blob/master/win32/win32.c#L4388).
271
+
244
272
  ```
245
273
  #<<(object)
246
274
  #print(*objects)
@@ -249,11 +277,11 @@ Behaviour is the same as `IO#write_nonblock` method.
249
277
  #puts(*objects)
250
278
  ```
251
279
 
252
- Typical helpers, see [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
280
+ Typical helpers, see [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
253
281
 
254
282
  ## Stream::Reader
255
283
 
256
- Its behaviour is similar to builtin [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipReader.html).
284
+ Its behaviour is similar to builtin [`Zlib::GzipReader`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipReader.html).
257
285
 
258
286
  Reader maintains both source and destination buffers, it accepts both `source_buffer_length` and `destination_buffer_length` options.
259
287
 
@@ -288,7 +316,7 @@ Set another encodings.
288
316
  #tell
289
317
  ```
290
318
 
291
- See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
319
+ See [`IO`](https://ruby-doc.org/core/IO.html) docs.
292
320
 
293
321
  ```
294
322
  #read(bytes_to_read = nil, out_buffer = nil)
@@ -298,14 +326,14 @@ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
298
326
  #closed?
299
327
  ```
300
328
 
301
- See [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
329
+ See [`Zlib::GzipReader`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
302
330
 
303
331
  ```
304
332
  #readpartial(bytes_to_read = nil, out_buffer = nil)
305
333
  #read_nonblock(bytes_to_read, out_buffer = nil, *options)
306
334
  ```
307
335
 
308
- See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
336
+ See [`IO`](https://ruby-doc.org/core/IO.html) docs.
309
337
 
310
338
  ```
311
339
  #getbyte
@@ -328,14 +356,26 @@ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
328
356
  #ungetline(line)
329
357
  ```
330
358
 
331
- Typical helpers, see [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
359
+ Typical helpers, see [`Zlib::GzipReader`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
360
+
361
+ ## Thread safety
362
+
363
+ `:gvl` option is disabled by default, you can use bindings effectively in multiple threads.
364
+ Please be careful: bindings are not thread safe.
365
+ You should lock all shared data between threads.
366
+
367
+ For example: you should not use same compressor/decompressor inside multiple threads.
368
+ Please verify that you are using each processor inside single thread at the same time.
369
+
370
+ ## Operating systems
371
+
372
+ GNU/Linux, FreeBSD, OSX, Windows (MinGW).
332
373
 
333
374
  ## CI
334
375
 
335
- See universal test script [scripts/ci_test.sh](scripts/ci_test.sh) for CI.
336
376
  Please visit [scripts/test-images](scripts/test-images).
337
- You can run this test script using many native and cross images.
377
+ See universal test script [scripts/ci_test.sh](scripts/ci_test.sh) for CI.
338
378
 
339
379
  ## License
340
380
 
341
- MIT license, see LICENSE and AUTHORS.
381
+ MIT license, see [LICENSE](LICENSE) and [AUTHORS](AUTHORS).
data/ext/brs_ext/buffer.c CHANGED
@@ -3,17 +3,16 @@
3
3
 
4
4
  #include "brs_ext/buffer.h"
5
5
 
6
- #include "ruby.h"
7
-
8
6
  VALUE brs_ext_create_string_buffer(VALUE length)
9
7
  {
10
8
  return rb_str_new(NULL, NUM2SIZET(length));
11
9
  }
12
10
 
13
- VALUE brs_ext_resize_string_buffer(VALUE args)
11
+ VALUE brs_ext_resize_string_buffer(VALUE buffer_args)
14
12
  {
15
- VALUE buffer = rb_ary_entry(args, 0);
16
- VALUE length = rb_ary_entry(args, 1);
13
+ VALUE buffer = rb_ary_entry(buffer_args, 0);
14
+ VALUE length = rb_ary_entry(buffer_args, 1);
15
+
17
16
  return rb_str_resize(buffer, NUM2SIZET(length));
18
17
  }
19
18
 
@@ -21,8 +20,21 @@ void brs_ext_buffer_exports(VALUE root_module)
21
20
  {
22
21
  VALUE module = rb_define_module_under(root_module, "Buffer");
23
22
 
24
- rb_define_const(module, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR", SIZET2NUM(BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR));
25
- rb_define_const(module, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR", SIZET2NUM(BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR));
26
- rb_define_const(module, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR", SIZET2NUM(BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR));
27
- rb_define_const(module, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR", SIZET2NUM(BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR));
23
+ rb_define_const(
24
+ module, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR", SIZET2NUM(BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR));
25
+
26
+ rb_define_const(
27
+ module,
28
+ "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR",
29
+ SIZET2NUM(BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR));
30
+
31
+ rb_define_const(
32
+ module,
33
+ "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR",
34
+ SIZET2NUM(BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR));
35
+
36
+ rb_define_const(
37
+ module,
38
+ "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR",
39
+ SIZET2NUM(BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR));
28
40
  }
data/ext/brs_ext/buffer.h CHANGED
@@ -6,10 +6,10 @@
6
6
 
7
7
  #include "ruby.h"
8
8
 
9
- #define BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR (1 << 18) // 256 KB
9
+ #define BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR (1 << 18) // 256 KB
10
10
  #define BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR (1 << 16) // 64 KB
11
11
 
12
- #define BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR (1 << 16) // 64 KB
12
+ #define BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR (1 << 16) // 64 KB
13
13
  #define BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR (1 << 18) // 256 KB
14
14
 
15
15
  VALUE brs_ext_create_string_buffer(VALUE length);
@@ -17,12 +17,12 @@ VALUE brs_ext_create_string_buffer(VALUE length);
17
17
  #define BRS_EXT_CREATE_STRING_BUFFER(buffer, length, exception) \
18
18
  VALUE buffer = rb_protect(brs_ext_create_string_buffer, SIZET2NUM(length), &exception);
19
19
 
20
- VALUE brs_ext_resize_string_buffer(VALUE args);
20
+ VALUE brs_ext_resize_string_buffer(VALUE buffer_args);
21
21
 
22
- #define BRS_EXT_RESIZE_STRING_BUFFER(buffer, length, exception) \
23
- VALUE args = rb_ary_new_from_args(2, buffer, SIZET2NUM(length)); \
24
- buffer = rb_protect(brs_ext_resize_string_buffer, args, &exception); \
25
- RB_GC_GUARD(args);
22
+ #define BRS_EXT_RESIZE_STRING_BUFFER(buffer, length, exception) \
23
+ VALUE buffer_args = rb_ary_new_from_args(2, buffer, SIZET2NUM(length)); \
24
+ buffer = rb_protect(brs_ext_resize_string_buffer, buffer_args, &exception); \
25
+ RB_GC_GUARD(buffer_args);
26
26
 
27
27
  void brs_ext_buffer_exports(VALUE root_module);
28
28
 
data/ext/brs_ext/error.c CHANGED
@@ -3,10 +3,6 @@
3
3
 
4
4
  #include "brs_ext/error.h"
5
5
 
6
- #include <brotli/decode.h>
7
-
8
- #include "ruby.h"
9
-
10
6
  brs_ext_result_t brs_ext_get_decompressor_error(BrotliDecoderErrorCode error_code)
11
7
  {
12
8
  switch (error_code) {
@@ -39,7 +35,7 @@ brs_ext_result_t brs_ext_get_decompressor_error(BrotliDecoderErrorCode error_cod
39
35
  }
40
36
  }
41
37
 
42
- static inline NORETURN(void raise(const char* name, const char* description))
38
+ static inline NORETURN(void raise_error(const char* name, const char* description))
43
39
  {
44
40
  VALUE module = rb_define_module(BRS_EXT_MODULE_NAME);
45
41
  VALUE error = rb_const_get(module, rb_intern(name));
@@ -50,28 +46,28 @@ void brs_ext_raise_error(brs_ext_result_t ext_result)
50
46
  {
51
47
  switch (ext_result) {
52
48
  case BRS_EXT_ERROR_ALLOCATE_FAILED:
53
- raise("AllocateError", "allocate error");
49
+ raise_error("AllocateError", "allocate error");
54
50
  case BRS_EXT_ERROR_VALIDATE_FAILED:
55
- raise("ValidateError", "validate error");
51
+ raise_error("ValidateError", "validate error");
56
52
 
57
53
  case BRS_EXT_ERROR_USED_AFTER_CLOSE:
58
- raise("UsedAfterCloseError", "used after closed");
54
+ raise_error("UsedAfterCloseError", "used after closed");
59
55
  case BRS_EXT_ERROR_NOT_ENOUGH_SOURCE_BUFFER:
60
- raise("NotEnoughSourceBufferError", "not enough source buffer");
56
+ raise_error("NotEnoughSourceBufferError", "not enough source buffer");
61
57
  case BRS_EXT_ERROR_NOT_ENOUGH_DESTINATION_BUFFER:
62
- raise("NotEnoughDestinationBufferError", "not enough destination buffer");
58
+ raise_error("NotEnoughDestinationBufferError", "not enough destination buffer");
63
59
  case BRS_EXT_ERROR_DECOMPRESSOR_CORRUPTED_SOURCE:
64
- raise("DecompressorCorruptedSourceError", "decompressor received corrupted source");
60
+ raise_error("DecompressorCorruptedSourceError", "decompressor received corrupted source");
65
61
 
66
62
  case BRS_EXT_ERROR_ACCESS_IO:
67
- raise("AccessIOError", "failed to access IO");
63
+ raise_error("AccessIOError", "failed to access IO");
68
64
  case BRS_EXT_ERROR_READ_IO:
69
- raise("ReadIOError", "failed to read IO");
65
+ raise_error("ReadIOError", "failed to read IO");
70
66
  case BRS_EXT_ERROR_WRITE_IO:
71
- raise("WriteIOError", "failed to write IO");
67
+ raise_error("WriteIOError", "failed to write IO");
72
68
 
73
69
  default:
74
70
  // BRS_EXT_ERROR_UNEXPECTED
75
- raise("UnexpectedError", "unexpected error");
71
+ raise_error("UnexpectedError", "unexpected error");
76
72
  }
77
73
  }
data/ext/brs_ext/error.h CHANGED
@@ -11,7 +11,8 @@
11
11
 
12
12
  // Results for errors listed in "lib/brs/error" used in c extension.
13
13
 
14
- enum {
14
+ enum
15
+ {
15
16
  BRS_EXT_ERROR_ALLOCATE_FAILED = 1,
16
17
  BRS_EXT_ERROR_VALIDATE_FAILED,
17
18
 
data/ext/brs_ext/gvl.h ADDED
@@ -0,0 +1,24 @@
1
+ // Ruby bindings for brotli library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #if !defined(BRS_EXT_GVL_H)
5
+ #define BRS_EXT_GVL_H
6
+
7
+ #ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL
8
+
9
+ #include "ruby/thread.h"
10
+
11
+ #define BRS_EXT_GVL_WRAP(gvl, function, data) \
12
+ if (gvl) { \
13
+ function((void*) data); \
14
+ } else { \
15
+ rb_thread_call_without_gvl(function, (void*) data, RUBY_UBF_IO, NULL); \
16
+ }
17
+
18
+ #else
19
+
20
+ #define BRS_EXT_GVL_WRAP(_gvl, function, data) function((void*) data);
21
+
22
+ #endif
23
+
24
+ #endif // BRS_EXT_GVL_H