Feature #3621: Add Semaphore to Ruby
http://redmine.ruby-lang.org/issues/show/3621

Author: Ricardo Panaggio
Status: Open, Priority: Normal
Category: ext

Semaphores are very useful synchronization primitives. There's no Semaphore code today that works with trunk AFAIK.

Attached patches contains Semaphore and CountingSemaphore implemented in both Ruby and C. I've adapted Fukumoto's [1] code to Ruby 1.9.3 and ported it do C.

final-semaphore.patch contains the diff between ruby patched with Feature #3620 and my current code, as it share's code with code from that feature request.
final-semaphore+reqs.patch contains the diff from ruby trunk and my current code (with content from Feature #3620).

The C code is ~2 times faster (see [2] for the benchmark's code):

Rehearsal --------------------------------------------------------------
Semaphore(overall)          17.750000   0.030000  17.780000 ( 17.739792)
Semaphore#wait               1.520000   0.000000   1.520000 (  1.516659)
Semaphore#signal             2.670000   0.000000   2.670000 (  2.672494)
Thread::Semaphore(overall)   7.420000   0.000000   7.420000 (  7.403657)
Thread::Semaphore#wait       0.830000   0.000000   0.830000 (  0.831476)
Thread::Semaphore#signal     0.840000   0.000000   0.840000 (  0.833592)
---------------------------------------------------- total: 31.060000sec

I've already sent it to ruby-core for discussion (see ruby-core:31429).

This patch is one of the deliverables of my RubySoC project (slot #17): "Improving Ruby's Synchronization Primitives and Core Libraries" [3,4]

[1] http://www.imasy.or.jp/~fukumoto/ruby/semaphore.rb
[2] http://github.com/panaggio/rubysoc-2010/blob/master/benchmarks/semaphore.rb
[3] http://pastebin.com/viSnfqe6
[4] http://rubysoc.org/projects


----------------------------------------
http://redmine.ruby-lang.org