[#5218] Ruby Book Eng tl, ch1 question — Jon Babcock <jon@...>
From: Jon Babcock <jon@kanji.com>
Thanks.
From: Jon Babcock <jon@kanji.com>
Ah, thanks, I think I get it, a slightly different nuance then.
From: Jon Babcock <jon@kanji.com>
'Because all of Ruby has been...' -> 'Because Ruby has been...'?
[#5221] better way to say 'recursive join' — Yasushi Shoji <yashi@...>
in [ruby-dev:6289], Shugo Maeda suggested better name for recursive
[#5240] Ruby for Win32/DOS — Dennis Newbold <dennisn@...>
Not all of us are blessed with the opportunity to be able to develop on
[#5254] problem: undefined method `size' for File — "葡ic Santonacci" <Eric.Santonacci@...>
Hi all,
HI,
[#5264] Re: problem: undefined method `size' for Fil e — Aleksi Niemel<aleksi.niemela@...>
matz critizes good solution argumenting with features lacking from some
[#5268] Proper ConditionVariable usage? — Aleksi Niemel<aleksi.niemela@...>
Abstract
On Wed, 04 Oct 2000 07:05:22 +0900, Aleksi Niemelwrote:
In message <20001004110040.A26666@xs4all.nl>
Hi,
[#5276] Re: Ruby Book Eng tl, ch1 question — schneik@...
[#5310] Errata for Ruby Book? — Jon Babcock <jon@...>
[#5318] Redefining super method as singleton? — Robert Feldt <feldt@...>
On Fri, 6 Oct 2000, Yukihiro Matsumoto wrote:
[#5329] Ruby vs PHP ? — "Valerio Bamberga" <bamberga@...>
Hi!
[#5331] Unit testing network code? — Hugh Sasse Staff Elec Eng <hgs@...>
Can someone give me pointers on how to Unit Test code that is run on
> I think maybe one would test each end on its own first, faking the
[#5335] string streams in Ruby? — Hugh Sasse Staff Elec Eng <hgs@...>
Is there any way, without going through "modifying the internals",
[#5346] Is Ruby "enough better"? — Gabriel Lima <Gabriel.Lima@...>
Hi.
[#5364] Allowing *ary's in the middle of a camma separated list — "Akinori MUSHA" <knu@...>
Hi,
Hi,
At Tue, 10 Oct 2000 14:17:24 +0900,
[#5404] Object.foo, setters and so on — "Hal E. Fulton" <hal9000@...>
OK, here is what I think I know.
At Wed, 11 Oct 2000 11:37:25 +0900,
Hi,
Hi,
Hi,
Hi,
[#5425] Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — Jon Babcock <jon@...>
At Thu, 12 Oct 2000 03:49:46 +0900,
Thanks for the input.
At Thu, 12 Oct 2000 04:53:41 +0900,
At Thu, 12 Oct 2000 07:25:03 +0900,
oops, I didn't read this one before I went out for food..
At Thu, 12 Oct 2000 09:59:19 +0900,
[#5437] Editor recommandations? — "Chris Morris" <chrismo@...>
Any recommendations on editors for Ruby script on Windows?
[#5471] 2 ideas from Haskell — Mark Slagell <ms@...>
Do either of these interest anyone:
[#5479] Some newbye question — Davide Marchignoli <marchign@...>
I am reading the documentation I found about ruby but several points
[#5480] InstallShield version for Ruby soon... — andy@... (Andrew Hunt)
Okay folks,
[#5489] Regexp#matches — Aleksi Niemel<aleksi.niemela@...>
Would someone object aliasing matches for match in Regexp?
[#5505] Sorry, What is Ruby Book — Mansuriatus Shahrir Amir <chioque@...>
Sorry if this information is somewhere obvious. I just stumbled upon
[#5516] Re: Some newbye question — ts <decoux@...>
>>>>> "D" == Davide Marchignoli <marchign@di.unipi.it> writes:
Hi,
On Sat, 14 Oct 2000, Yukihiro Matsumoto wrote:
matz@zetabits.com (Yukihiro Matsumoto) writes:
Dave Thomas <Dave@thomases.com> wrote:
Hi,
> Proposal a and b have incompatibility. I'm not sure it's worth it.
>>>>> "Y" == Yukihiro Matsumoto <matz@zetabits.com> writes:
On Mon, 16 Oct 2000, ts wrote:
>>>>> "Y" == Yukihiro Matsumoto <matz@zetabits.com> writes:
[#5558] GC: malloc_memories — Mathieu Bouchard <matju@...>
Hi,
> |precipitate a new GC cycle if lots of resizing is done. My biggest
[#5570] Notes about GC — Mathieu Bouchard <matju@...>
[#5600] passing single or multiple strings. — Hugh Sasse Staff Elec Eng <hgs@...>
With multple assignments I can get nested arrays "shelled" (like peas)
In message "[ruby-talk:5600] passing single or multiple strings."
[#5603] debug command list in English — "Morris, Chris" <ChrisM@...>
I found this page which lists the interactive debugger commands ... anyone
[#5619] lint? — "Swit" <swit@...>
Is there something like lint for Ruby? I'd like to find NameErrors before
[#5705] Dynamic languages, SWOT ? — Hugh Sasse Staff Elec Eng <hgs@...>
There has been discussion on this list/group from time to time about
Hugh Sasse Staff Elec Eng wrote:
On Sat, 21 Oct 2000, Charles Hixson wrote:
[#5715] Help: sockets broken — jason petrone <jp@...>
I just compiled ruby 1.6.1 on an openbsd 2.6 machine(x86).
[#5716] Re: Array#insert — Aleksi Niemel<aleksi.niemela@...>
> From: jweirich@one.net [mailto:jweirich@one.net]
[#5727] String#slice surprise — "Guy N. Hurst" <gnhurst@...>
Hi,
Dave Thomas wrote:
[#5787] Shells and Ruby — "Dat Nguyen" <thucdat@...>
Hello all,
[#5850] Re: Array#insert rehashed — Aleksi Niemel<aleksi.niemela@...>
Dave asks for:
[#5862] succ but no pred? (& the MURKY award) — "Hal E. Fulton" <hal9000@...>
First of all, a serious question:
[#5873] Integer(String) weirdness for a ruby newbie — Stoned Elipot <Stoned.Elipot@...>
Hi,
[#5881] Q:what about "Programming Ruby"? — Gabriel Lima <Gabriel.Lima@...>
Hi to you all.
[#5882] [RFC] Towards a new synchronisation primitive — hipster <hipster@...4all.nl>
Hello fellow rubyists,
On Fri, 27 Oct 2000, hipster wrote:
[#5947] Hash.new {block} / Hash#default_proc{,_set} — "Brian F. Feldman" <green@...>
I've done very little testing, but I think I've successfully implemented the
[ruby-talk:5765] Queue flawed!?
Hi,
Since no one has answered my Q on Queue I went ahead and asked the
interpreter. If the script below isn't flawed, running it seems to show
that Queue is flawed. I wrote a thread safe variant (TsQueue) and throwed
in a variant with arbitrary object and thread dispatching
(TsDispatchedQueue) while I was at it. I hope this can help eliminate bugs
in thread.rb.
If there are any flaws in the script so that my results aren't valid or
if you get different results when running the script I'd
appreciate if you send me a note.
Here's the output when I run the script:
bash-2.04$ ruby -v queue_bug.rb
ruby 1.6.1 (2000-09-27) [i686-cygwin]
Queue (3 ThreadErrors, 12 errors) one of which is
ERROR: expected 0 but got 1.
TsQueue OK. (0 errors, 0 ThreadErrors)
TsDispatchedQueue OK. (0 errors, 0 ThreadErrors)
Regards,
Robert
queue_bug.rb:
require 'thread'
def some(ary, &b)
ary.each {|e|
if b.call(e)
return true
end
}
false
end
class TsQueue < Queue
def initialize
super
@mutex = Mutex.new
@dispatched_objects = {} # Maps thread ids to popped object
end
def push(obj)
@mutex.lock
begin
@que.push obj
if @waiting.length > 0
t = @waiting.shift
t.wakeup
@dispatched_objects[t.id] = @que.shift
end
ensure
@mutex.unlock
end
end
def pop(non_block=false)
@mutex.lock
unlocked = false
begin
if @que.length > 0
return @que.shift
else
if non_block
raise ThreadError, "queue empty"
end
@waiting.push Thread.current
@mutex.unlock
unlocked = true
Thread.stop
@mutex.lock
obj = @dispatched_objects.delete(Thread.current.id)
@mutex.unlock
return obj
end
ensure
@mutex.unlock unless unlocked
end
end
end
# Dispatchers map ([objs],get_prio) -> [obj, [objs]] were the first
# result are the dispatched object and the second result are the
# remaining objects. The proc 'get_prio' maps an object to its priority.
FIFO = proc{ |objs,gp| [objs[0], objs[1..-1]] }
LIFO = proc{ |objs,gp| [objs[-1], objs[0..-2]] }
HighestPriority = proc{ |objs,get_prio|
# NOTE: The sort is not garantueed to preserve the ordering of elements
# with the same priority. Define your own sorting dispatcher if you need
# that!
sorted_objs = objs.sort {|o1,o2| get_prio.call(o2) <=>
get_prio.call(o1)}
FIFO.call(sorted_objs,get_prio)
}
LowestPriority = proc{ |objs,get_prio|
# NOTE: The sort is not garantueed to preserve the ordering of elements
# with the same priority. Define your own sorting dispatcher if you need
# that!
sorted_objs = objs.sort {|o1,o2| get_prio.call(o1) <=>
get_prio.call(o2)}
FIFO.call(sorted_objs,get_prio)
}
class TsDispatchedQueue < TsQueue
def initialize(objectdispatcher = FIFO, threaddispatcher = FIFO,
get_prio = proc{|e| e[0]})
super()
@get_prio, @odisp, @tdisp = get_prio, objectdispatcher,
threaddispatcher
end
def push(obj, prio=0)
@mutex.lock
begin
@que.push [prio, obj]
if @waiting.length > 0
(p, t), @waiting = @tdisp.call(@waiting, @get_prio)
t.wakeup
(p, @dispatched_objects[t.id]), @que = @odisp.call(@que,
@get_prio)
end
ensure
@mutex.unlock
end
end
# Arg can be either:
# Numeric => priority of waiting thread, Blocking call
# true => Non-blocking call
# other => priority is 0, Blocking call
def pop(arg=nil)
@mutex.lock
unlocked = false
if true == arg
non_blocking = true
else
non_blocking = false
prio = (arg.kind_of?(Numeric) ? arg : 0)
end
begin
if @que.length > 0
(p, obj), @que = @odisp.call(@que, @get_prio)
return obj
else
if non_blocking
raise ThreadError, "queue empty"
end
@waiting.push [prio, Thread.current]
@mutex.unlock
unlocked = true
Thread.stop
@mutex.lock
obj = @dispatched_objects.delete(Thread.current.id)
@mutex.unlock
return obj
end
ensure
@mutex.unlock unless unlocked
end
end
end
[Queue, TsQueue, TsDispatchedQueue].each do |qclass|
print "#{qclass.inspect} "
num_tests = 0
errors = []
num_thread_errors = 0
(2..10).each do |num_threads|
10.times do
num_tests += 1
q = qclass.new
threads = Array.new
num_threads.times do |i|
threads.push(Thread.new { q.pop })
while(!threads.last.stop?)
Thread.pass
end
end
begin
num_threads.times {|i| q.push i}
num_threads.times {|i|
if i != threads[i].value
errors.push "ERROR: expected #{i} but got #{threads[i].value}."
end
}
rescue ThreadError
num_thread_errors += 1
end
end
end
if errors.length > 0 or num_thread_errors > 0
print "(#{num_thread_errors} ThreadErrors, #{errors.length}
errors) one of which is\n #{errors[0]}\n"
else
print "OK. (#{errors.length} errors, #{num_thread_errors}
ThreadErrors)\n"
end
end