[#48729] [ANN] ruby 2.0.0-preview1 released — Yusuke Endoh <mame@...>
Japanese later; 日本語はあとで
Hi,
Hello Vit,
2012/11/6 Yusuke Endoh <[email protected]>
[#48745] [ruby-trunk - Bug #7267][Open] Dir.glob on Mac OS X returns unexpected string encodings for unicode file names — "kennygrant (Kenny Grant)" <kennygrant@...>
[#48773] [ruby-trunk - Bug #7269][Open] Refinement doesn't work if using locate after method — "ko1 (Koichi Sasada)" <redmine@...>
(2012/11/03 10:11), headius (Charles Nutter) wrote:
(2012/11/03 10:36), SASADA Koichi wrote:
[#48774] [ruby-trunk - Feature #4085] Refinements and nested methods — "shugo (Shugo Maeda)" <redmine@...>
[#48819] [ruby-trunk - Feature #4085] Refinements and nested methods — "headius (Charles Nutter)" <headius@...>
[#48820] [ruby-trunk - Bug #7271][Assigned] Refinement doesn't seem lexical — "ko1 (Koichi Sasada)" <redmine@...>
[#48847] [ruby-trunk - Bug #7274][Open] UnboundMethods should be bindable to any object that is_a?(owner of the UnboundMethod) — "rits (First Last)" <redmine@...>
[#48882] [ruby-trunk - Feature #4085] Refinements and nested methods — "headius (Charles Nutter)" <headius@...>
[#48964] [Backport93 - Backport #7285][Assigned] some failures on RubyInstaller CI — "usa (Usaku NAKAMURA)" <usa@...>
[#48988] [ruby-trunk - Feature #7292][Open] Enumerable#to_h — "marcandre (Marc-Andre Lafortune)" <ruby-core@...>
[#48997] [ruby-trunk - Feature #7297][Open] map_to alias for each_with_object — "nathan.f77 (Nathan Broadbent)" <nathan.f77@...>
[#49018] [ruby-trunk - Feature #7299][Open] Ruby should not completely ignore blocks. — "marcandre (Marc-Andre Lafortune)" <ruby-core@...>
[#49078] Re: [ruby-cvs:44714] marcandre:r37544 (ruby_1_9_3): merge revisions r33453, r37542: — "U.Nakamura" <usa@...>
Hello,
[#49119] ID_ALLOCATOR ? — Roger Pack <rogerdpack2@...>
Hello.
Can I see ruby-prof code?
On Fri, Nov 9, 2012 at 11:14 AM, SASADA Koichi <[email protected]> wrote:
[#49196] [ruby-trunk - Feature #7322][Open] Add a new operator name #>< for bit-wise "exclusive or" — "alexeymuranov (Alexey Muranov)" <redmine@...>
[#49211] [ruby-trunk - Feature #7328][Open] Move ** operator precedence under unary + and - — "boris_stitnicky (Boris Stitnicky)" <boris@...>
[#49256] [ruby-trunk - Feature #7336][Open] Flexiable OPerator Precedence — "trans (Thomas Sawyer)" <transfire@...>
[#49267] [ruby-trunk - Feature #7340][Open] 'each_with' or 'into' alias for 'each_with_object' — "nathan.f77 (Nathan Broadbent)" <nathan.f77@...>
[#49268] [ruby-trunk - Feature #7341][Open] Enumerable#associate — "nathan.f77 (Nathan Broadbent)" <nathan.f77@...>
[#49282] Re: [ruby-cvs:44801] tenderlove:r37631 (trunk): * probes.d: add DTrace probe declarations. — "U.Nakamura" <usa@...>
Hello,
Hello,
2012/11/13 U.Nakamura <[email protected]>:
[#49298] [ruby-trunk - Feature #7346][Open] object(...) as syntax sugar for object.call(...) — "rosenfeld (Rodrigo Rosenfeld Rosas)" <rr.rosas@...>
[#49320] [ruby-trunk - Feature #4085] Refinements and nested methods — "headius (Charles Nutter)" <headius@...>
[#49328] [ruby-trunk - Bug #7349][Open] Struct#inspect needs more meaningful output — "postmodern (Hal Brodigan)" <postmodern.mod3@...>
[#49340] bugs.ruby-lang.org - 500 error — Luis Lavena <luislavena@...>
Hello,
I've been unable to access it since morning EET (about 6 hours now).
It's almost 3am in Japan now, don't forget.
On Wed, Nov 14, 2012 at 2:46 PM, Zachary Scott <[email protected]> w=
[#49354] review open pull requests on github — Zachary Scott <zachary@...>
Could we get a review on any open pull requests on github before the
2012/11/15 Zachary Scott <[email protected]>:
Ok, I was hoping one of the maintainers might want to.
I could add my eyes to monitor the github issues/pull requests, if only to
On Thu, Nov 15, 2012 at 2:11 PM, Marc-Andre Lafortune
On Thu, Nov 15, 2012 at 1:01 PM, Luis Lavena <[email protected]> wrote:
On Thu, Nov 15, 2012 at 1:06 PM, Zachary Scott <[email protected]>
[#49416] make check: missing psych — Ramkumar Ramachandra <artagnon@...>
Hi,
On Fri, Nov 16, 2012 at 9:58 AM, Ramkumar Ramachandra
Luis Lavena wrote:
[#49463] [ruby-trunk - Feature #7375][Open] embedding libyaml in psych for Ruby 2.0 — "tenderlovemaking (Aaron Patterson)" <aaron@...>
On Sun, Nov 18, 2012 at 03:05:50AM +0900, vo.x (Vit Ondruch) wrote:
Dne 17.11.2012 21:19, Aaron Patterson napsal(a):
On 17 November 2012 21:34, V=EDt Ondruch <[email protected]> wrote:
Hello,
[#49468] [ruby-trunk - Feature #7378][Open] Adding Pathname#write — "aef (Alexander E. Fischer)" <aef@...>
[#49479] [ruby-trunk - Bug #7379][Open] Unexpected result of Kernel#gets on Windows 8 — "phasis68 (Heesob Park)" <phasis@...>
[#49518] [ruby-trunk - Bug #7383][Open] Use stricter cache check in load.c — "funny_falcon (Yura Sokolov)" <funny.falcon@...>
[#49536] [ruby-trunk - Feature #7388][Open] Object#embed — "zzak (Zachary Scott)" <zachary@...>
[#49543] [ruby-trunk - Feature #7390][Open] Funny Falcon Threads — "zzak (Zachary Scott)" <zachary@...>
[#49558] [ruby-trunk - Bug #7395][Open] Negative numbers can't be primes by definition — "zzak (Zachary Scott)" <zachary@...>
[#49868] How to stop spam from ruby-core — Heesob Park <phasis@...>
Hi,
[#49949] [ruby-trunk - Feature #7426][Assigned] Update Rdoc — "mame (Yusuke Endoh)" <mame@...>
(2012/11/27 13:33), drbrain (Eric Hodel) wrote:
On Tue, Nov 27, 2012 at 12:57 AM, SASADA Koichi <[email protected]> wrote:
On Nov 26, 2012, at 10:09 PM, Luis Lavena <[email protected]> wrote:
[#50092] [ruby-trunk - Feature #7434][Open] Allow caller_locations and backtrace_locations to receive negative params — "sam.saffron (Sam Saffron)" <sam.saffron@...>
[#50264] [ruby-trunk - Feature #7457][Open] GC.stat to return "allocated object count" and "freed object count" — "ko1 (Koichi Sasada)" <redmine@...>
[#50306] Towards a better process for changing Ruby — Magnus Holm <judofyr@...>
Hey folks,
What I'd like to see is primarily better communication and release
Hello Magnus,
Endoh-san,
[#50312] How to stop spam message from redmine.ruby-lang.org — Heesob Park <phasis@...>
HI,
Hi,
[#50372] [ruby-trunk - Bug #7476][Open] missing "IP_TRANSPARENT" constant for IP sockets. — "elico (Eliezer Croitoru)" <eliezer@...>
2013/2/24 ko1 (Koichi Sasada) <[email protected]>:
[ruby-core:49989] [ruby-trunk - Feature #6762][Assigned] Control interrupt timing
Issue #6762 has been updated by mame (Yusuke Endoh). Status changed from Open to Assigned Priority changed from Normal to High Ko1 said, this issue is requiring just the name. Please decide the name and commit it before preview2 (1 Dec.). Otherwise, I'll postpone this ticket to next minor. -- Yusuke Endoh <[email protected]> ---------------------------------------- Feature #6762: Control interrupt timing https://bugs.ruby-lang.org/issues/6762#change-33758 Author: ko1 (Koichi Sasada) Status: Assigned Priority: High Assignee: ko1 (Koichi Sasada) Category: core Target version: 2.0.0 =begin = Abstract Add asynchronous interrupt timing control feature. Control with the following three modes: * immediate: process interrupt immediately * never: never process interrupt * on_blocking: delay interrupt until blocking operation # example th = Thread.new do Thread.control_interrupt(RuntimeError => :never) do # in this block, thrown RuntimeError doesn't occur end ... # raise thrown RuntimeError end ... th.raise "foo" = Background == Terminology * Interrupt: asynchronous interrupt and corresponding procedures * Thread#raise and occurring exception * signal and corresponding trap * Thread#kill and thread termination * Main thread termination and thread termination (after main thread termination, all threads exit themselves) * Interrupt checking: check interrupt * Blocking operation: Possible to block the current thread such as IO read/write. In CRuby implementation, it is nearly equals to tasks without GVL == Current use-cases of Interrupt There are several `Interrupt' in Ruby. # Example 1 th = Thread.new{ begin ... rescue FooError ... end } th.raise(FooError) #=> Raise FooError on thread `th' # Example 2 q = Queue.new th1 = Thread.new{ q << calc_in_algorithm1 } th2 = Thread.new{ q << calc_in_algorithm2 } result = q.pop th1.raise(TerminateCalcError) th2.raise(TerminateCalcError) # Run two algorithms simultaneously. # If we get an answer from one algorithm, # kill them with TerminateCalcError # In this case, it is also okay with Thread#kill # Example 3 trap(SIGINT){ # do something # maybe termination process } trap(SIGHUP){ # do something # maybe reloading configuration process } server_exec # server main process In such interrupts are checked at several points such as: * method invocation timing * method returning timing * move program counter * before and after block operation == Problem Interrupt causes the following problems because we can't control occurring timing. * Un-safe ensure clause: Generally, ensure clause should not interrupt because it contains important tasks such as freeing resources. * Un-safe resource allocation: If interrupt occurs between resource allocation and assign it to the variable, we can't free this object (however, this problem not too big because we have a gc and appropriate finalizer can free it). * (other problems? please complement me) I show an example below. # Example 4 # this method is similar implementation of timeout() def timeout(sec) timer_thread = Thread.new(Thread.current){|parent| sleep(sec) parent.raise(TimeoutError) } begin yield ensure timer_thread.stop # close thread end end timeout(3){ begin f = # point (a) open(...) # of course, there are no problem with open(...){|f| ...} # but it is an example to show the problem ... ensure ... # point (b) f.close end } On example 4, there are two problems. Point (b) is easy to understand. If interrupt was thrown at point (b), then `f.close()' isn't called. It is problem. On the point (a), it is a position between resource allocation (open()) and assignment `f = '. It is very rare, but it is possible. If we get interrupt before assignment, then we can't free resources (can't call f.close()) in ensure clause. It is also problem. The problem is we can't control interrupt timing. = Proposal Adding interrupt timing control feature to Thread. Introduce two methods to Thread class. * Thread.control_interrupt * Thread.check_interrupt Rdoc documents are: Thread.control_interrupt(): call-seq: Thread.control_interrupt(hash) { ... } -> result of the block Thread.control_interrupt controls interrupt timing. _interrupt_ means asynchronous event and corresponding procedure by Thread#raise, Thread#kill, signal trap (not supported yet) and main thread termination (if main thread terminates, then all other thread will be killed). _hash_ has pairs of ExceptionClass and TimingSymbol. TimingSymbol is one of them: - :immediate Invoke interrupt immediately. - :on_blocking Invoke interrupt while _BlockingOperation_. - :never Never invoke interrupt. _BlockingOperation_ means that the operation will block the calling thread, such as read and write. On CRuby implementation, _BlockingOperation_ is operation executed without GVL. Masked interrupts are delayed until they are enabled. This method is similar to sigprocmask(3). TODO (DOC): control_interrupt is stacked. TODO (DOC): check ancestors. TODO (DOC): to prevent all interrupt, {Object => :never} works. NOTE: Asynchronous interrupts are difficult to use. If you need to communicate between threads, please consider to use another way such as Queue. Or use them with deep understanding about this method. # example: Guard from Thread#raise th = Thread.new do Thead.control_interrupt(RuntimeError => :never) { begin # Thread#raise doesn't interrupt here. # You can write resource allocation code safely. Thread.control_interrupt(RuntimeError => :immediate) { # ... # It is possible to be interrupted by Thread#raise. } ensure # Thread#raise doesn't interrupt here. # You can write resource dealocation code safely. end } end Thread.pass # ... th.raise "stop" # example: Guard from TimeoutError require 'timeout' Thread.control_interrupt(TimeoutError => :never) { timeout(10){ # TimeoutError doesn't occur here Thread.control_interrupt(TimeoutError => :on_blocking) { # possible to be killed by TimeoutError # while blocking operation } # TimeoutError doesn't occur here } } # example: Stack control settings Thread.control_interrupt(FooError => :never) { Thread.control_interrupt(BarError => :never) { # FooError and BarError are prohibited. } } # example: check ancestors Thread.control_interrupt(Exception => :never) { # all exceptions inherited from Exception are prohibited. } Thread.check_interrupt(): call-seq: Thread.check_interrupt() -> nil Check queued interrupts. If there are queued interrupts, process respective procedures. This method can be defined as the following Ruby code: def Thread.check_interrupt Thread.control_interrupt(Object => :immediate) { Thread.pass } end Examples: th = Thread.new{ Thread.control_interrupt(RuntimeError => :on_blocking){ while true ... # reach safe point to invoke interrupt Thread.check_interrupt ... end } } ... th.raise # stop thread NOTE: This example can be described by the another code. You need to keep to avoid asynchronous interrupts. flag = true th = Thread.new{ Thread.control_interrupt(RuntimeError => :on_blocking){ while true ... # reach safe point to invoke interrupt break if flag == false ... end } } ... flag = false # stop thread I have already commit-ed these methods into trunk. Please try it and discuss. This commit is easy to revert :) Naming is also problem as usual. Good naming is also welcome. = Acknowledgment The base of this proposal is a discussion[1]. [1] Akira Tanaka "Re: Thread#raise, Thread#kill, and timeout.rb are unsafe" ruty-talk (2008.3) <http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/294917> Many dev-people help me to make up this proposal. =end -- http://bugs.ruby-lang.org/