Created
August 23, 2012 07:57
-
-
Save mrkn/3434046 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ make -C .build test-all TESTS='test_sync.rb' | |
CC = clang | |
LD = ld | |
LDSHARED = clang -dynamiclib | |
CFLAGS = -O0 -march=core2 -mtune=core2 -ggdb -gdwarf-2 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=shorten-64-to-32 -Werror=implicit-function-declaration -fno-common -pipe -arch x86_64 | |
XCFLAGS = -include ruby/config.h -include ruby/missing.h -D_FORTIFY_SOURCE=2 -fstack-protector -fno-strict-overflow -fvisibility=hidden -DRUBY_EXPORT | |
CPPFLAGS = -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -I. -I.ext/include/x86_64-darwin11.4.0 -I../include -I.. | |
DLDFLAGS = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -install_name /Users/kenta-murata/work/ruby.git/.build/../.prefix/lib/libruby.2.0.0.dylib -current_version 2.0.0 -compatibility_version 2.0.0 -Wl,-unexported_symbol,_Init_* -Wl,-unexported_symbol,*_threadptr_* -fstack-protector -Wl,-u,_objc_msgSend -fstack-protector -Wl,-u,_objc_msgSend -arch x86_64 | |
SOLIBS = | |
./miniruby -I../lib -I. -I.ext/common ../tool/runruby.rb --extout=.ext -- --disable-gems "../test/runner.rb" --ruby="./miniruby -I../lib -I. -I.ext/common ../tool/runruby.rb --extout=.ext -- --disable-gems" test_sync.rb | |
Run options: "--ruby=./miniruby -I../lib -I. -I.ext/common ../tool/runruby.rb --extout=.ext -- --disable-gems" | |
# Running tests: | |
[1/1] SyncTest#test_synchronize = 0.51 s | |
1) Failure: | |
test_synchronize(SyncTest) [/Users/kenta-murata/work/ruby.git/test/test_sync.rb:57]: | |
<[#<Thread:0x007f904183aa08 sleep>, | |
#<Thread:0x007f904183ab98 sleep>, | |
#<Thread:0x007f904183af58 sleep>]> expected but was | |
<[#<Thread:0x007f904183aa08 sleep>, | |
#<Thread:0x007f904183ab98 sleep>, | |
#<Thread:0x007f904183af58 sleep>, | |
#<Thread:0x007f904183aa08 sleep>]>. | |
Finished tests in 0.512839s, 1.9499 tests/s, 1.9499 assertions/s. | |
1 tests, 1 assertions, 1 failures, 0 errors, 0 skips | |
ruby -v: ruby 2.0.0dev (2012-08-23 trunk 36795) [x86_64-darwin11.4.0] | |
make: *** [yes-test-all] Error 1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/sync.rb b/lib/sync.rb | |
index bae05a4..c6a7321 100644 | |
--- a/lib/sync.rb | |
+++ b/lib/sync.rb | |
@@ -147,7 +147,7 @@ module Sync_m | |
sync_upgrade_waiting.push [Thread.current, sync_sh_locker[Thread.current]] | |
sync_sh_locker.delete(Thread.current) | |
else | |
- sync_waiting.push Thread.current | |
+ sync_waiting.push Thread.current unless sync_waiting.include? Thread.current | |
end | |
@sync_mutex.sleep | |
end | |
@@ -216,7 +216,7 @@ module Sync_m | |
end | |
end | |
for th in wakeup_threads | |
- th.run | |
+ th.run if th.alive? | |
end | |
self | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'test/unit' | |
require 'sync' | |
require 'timeout' | |
class SyncTest < Test::Unit::TestCase | |
class Tester | |
include Sync_m | |
end | |
def test_synchronize | |
count = 0 | |
while count < 10 | |
tester = Tester.new | |
th1 = Thread.start { | |
tester.sync_lock | |
sleep | |
tester.sync_unlock | |
tester.sync_lock | |
sleep | |
tester.sync_unlock | |
} | |
sleep 0.1 until th1.status.nil? || th1.status == 'sleep' | |
th2 = Thread.start { | |
tester.sync_lock | |
sleep | |
tester.sync_unlock | |
} | |
sleep 0.1 until th2.status == 'sleep' | |
th3 = Thread.start { | |
tester.sync_lock | |
sleep | |
tester.sync_unlock | |
} | |
sleep 0.1 until th3.status == 'sleep' | |
th4 = Thread.start { | |
tester.sync_lock | |
sleep | |
tester.sync_unlock | |
} | |
sleep 0.1 until th4.status == 'sleep' | |
begin | |
Timeout.timeout(5) do | |
th1.run | |
sleep 0.1 until th1.status == 'sleep' | |
sleep 0.1 until th2.status == 'sleep' | |
sleep 0.1 until th3.status == 'sleep' | |
sleep 0.1 until th4.status == 'sleep' | |
end | |
rescue Timeout::Error | |
next | |
end | |
assert_equal(tester.sync_waiting.uniq, tester.sync_waiting) | |
count += 1 | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment