[macruby-changes] [4304] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Jun 29 17:14:09 PDT 2010


Revision: 4304
          http://trac.macosforge.org/projects/ruby/changeset/4304
Author:   ernest.prabhakar at gmail.com
Date:     2010-06-29 17:14:04 -0700 (Tue, 29 Jun 2010)
Log Message:
-----------
Created sample from dispatch README.rdoc

Modified Paths:
--------------
    MacRuby/trunk/lib/dispatch/README.rdoc

Added Paths:
-----------
    MacRuby/trunk/sample-macruby/Scripts/gcd/dispatch_rdoc.rb

Modified: MacRuby/trunk/lib/dispatch/README.rdoc
===================================================================
--- MacRuby/trunk/lib/dispatch/README.rdoc	2010-06-29 01:09:44 UTC (rev 4303)
+++ MacRuby/trunk/lib/dispatch/README.rdoc	2010-06-30 00:14:04 UTC (rev 4304)
@@ -371,7 +371,7 @@
 	@events = []
 	mask2 = [:exit, :fork, :exec, signal]
 	proc_src2 = Dispatch::Source.process($$, mask2) do |s|
-	   |s| @events << Dispatch::Source.data2events(s.data)
+		|s| @events << Dispatch::Source.data2events(s.data)
 	end
 
 ==== Source.process Example
@@ -445,14 +445,14 @@
 
 	@fevent = 0
 	@msg = "#{$$}-#{Time.now.to_s.gsub(' ','_')}"
-    filename = "/tmp/dispatch-#{@msg}"
+	filename = "/tmp/dispatch-#{@msg}"
 	file = File.open(filename, "w")
 	fmask = Dispatch::Source::VNODE_DELETE | Dispatch::Source::Source.VNODE_WRITE
 	file_src = Dispatch::Source.file(file.fileno, fmask) do |s|
 		@fevent |= s.data
 	end
-    file.puts @msg
-    file.flush
+	file.puts @msg
+	file.flush
 	file.close
 	puts @fevent & fmask # => Dispatch::Source::Source.VNODE_WRITE
 	File.delete(filename)
@@ -467,8 +467,8 @@
 	file_src2 = Dispatch::Source.file(file, fmask2) do |s|
 		@fevent2 << Dispatch::Source.data2events(s.data)
 	end
-    file.puts @msg
-    file.flush
+	file.puts @msg
+	file.flush
 	puts @fevent2 & fmask2 # => [:write]
 	file_src2.cancel!
 	
@@ -478,13 +478,13 @@
 
 In contrast to the previous sources, these next two refer to internal state rather than external events. Specifically, this +add+-style source avoids blocking on a +read+ by only calling the handler when it estimates there are +s.data+ unread bytes available in the buffer:  
 
-    file = File.open(filename, "r")
-    @result = ""
-    reader = Dispatch::Source.read(file) do |s|
+	file = File.open(filename, "r")
+	@result = ""
+	reader = Dispatch::Source.read(file) do |s|
  		@result << @file.read(s.data)
 	end
-    while (@result.size < @msg.size) do; end
-    puts @result # => e.g., 489-Wed_Mar_24_15:59:00_-0700_2010
+	while (@result.size < @msg.size) do; end
+	puts @result # => e.g., 489-Wed_Mar_24_15:59:00_-0700_2010
 	reader.cancel!
 
 Strictly speaking, the count returned by +s.data+ is only an estimate. It would be safer to instead call + at file.read(1)+ to avoid any risk of blocking, but that would lead to many more block invocations, which might not be a net win.
@@ -493,18 +493,18 @@
 
 This +add+-style event is similar to the above, but waits until a +write+ buffer is available:
 
