concurrent-ruby-ext 0.9.0-x64-mingw32 → 0.9.1-x64-mingw32
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
- data/CHANGELOG.md +15 -1
- data/README.md +23 -19
- data/ext/concurrent/atomic_fixnum.c +27 -4
- data/ext/concurrent/atomic_fixnum.h +3 -2
- data/ext/concurrent/rb_concurrent.c +3 -2
- data/lib/concurrent/2.0/extension.so +0 -0
- data/lib/concurrent/2.1/extension.so +0 -0
- data/lib/concurrent/2.2/extension.so +0 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0025ebc6b16dd026085417d89be717515bb5307c
|
4
|
+
data.tar.gz: e20fa3173b0f4dc92c36f6901b6a8f087414fcd7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7c208a762c2222752828ef87fcdeeb394da507b788c105474de0e14b6a31bddd5d72b724aa16af7e1b2ab90b8a9970016494f0232e7cc7b0787615409ca8a1c
|
7
|
+
data.tar.gz: e47e3a2603455dbcf323f543fd07f4be92b5c9e1c80916909f0bcdb2107c59dac714eabe966f8bf44b8bc532bbcf388fa8ab8932e6c831ba73151e3cd27760a9
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,18 @@
|
|
1
|
-
## Current Release v0.9.
|
1
|
+
## Current Release v0.9.1 (09 August 2015)
|
2
|
+
|
3
|
+
* Fixed a Rubiniux bug in synchronization object
|
4
|
+
* Fixed all interpreter warnings (except circular references)
|
5
|
+
* Fixed require statements when requiring `Atom` alone
|
6
|
+
* Significantly improved `ThreadLocalVar` on non-JRuby platforms
|
7
|
+
* Fixed error handling in Edge `Concurrent.zip`
|
8
|
+
* `AtomicFixnum` methods `#increment` and `#decrement` now support optional delta
|
9
|
+
* New `AtomicFixnum#update` method
|
10
|
+
* Minor optimizations in `ReadWriteLock`
|
11
|
+
* New `ReentrantReadWriteLock` class
|
12
|
+
* `ThreadLocalVar#bind` method is now public
|
13
|
+
* Refactored many tests
|
14
|
+
|
15
|
+
### Release v0.9.0 (10 July 2015)
|
2
16
|
|
3
17
|
* Updated `AtomicReference`
|
4
18
|
- `AtomicReference#try_update` now simply returns instead of raising exception
|
data/README.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Concurrent Ruby
|
2
|
-
|
2
|
+
|
3
|
+
[](http://badge.fury.io/rb/concurrent-ruby)
|
4
|
+
[](https://travis-ci.org/ruby-concurrency/concurrent-ruby)
|
5
|
+
[](https://ci.appveyor.com/project/rubyconcurrency/concurrent-ruby)
|
6
|
+
[](https://codeclimate.com/github/ruby-concurrency/concurrent-ruby)
|
7
|
+
[](http://inch-ci.org/github/ruby-concurrency/concurrent-ruby)
|
8
|
+
[](https://gemnasium.com/ruby-concurrency/concurrent-ruby)
|
9
|
+
[](http://opensource.org/licenses/MIT)
|
10
|
+
[-devs%20%26%20users-brightgreen.svg)](https://gitter.im/ruby-concurrency/concurrent-ruby)
|
3
11
|
|
4
12
|
<table>
|
5
13
|
<tr>
|
@@ -43,13 +51,13 @@ Java 8 is required for JRuby (Java 7 support is deprecated in version 0.9 and wi
|
|
43
51
|
|
44
52
|
## Features & Documentation
|
45
53
|
|
46
|
-
We have a roadmap guiding our work toward the [v1.0.0 release](https://github.com/ruby-concurrency/concurrent-ruby/
|
54
|
+
We have a roadmap guiding our work toward the [v1.0.0 release](https://github.com/ruby-concurrency/concurrent-ruby/issues/257).
|
47
55
|
|
48
56
|
The primary site for documentation is the automatically generated [API documentation](http://ruby-concurrency.github.io/concurrent-ruby/frames.html)
|
49
57
|
|
50
|
-
We also have a [mailing list](http://groups.google.com/group/concurrent-ruby).
|
58
|
+
We also have a [mailing list](http://groups.google.com/group/concurrent-ruby) and [IRC (gitter)](https://gitter.im/ruby-concurrency/concurrent-ruby).
|
51
59
|
|
52
|
-
This library contains a variety of concurrency abstractions at high and low levels. One of the high-level abstractions is likely to meet most common needs.
|
60
|
+
This library contains a variety of concurrency abstractions at high and low levels. One of the high-level abstractions is likely to meet most common needs.
|
53
61
|
|
54
62
|
#### General-purpose Concurrency Abstractions
|
55
63
|
|
@@ -59,7 +67,7 @@ This library contains a variety of concurrency abstractions at high and low leve
|
|
59
67
|
* [Dataflow](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent.html#dataflow-class_method): Built on Futures, Dataflow allows you to create a task that will be scheduled when all of its data dependencies are available.
|
60
68
|
* [Promise](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Promise.html): Similar to Futures, with more features.
|
61
69
|
* [ScheduledTask](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ScheduledTask.html): Like a Future scheduled for a specific future time.
|
62
|
-
* [TimerTask](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/TimerTask.html): A Thread that periodically wakes up to perform work at regular intervals.
|
70
|
+
* [TimerTask](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/TimerTask.html): A Thread that periodically wakes up to perform work at regular intervals.
|
63
71
|
|
64
72
|
#### Thread-safe Value Objects
|
65
73
|
|
@@ -97,6 +105,7 @@ Derived from Ruby's [Struct](http://ruby-doc.org/core-2.2.0/Struct.html):
|
|
97
105
|
* [Thread-local variables](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ThreadLocalVar.html)
|
98
106
|
* [Software transactional memory](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/TVar.html) (TVar)
|
99
107
|
* [ReadWriteLock](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ReadWriteLock.html)
|
108
|
+
* [ReentrantReadWriteLock](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ReentrantReadWriteLock.html)
|
100
109
|
|
101
110
|
### Edge Features
|
102
111
|
|
@@ -108,34 +117,31 @@ be obeyed though. Features developed in `concurrent-ruby-edge` are expected to m
|
|
108
117
|
|
109
118
|
* [Actor](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Actor.html):
|
110
119
|
Implements the Actor Model, where concurrent actors exchange messages.
|
111
|
-
* [new Future Framework](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Edge.html) - new
|
120
|
+
* [new Future Framework](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Edge/FutureShortcuts.html) - new
|
112
121
|
unified implementation of Futures and Promises which combines Features of previous `Future`,
|
113
122
|
`Promise`, `IVar`, `Event`, `Probe`, `dataflow`, `Delay`, `TimerTask` into single framework. It uses extensively
|
114
|
-
new synchronization layer to make all the
|
115
|
-
|
123
|
+
new synchronization layer to make all the features **non-blocking** and **lock-free** with exception of obviously blocking
|
124
|
+
operations like `#wait`, `#value`. It also offers better performance.
|
116
125
|
* [Agent](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Agent.html): A single atomic value that represents an identity.
|
117
126
|
* [Channel](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Channel.html):
|
118
127
|
Communicating Sequential Processes (CSP).
|
119
128
|
* [Exchanger](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Exchanger.html)
|
120
129
|
* [LazyRegister](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/LazyRegister.html)
|
121
|
-
* [
|
122
|
-
|
123
|
-
|
124
|
-
new synchronization layer to make all the paths lock-free with exception of blocking threads on `#wait`.
|
125
|
-
It offers better performance and does not block threads (exception being `#wait` and similar methods where it's
|
126
|
-
intended).
|
127
|
-
|
130
|
+
* [Atomic Markable Reference](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Edge/AtomicMarkableReference.html)
|
131
|
+
* [LockFreeLinked Set](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Edge/LockFreeLinkedSet.html)
|
132
|
+
* [LockFreeStack](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Edge/LockFreeStack.html)
|
128
133
|
|
129
134
|
#### Statuses:
|
130
135
|
|
131
136
|
*Why are these not in core?*
|
132
137
|
|
133
|
-
- **Actor** - Partial documentation and tests; stability is good.
|
138
|
+
- **Actor** - Partial documentation and tests; stability is good.
|
134
139
|
- **Future/Promise Framework** - API changes; partial documentation and tests; stability good.
|
135
140
|
- **Agent** - Incomplete behaviour compared to Clojure's models; stability good.
|
136
141
|
- **Channel** - Missing documentation; limted features; stability good.
|
137
142
|
- **Exchanger** - Known race condition requiring a new implementation.
|
138
|
-
- **LazyRegister** - Missing documentation and tests.
|
143
|
+
- **LazyRegister** - Missing documentation and tests.
|
144
|
+
- **AtomicMarkableReference, LockFreeLinkedSet, LockFreeStack** - Needs real world battle testing
|
139
145
|
|
140
146
|
## Usage
|
141
147
|
|
@@ -179,8 +185,6 @@ require 'concurrent/actor' # Concurrent::Actor and supporting code
|
|
179
185
|
require 'concurrent/edge/future' # new Future Framework
|
180
186
|
require 'concurrent/agent' # Concurrent::Agent
|
181
187
|
require 'concurrent/channel ' # Concurrent::Channel and supporting code
|
182
|
-
require 'concurrent/exchanger' # Concurrent::Exchanger
|
183
|
-
require 'concurrent/lazy_register' # Concurrent::LazyRegister
|
184
188
|
```
|
185
189
|
|
186
190
|
If the library does not behave as expected, `Concurrent.use_stdlib_logger(Logger::DEBUG)` could help to reveal the problem.
|
@@ -33,14 +33,26 @@ VALUE method_atomic_fixnum_value_set(VALUE self, VALUE value) {
|
|
33
33
|
return(value);
|
34
34
|
}
|
35
35
|
|
36
|
-
VALUE method_atomic_fixnum_increment(VALUE self) {
|
36
|
+
VALUE method_atomic_fixnum_increment(int argc, VALUE* argv, VALUE self) {
|
37
37
|
long long value = NUM2LL((VALUE) DATA_PTR(self));
|
38
|
-
|
38
|
+
long long delta = 1;
|
39
|
+
rb_check_arity(argc, 0, 1);
|
40
|
+
if (argc == 1) {
|
41
|
+
Check_Type(argv[0], T_FIXNUM);
|
42
|
+
delta = NUM2LL(argv[0]);
|
43
|
+
}
|
44
|
+
return method_atomic_fixnum_value_set(self, LL2NUM(value + delta));
|
39
45
|
}
|
40
46
|
|
41
|
-
VALUE method_atomic_fixnum_decrement(VALUE self) {
|
47
|
+
VALUE method_atomic_fixnum_decrement(int argc, VALUE* argv, VALUE self) {
|
42
48
|
long long value = NUM2LL((VALUE) DATA_PTR(self));
|
43
|
-
|
49
|
+
long long delta = 1;
|
50
|
+
rb_check_arity(argc, 0, 1);
|
51
|
+
if (argc == 1) {
|
52
|
+
Check_Type(argv[0], T_FIXNUM);
|
53
|
+
delta = NUM2LL(argv[0]);
|
54
|
+
}
|
55
|
+
return method_atomic_fixnum_value_set(self, LL2NUM(value - delta));
|
44
56
|
}
|
45
57
|
|
46
58
|
VALUE method_atomic_fixnum_compare_and_set(VALUE self, VALUE rb_expect, VALUE rb_update) {
|
@@ -48,3 +60,14 @@ VALUE method_atomic_fixnum_compare_and_set(VALUE self, VALUE rb_expect, VALUE rb
|
|
48
60
|
Check_Type(rb_update, T_FIXNUM);
|
49
61
|
return ir_compare_and_set(self, rb_expect, rb_update);
|
50
62
|
}
|
63
|
+
|
64
|
+
VALUE method_atomic_fixnum_update(VALUE self) {
|
65
|
+
VALUE old_value, new_value;
|
66
|
+
for (;;) {
|
67
|
+
old_value = method_atomic_fixnum_value(self);
|
68
|
+
new_value = rb_yield(old_value);
|
69
|
+
if (ir_compare_and_set(self, old_value, new_value) == Qtrue) {
|
70
|
+
return new_value;
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}
|
@@ -6,8 +6,9 @@ VALUE atomic_fixnum_allocate(VALUE);
|
|
6
6
|
VALUE method_atomic_fixnum_initialize(int, VALUE*, VALUE);
|
7
7
|
VALUE method_atomic_fixnum_value(VALUE);
|
8
8
|
VALUE method_atomic_fixnum_value_set(VALUE, VALUE);
|
9
|
-
VALUE method_atomic_fixnum_increment(VALUE);
|
10
|
-
VALUE method_atomic_fixnum_decrement(VALUE);
|
9
|
+
VALUE method_atomic_fixnum_increment(int, VALUE*, VALUE);
|
10
|
+
VALUE method_atomic_fixnum_decrement(int, VALUE*, VALUE);
|
11
11
|
VALUE method_atomic_fixnum_compare_and_set(VALUE, VALUE, VALUE);
|
12
|
+
VALUE method_atomic_fixnum_update(VALUE);
|
12
13
|
|
13
14
|
#endif
|
@@ -49,9 +49,10 @@ void Init_extension() {
|
|
49
49
|
rb_define_method(rb_cAtomicFixnum, "initialize", method_atomic_fixnum_initialize, -1);
|
50
50
|
rb_define_method(rb_cAtomicFixnum, "value", method_atomic_fixnum_value, 0);
|
51
51
|
rb_define_method(rb_cAtomicFixnum, "value=", method_atomic_fixnum_value_set, 1);
|
52
|
-
rb_define_method(rb_cAtomicFixnum, "increment", method_atomic_fixnum_increment,
|
53
|
-
rb_define_method(rb_cAtomicFixnum, "decrement", method_atomic_fixnum_decrement,
|
52
|
+
rb_define_method(rb_cAtomicFixnum, "increment", method_atomic_fixnum_increment, -1);
|
53
|
+
rb_define_method(rb_cAtomicFixnum, "decrement", method_atomic_fixnum_decrement, -1);
|
54
54
|
rb_define_method(rb_cAtomicFixnum, "compare_and_set", method_atomic_fixnum_compare_and_set, 2);
|
55
|
+
rb_define_method(rb_cAtomicFixnum, "update", method_atomic_fixnum_update, 0);
|
55
56
|
rb_define_alias(rb_cAtomicFixnum, "up", "increment");
|
56
57
|
rb_define_alias(rb_cAtomicFixnum, "down", "decrement");
|
57
58
|
}
|
Binary file
|
Binary file
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: concurrent-ruby-ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: x64-mingw32
|
6
6
|
authors:
|
7
7
|
- Jerry D'Antonio
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.9.
|
19
|
+
version: 0.9.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.9.
|
26
|
+
version: 0.9.1
|
27
27
|
description: |2
|
28
28
|
C extensions to optimize the concurrent-ruby gem when running under MRI.
|
29
29
|
Please see http://concurrent-ruby.com for more information.
|