safe_regexp 0.2.1 → 0.2.2

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: 7989a74f69ebade41d93d489dc195534a979ac9a85e985c6d6461a8db53d65f0
4
- data.tar.gz: 333a79c41170a8282832b908bbc71e86198b430f752746267b665deffaf998a0
3
+ metadata.gz: a08c39c5fefd324f445219dd0a9c1480fc6e7fb9a8d87d2a8c94cb8fe9ffe842
4
+ data.tar.gz: 5a0fcafc1b454f4cbb870d3ca5ec6052614688c6f1431cd9e413e2542e07a691
5
5
  SHA512:
6
- metadata.gz: 703a1ff819189b105b8a26c6ff78cb9670d0e898538759c05d807570b9a6eaf59cd78827185b8bc3dcd55e039aa2bb82cee63c26cfd1d7468f50cc14b9ec7948
7
- data.tar.gz: 7a91b3448c11a695ba54dd0beaf6011ee00e9809bd147f9dd96721e764c413efbab926fba3ea2ad450ae72c4a1fc07096bd76a0af627fece1df8044d01482717
6
+ metadata.gz: dfce8cc283436b706e02be017a6b5cc515255ff058b853c10cfbd9c568ae8e5e73f7e8f368a3fbf6bb97164cb6ec6caee1845973dc5e0e13f1147664fc972b65
7
+ data.tar.gz: 05ae09e0f259262cc3f5b93b6c180ecea9031efc8f17e1234b04d0720bc057707d959b0a978d2d0c0cb2021e4e3d68f0ba53a8623170ebded1c752a91ecc6331
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module SafeRegexp
3
- VERSION = "0.2.1"
3
+ VERSION = "0.2.2"
4
4
  end
data/lib/safe_regexp.rb CHANGED
@@ -9,22 +9,36 @@ module SafeRegexp
9
9
  class << self
10
10
  def execute(regex, method, string, timeout: 1, keepalive: 10)
11
11
  retried = false
12
+
12
13
  begin
13
- read, write, pid = executor
14
- Marshal.dump([regex, method, string, keepalive], write)
15
- rescue Errno::EPIPE # keepalive already killed the process
16
- raise if retried
14
+ loading_result = false
15
+
16
+ begin
17
+ read, write, pid = executor
18
+ Marshal.dump([regex, method, string, keepalive], write)
19
+ rescue Errno::EPIPE
20
+ # keepalive already killed the process, but we don't check before sending
21
+ # since that would be a race condition and cause overhead for the 99.9% case
22
+ raise if retried
23
+ retried = true
24
+ discard_executor # avoiding kill overhead since it's already dead
25
+ retry # new executor will be created by `executor` call
26
+ end
27
+
28
+ unless IO.select([read], nil, nil, timeout)
29
+ kill_executor pid
30
+ raise RegexpTimeout
31
+ end
32
+
33
+ loading_result = true
34
+ result = Marshal.load(read)
35
+ rescue EOFError # process was dead from keepalive when we sent to it or got killed from outside
36
+ raise if retried || !loading_result
17
37
  retried = true
18
38
  discard_executor # avoiding kill overhead since it's already dead
19
- retry # new executor will be created by `executor` call
20
- end
21
-
22
- unless IO.select([read], nil, nil, timeout)
23
- kill_executor pid
24
- raise RegexpTimeout
39
+ retry
25
40
  end
26
41
 
27
- result = Marshal.load(read)
28
42
  result.is_a?(RESCUED_EXCEPTION) ? raise(result) : result
29
43
  end
30
44
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safe_regexp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-01 00:00:00.000000000 Z
11
+ date: 2019-04-10 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: michael@grosser.it