-    file = File.open(filename, "w")
-    @message = @msg
-    writer = Dispatch::Source.write(file) do |s|
-      if @message.size > 0 then
-        char = @message[0..0]
-        @file.write(char)
-        @message = @message[1..-1]
-      end
-    end
-    while (@message.size > 0) do; end
-    result = File.read(filename)
-    puts result # => e.g., 489-Wed_Mar_24_15:59:00_-0700_2010
+	file = File.open(filename, "w")
+	@message = @msg
+	writer = Dispatch::Source.write(file) do |s|
+	  if @message.size > 0 then
+		char = @message[0..0]
+		@file.write(char)
+		@message = @message[1..-1]
+	  end
+	end
+	while (@message.size > 0) do; end
+	result = File.read(filename)
+	puts result # => e.g., 489-Wed_Mar_24_15:59:00_-0700_2010
 
 In this case we play it safe by only writing out a single character at a time, to avoid risk of blocking (and simplify our algorithm).
 

Added: MacRuby/trunk/sample-macruby/Scripts/gcd/dispatch_rdoc.rb
===================================================================
--- MacRuby/trunk/sample-macruby/Scripts/gcd/dispatch_rdoc.rb	                        (rev 0)
+++ MacRuby/trunk/sample-macruby/Scripts/gcd/dispatch_rdoc.rb	2010-06-30 00:14:04 UTC (rev 4304)
@@ -0,0 +1,150 @@
+#!/usr/bin/env macruby
+
+require 'dispatch'
+job = Dispatch::Job.new { Math.sqrt(10**100) }
+ at result = job.value
+puts @result.to_int.to_s.size # => 51
+
+job.value {|v| p v.to_int.to_s.size } # => 51 (eventually)
+job.join
+puts "All Done"
+
+job.join { puts "All Done" }
+job.add { Math.sqrt(2**64) }
+ at values = job.values 
+puts @values # => [1.0E50, 4294967296.0]
+job = Dispatch::Job.new
+ at hash = job.synchronize {}
+puts @hash.class # => Dispatch::Proxy
+
+puts job.values.class # => Dispatch::Proxy
+
+ at hash[:foo] = :bar
+puts @hash.to_s  # => "{:foo=>:bar}"
+
+
+[64, 100].each do |n|
+job << { @hash[n] = Math.sqrt(10**n) }
+end
+puts @hash.inspect # => {64 => 1.0E32, 100 => 1.0E50}
+
+ at hash.inspect { |s| p s } # => {64 => 1.0E32, 100 => 1.0E50}
+delegate = @hash.__value__
+puts delegate.class # => Hash
+
+n = 42
+job = Dispatch::Job.new { p n }
+job.join # => 42
+
+n = 0
+job = Dispatch::Job.new { n = 42 }
+job.join
+p n # => 0 
+n = 0
+job = Dispatch::Job.new { n += 42 }
+job.join
+p n # => 0 
+5.p_times { |i| puts 10**i } # => 1  100 1000 10 10000 
+
+5.p_times(3) { |i| puts 10**i } # =>1000 10000 1 10 100 
+%w(Mon Tue Wed Thu Fri).p_each { |day| puts day} # => Mon Wed Thu Tue Fri
+%w(Mon Tue Wed Thu Fri).p_each(3) { |day| puts day} # =>  Thu Fri Mon Tue Wed
+%w(Mon Tue Wed Thu Fri).p_each { |day, i | puts "#{i}:#{day}"} # => 0:Mon 2:Wed 3:Thu 1:Tue 4:Fri
+%w(Mon Tue Wed Thu Fri).p_each(3) { |day, i | puts "#{i}:#{day}"} # => 3:Thu 4:Fri 0:Mon 1:Tue 2:Wed 
+(0..4).p_map { |i| 10**i } # => [1, 1000, 10, 100, 10000]
+(0..4).p_map(3) { |i| 10**i } # => [1000, 10000, 1, 10, 100]
+(0..4).p_mapreduce(0) { |i| 10**i } # => 11111
+This uses a parallel +inject+ (formerly known as +reduce+) to return a single value by combining the result of +map+. Unlike +inject+, you must specify an explicit initial value as the first parameter. The default accumulator is ":+", but you can specify a different symbol to +send+:
+(0..4).p_mapreduce([], :concat) { |i| [10**i] } # => [1, 1000, 10, 100, 10000]
+
+(0..4).p_mapreduce([], :concat, 3) { |i| [10**i] } # => [1000, 10000, 1, 10, 100]
+(0..4).p_findall { |i| i.odd?} # => {3, 1}
+(0..4).p_findall(3) { |i| i.odd?} # => {3, 1}
+
+(0..4).p_findall { |i| i == 5 } # => nil
+(0..4).p_findall { |i| i.odd?} # => 1
+(0..4).p_findall(3) { |i| i.odd?} # => 3
+
+timer = Source.periodic(0.9) { |src| puts src.data }
+sleep 2 # => 1 1 ...
+
+timer.suspend!
+sleep 2
+timer.resume!
+sleep 2 # => 2 1 ...
+timer.cancel!
+ at sum = 0
+adder = Dispatch::Source.add { |s| @sum += s.data;  }
+adder << 1 # => "add 1 -> 1"
+adder.suspend!
+adder << 3
+adder << 5
+adder.resume! # => "add 8 -> 9"
+adder.cancel!
+ at mask = 0
+masker = Dispatch::Source.or { |s| @mask |= s.data }
+masker.suspend!
+masker << 0b0011
+masker << 0b1010
+masker.resume!
+puts  "%b" % @mask # => 1011
+masker.cancel!
+ at event = 0
+mask = Dispatch::Source::PROC_EXIT | Dispatch::Source::PROC_SIGNAL 
+proc_src = Dispatch::Source.process($$, mask) do |s|
+ at event |= s.data
+end
+
+
+ at events = []
+mask2 = [:exit, :fork, :exec, signal]
+proc_src2 = Dispatch::Source.process($$, mask2) do |s|
+   |s| @events << Dispatch::Source.data2events(s.data)
+end
+sig_usr1 = Signal.list["USR1"]
+Signal.trap(sig_usr1, "IGNORE")
+Process.kill(sig_usr1, $$)
+Signal.trap(sig_usr1, "DEFAULT")
+result = "%b" % (@event & mask) # => 1000000000000000000000000000 # Dispatch::Source::PROC_SIGNAL
+proc_src.cancel!
+result2 = (@events & mask2) # => [:signal]
+proc_src2.cancel!
+puts result == Dispatch::Source#event2num(result2[0]) # => true
+put result2[0] == Dispatch::Source#num2event(result) # => true
+ at count = 0
+sig_usr2 = Signal.list["USR2"]
+signal = Dispatch::Source.signal(sig_usr2) do |s|
+ at count += s.data
+end
+signal.suspend!
+Signal.trap(sig_usr2, "IGNORE")
+3.times { Process.kill(sig_usr2, $$) }
+Signal.trap(sig_usr2, "DEFAULT")
+signal.resume!
+puts @count # => 3
+signal.cancel!
+ at fevent = 0
+ at msg = "#{$$}-#{Time.now.to_s.gsub(' ','_')}"
+file = File.open(filename, "w")
+fmask = Dispatch::Source::VNODE_DELETE | Dispatch::Source::Source.VNODE_WRITE
+file_src = Dispatch::Source.file(file.fileno, fmask) do |s|
+ at fevent |= s.data
+end
+file.close
+puts @fevent & fmask # => Dispatch::Source::Source.VNODE_WRITE
+File.delete(filename)
+puts @fevent == fmask # => true
+file_src.cancel!
+
+ at fevent2 = []
+file = File.open(filename, "w")
+fmask2 = %w(delete write)
+file_src2 = Dispatch::Source.file(file, fmask2) do |s|
+ at fevent2 << Dispatch::Source.data2events(s.data)
+end
+puts @fevent2 & fmask2 # => [:write]
+file_src2.cancel!
+
+ @result << @file.read(s.data)
+end
+reader.cancel!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100629/d8ac1031/attachment.html>


More information about the macruby-changes mailing list