async-safe 0.5.0 → 0.5.1
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
- checksums.yaml.gz.sig +0 -0
- data/lib/async/safe/monitor.rb +13 -6
- data/lib/async/safe/version.rb +1 -1
- data/readme.md +5 -0
- data/releases.md +5 -0
- data.tar.gz.sig +0 -0
- metadata +1 -1
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6cbe7dd25832d342534d929db18b02710ff5bb37e9f8c8b4f43e0409eb177823
|
|
4
|
+
data.tar.gz: c02bf34452470e70b39f1125595dab77fc8ac6d4898333adcc8323599464f4e8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 49a2081742fa5dce76e706fd62715afff8b0256cfae9bd87b4a32735db970b565f3c608d8953d969cec226febe0977f51201c5d84234915c83a97963b5044d89
|
|
7
|
+
data.tar.gz: 24aac6c2711cee0a34a998055b3e1b6100eae6c052eaf9b694fcabccbaae384b6d06f2c76305f6f986dceb3cb7844a86de7629afc55503fd1957e85c0d548d7e
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/lib/async/safe/monitor.rb
CHANGED
|
@@ -16,6 +16,10 @@ module Async
|
|
|
16
16
|
# Uses TracePoint to track in-flight method calls and detect concurrent access.
|
|
17
17
|
class Monitor
|
|
18
18
|
ASYNC_SAFE = true
|
|
19
|
+
|
|
20
|
+
IS_A = Kernel.instance_method(:is_a?)
|
|
21
|
+
FROZEN = Kernel.instance_method(:frozen?)
|
|
22
|
+
CLASS = Kernel.instance_method(:class)
|
|
19
23
|
|
|
20
24
|
# Initialize a new concurrency monitor.
|
|
21
25
|
def initialize
|
|
@@ -66,15 +70,15 @@ module Async
|
|
|
66
70
|
object = trace_point.self
|
|
67
71
|
|
|
68
72
|
# Skip tracking class/module methods:
|
|
69
|
-
return if
|
|
73
|
+
return if IS_A.bind_call(object, Module)
|
|
70
74
|
|
|
71
75
|
# Skip frozen objects:
|
|
72
|
-
return if object
|
|
76
|
+
return if FROZEN.bind_call(object)
|
|
73
77
|
|
|
74
78
|
method = trace_point.method_id
|
|
75
79
|
|
|
76
80
|
# Check the object's actual class:
|
|
77
|
-
klass = object
|
|
81
|
+
klass = CLASS.bind_call(object)
|
|
78
82
|
|
|
79
83
|
# Check if the class or method is marked as async-safe:
|
|
80
84
|
# Returns: true (skip), false (simple tracking), or Symbol (guard-based tracking)
|
|
@@ -140,15 +144,15 @@ module Async
|
|
|
140
144
|
object = trace_point.self
|
|
141
145
|
|
|
142
146
|
# Skip tracking class/module methods:
|
|
143
|
-
return if
|
|
147
|
+
return if IS_A.bind_call(object, Module)
|
|
144
148
|
|
|
145
149
|
# Skip frozen objects:
|
|
146
|
-
return if object
|
|
150
|
+
return if FROZEN.bind_call(object)
|
|
147
151
|
|
|
148
152
|
method = trace_point.method_id
|
|
149
153
|
|
|
150
154
|
# Check the object's actual class:
|
|
151
|
-
klass = object
|
|
155
|
+
klass = CLASS.bind_call(object)
|
|
152
156
|
|
|
153
157
|
# Check if the class or method is marked as async-safe:
|
|
154
158
|
safe = klass.async_safe?(method)
|
|
@@ -159,6 +163,9 @@ module Async
|
|
|
159
163
|
@mutex.synchronize do
|
|
160
164
|
entry = @guards[object]
|
|
161
165
|
|
|
166
|
+
# No guard held, nothing to release:
|
|
167
|
+
return unless entry
|
|
168
|
+
|
|
162
169
|
if safe == false
|
|
163
170
|
# Simple tracking (single guard)
|
|
164
171
|
# Release if this fiber holds it
|
data/lib/async/safe/version.rb
CHANGED
data/readme.md
CHANGED
|
@@ -22,6 +22,11 @@ Please see the [project documentation](https://socketry.github.io/async-safe/) f
|
|
|
22
22
|
|
|
23
23
|
Please see the [project releases](https://socketry.github.io/async-safe/releases/index) for all releases.
|
|
24
24
|
|
|
25
|
+
### v0.5.1
|
|
26
|
+
|
|
27
|
+
- Protect against missing guard in `check_return`.
|
|
28
|
+
- Use `Kernel` instance methods to handle broken proxy objects directly.
|
|
29
|
+
|
|
25
30
|
### v0.5.0
|
|
26
31
|
|
|
27
32
|
- More conservative tracking of objects using call/return for ownership transfer.
|
data/releases.md
CHANGED
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
metadata.gz.sig
CHANGED
|
Binary file
|