thread_order 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +15 -3
- data/Readme.md +9 -0
- data/lib/thread_order.rb +2 -0
- data/lib/thread_order/mutex.rb +60 -0
- data/lib/thread_order/version.rb +3 -0
- data/spec/run +58 -0
- data/spec/thread_order_spec.rb +9 -5
- data/thread_order.gemspec +5 -3
- metadata +10 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2d68b153c8a232b3fdcb3efc2ec6799abf9e11a
|
4
|
+
data.tar.gz: 5f340011a9259a523b6fa3dca0494ad8f17887aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6247a9d7f485371a1725e7098a2dde38b4376a822ecfcb6ea7a69c36d8a1abc7d60bded9f12c3c5297bd635c05e4c87c271bc73054f19724068e2f2a62ed979c
|
7
|
+
data.tar.gz: 988632f09cc15d15fa705e87a561d86b26c8f5f079df692c8d288865cd578674f1db67371e8363e08e66adc59ce778b6bdc3a91ea9e74a9cc7de2f126c828591
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,8 +1,20 @@
|
|
1
1
|
language: ruby
|
2
|
-
script:
|
2
|
+
script: spec/run
|
3
3
|
rvm:
|
4
|
+
- 1.8.7
|
5
|
+
- 1.9.2
|
4
6
|
- 1.9.3
|
5
7
|
- 2.0.0
|
6
|
-
- 2.1
|
7
|
-
- 2.2
|
8
|
+
- 2.1
|
9
|
+
- 2.2
|
8
10
|
- ruby-head
|
11
|
+
- ree
|
12
|
+
- jruby-18mode
|
13
|
+
- jruby
|
14
|
+
- jruby-head
|
15
|
+
- rbx
|
16
|
+
matrix:
|
17
|
+
include:
|
18
|
+
- rvm: jruby
|
19
|
+
env: JRUBY_OPTS='--2.0'
|
20
|
+
fast_finish: true
|
data/Readme.md
CHANGED
@@ -1,2 +1,11 @@
|
|
1
|
+
[![Build Status](https://travis-ci.org/JoshCheek/thread_order.svg)](https://travis-ci.org/JoshCheek/thread_order)
|
2
|
+
|
1
3
|
ThreadOrder
|
2
4
|
===========
|
5
|
+
|
6
|
+
A tool for testing threaded code.
|
7
|
+
Its purpose is to enable reasoning about thread order.
|
8
|
+
|
9
|
+
* Tested on 1.8.7 - 2.2, JRuby, Rbx
|
10
|
+
* It has no external dependencies
|
11
|
+
* It does not depend on the stdlib.
|
data/lib/thread_order.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
# On > 1.9, this is in core.
|
2
|
+
# On 1.8.7, it's in the stdlib.
|
3
|
+
# We don't want to load the stdlib, b/c this is a test tool, and can affect the test environment,
|
4
|
+
# causing tests to pass where they should fail.
|
5
|
+
#
|
6
|
+
# So we're transcribing it here, from.
|
7
|
+
# It is based on this implementation: https://github.com/ruby/ruby/blob/v1_8_7_374/lib/thread.rb#L56
|
8
|
+
# If it's not already defined. Some methods we don't need are deleted.
|
9
|
+
# Anything I don't understand is left in.
|
10
|
+
class ThreadOrder
|
11
|
+
Mutex = if defined? ::Mutex
|
12
|
+
::Mutex
|
13
|
+
else
|
14
|
+
Class.new do
|
15
|
+
def initialize
|
16
|
+
@waiting = []
|
17
|
+
@locked = false;
|
18
|
+
@waiting.taint # enable tainted comunication
|
19
|
+
self.taint
|
20
|
+
end
|
21
|
+
|
22
|
+
def lock
|
23
|
+
while (Thread.critical = true; @locked)
|
24
|
+
@waiting.push Thread.current
|
25
|
+
Thread.stop
|
26
|
+
end
|
27
|
+
@locked = true
|
28
|
+
Thread.critical = false
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
def unlock
|
33
|
+
return unless @locked
|
34
|
+
Thread.critical = true
|
35
|
+
@locked = false
|
36
|
+
begin
|
37
|
+
t = @waiting.shift
|
38
|
+
t.wakeup if t
|
39
|
+
rescue ThreadError
|
40
|
+
retry
|
41
|
+
end
|
42
|
+
Thread.critical = false
|
43
|
+
begin
|
44
|
+
t.run if t
|
45
|
+
rescue ThreadError
|
46
|
+
end
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
def synchronize
|
51
|
+
lock
|
52
|
+
begin
|
53
|
+
yield
|
54
|
+
ensure
|
55
|
+
unlock
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/spec/run
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# do this stuff in a tmp dir
|
4
|
+
cd "$(dirname "$0")/.."
|
5
|
+
project_root=`pwd`
|
6
|
+
mkdir -p tmp
|
7
|
+
cd tmp
|
8
|
+
|
9
|
+
# this is basically a shitty version of `gem unpack`
|
10
|
+
get_gem() {
|
11
|
+
name="$1"
|
12
|
+
url="$2"
|
13
|
+
|
14
|
+
if test -d "$name"
|
15
|
+
then
|
16
|
+
echo "Skipping download of $name"
|
17
|
+
return
|
18
|
+
else
|
19
|
+
echo "Downloading $name"
|
20
|
+
fi
|
21
|
+
|
22
|
+
mkdir "$name" &&
|
23
|
+
cd "$name" &&
|
24
|
+
curl -L "$url" > "$name".gem &&
|
25
|
+
tar -xf "$name".gem &&
|
26
|
+
gunzip data.tar.gz &&
|
27
|
+
tar -xf data.tar &&
|
28
|
+
cd ..
|
29
|
+
}
|
30
|
+
|
31
|
+
# download dependencies
|
32
|
+
get_gem "rspec" "https://rubygems.org/downloads/rspec-3.2.0.gem" &&
|
33
|
+
get_gem "rspec-core" "https://rubygems.org/downloads/rspec-core-3.2.1.gem" &&
|
34
|
+
get_gem "rspec-support" "https://rubygems.org/downloads/rspec-support-3.2.2.gem" &&
|
35
|
+
get_gem "rspec-expectations" "https://rubygems.org/downloads/rspec-expectations-3.2.0.gem" &&
|
36
|
+
get_gem "rspec-mocks" "https://rubygems.org/downloads/rspec-mocks-3.2.1.gem" &&
|
37
|
+
get_gem "diff-lcs" "https://rubygems.org/downloads/diff-lcs-1.2.5.gem"
|
38
|
+
|
39
|
+
|
40
|
+
# run specs
|
41
|
+
cd $project_root
|
42
|
+
|
43
|
+
export PATH="$project_root/tmp/rspec-core/exe:$PATH"
|
44
|
+
|
45
|
+
opts=""
|
46
|
+
opts=" -I $project_root/tmp/diff-lcs/lib $opts"
|
47
|
+
opts=" -I $project_root/tmp/rspec/lib $opts"
|
48
|
+
opts=" -I $project_root/tmp/rspec-core/lib $opts"
|
49
|
+
opts=" -I $project_root/tmp/rspec-expectations/lib $opts"
|
50
|
+
opts=" -I $project_root/tmp/rspec-mocks/lib $opts"
|
51
|
+
opts=" -I $project_root/tmp/rspec-support/lib $opts"
|
52
|
+
|
53
|
+
if `ruby -e "exit RUBY_VERSION != '1.8.7'"`
|
54
|
+
then
|
55
|
+
opts="--disable-gems $opts"
|
56
|
+
fi
|
57
|
+
|
58
|
+
ruby $opts -S rspec
|
data/spec/thread_order_spec.rb
CHANGED
@@ -102,12 +102,16 @@ RSpec.describe ThreadOrder do
|
|
102
102
|
expect(thread_names).to eq [:a, nil]
|
103
103
|
end
|
104
104
|
|
105
|
-
|
105
|
+
it 'is implemented without depending on the stdlib' do
|
106
106
|
loaded_filenames = $LOADED_FEATURES.map { |filepath| File.basename filepath }
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
107
|
+
begin
|
108
|
+
expect(loaded_filenames).to_not include 'monitor.rb'
|
109
|
+
expect(loaded_filenames).to_not include 'thread.rb'
|
110
|
+
expect(loaded_filenames).to_not include 'thread.bundle'
|
111
|
+
rescue RSpec::Expectations::ExpectationNotMetError
|
112
|
+
pending if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' # somehow this still gets loaded in some JRubies
|
113
|
+
raise
|
114
|
+
end
|
111
115
|
end
|
112
116
|
|
113
117
|
describe 'incorrect interface usage' do
|
data/thread_order.gemspec
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
require_relative 'lib/thread_order/version'
|
2
|
+
|
1
3
|
Gem::Specification.new do |s|
|
2
4
|
s.name = 'thread_order'
|
3
|
-
s.version =
|
5
|
+
s.version = ThreadOrder::VERSION
|
4
6
|
s.licenses = ['MIT']
|
5
|
-
s.summary = "Test helper for ordering threaded code
|
6
|
-
s.description = "Test helper for ordering threaded code (does not depend on stdlib)."
|
7
|
+
s.summary = "Test helper for ordering threaded code"
|
8
|
+
s.description = "Test helper for ordering threaded code (does not depend on gems or stdlib, tested on 1.8.7 - 2.2)."
|
7
9
|
s.authors = ["Josh Cheek"]
|
8
10
|
s.email = 'josh.cheek@gmail.com'
|
9
11
|
s.files = `git ls-files`.split("\n")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thread_order
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Cheek
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -24,7 +24,8 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.0'
|
27
|
-
description: Test helper for ordering threaded code (does not depend on stdlib
|
27
|
+
description: Test helper for ordering threaded code (does not depend on gems or stdlib,
|
28
|
+
tested on 1.8.7 - 2.2).
|
28
29
|
email: josh.cheek@gmail.com
|
29
30
|
executables: []
|
30
31
|
extensions: []
|
@@ -36,6 +37,9 @@ files:
|
|
36
37
|
- License.txt
|
37
38
|
- Readme.md
|
38
39
|
- lib/thread_order.rb
|
40
|
+
- lib/thread_order/mutex.rb
|
41
|
+
- lib/thread_order/version.rb
|
42
|
+
- spec/run
|
39
43
|
- spec/thread_order_spec.rb
|
40
44
|
- thread_order.gemspec
|
41
45
|
homepage: https://github.com/JoshCheek/thread_order
|
@@ -58,10 +62,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
58
62
|
version: '0'
|
59
63
|
requirements: []
|
60
64
|
rubyforge_project:
|
61
|
-
rubygems_version: 2.4.
|
65
|
+
rubygems_version: 2.4.5
|
62
66
|
signing_key:
|
63
67
|
specification_version: 4
|
64
|
-
summary: Test helper for ordering threaded code
|
68
|
+
summary: Test helper for ordering threaded code
|
65
69
|
test_files:
|
70
|
+
- spec/run
|
66
71
|
- spec/thread_order_spec.rb
|
67
72
|
has_rdoc:
|