[#46105] [ruby-trunk - Feature #6687][Open] Enumerable#with — "merborne (kyo endo)" <redmine@...>

14 messages 2012/07/02

[#46133] [ruby-trunk - Feature #6688][Open] Object#replace — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>

24 messages 2012/07/03

[#46160] [ruby-trunk - Feature #6693][Open] Don't warn for unused variables starting with _ — "marcandre (Marc-Andre Lafortune)" <ruby-core@...>

15 messages 2012/07/04

[#46200] [ruby-trunk - Bug #6702][Open] Date should be either required or not — "rosenfeld (Rodrigo Rosenfeld Rosas)" <rr.rosas@...>

14 messages 2012/07/05

[#46296] [ruby-trunk - Feature #6717][Open] Method like #instance_eval that returns self (like #tap) — "alexeymuranov (Alexey Muranov)" <redmine@...>

10 messages 2012/07/10

[#46320] [ruby-trunk - Feature #6721][Open] Object#yield_self — "alexeymuranov (Alexey Muranov)" <redmine@...>

25 messages 2012/07/11

[#46339] [ruby-trunk - Bug #6724][Open] waaaaaaant! ( — "zenspider (Ryan Davis)" <redmine@...>

11 messages 2012/07/11

[#46377] [ruby-trunk - Feature #6727][Open] Add Array#rest (with implementation) — "duckinator (Nick Markwell)" <nick@...>

25 messages 2012/07/13

[#46492] [ruby-trunk - Feature #6737][Open] Add Hash#read and alias as #[]. — "trans (Thomas Sawyer)" <transfire@...>

12 messages 2012/07/15

[#46500] [ruby-trunk - Feature #6739][Open] One-line rescue statement should support specifying an exception class — Quintus (Marvin Gülker) <sutniuq@...>

22 messages 2012/07/15

[#46562] [ruby-trunk - Feature #6758][Open] Object#sequence — "merborne (kyo endo)" <redmine@...>

19 messages 2012/07/20

[#46574] [ruby-trunk - Feature #6762][Open] Control interrupt timing — "ko1 (Koichi Sasada)" <redmine@...>

39 messages 2012/07/20

[#46641] [ruby-trunk - Bug #6780][Open] cannot compile zlib module, when cross-compiling. — "jinleileiking (lei king)" <jinleileiking@...>

14 messages 2012/07/23

[#46659] [ruby-trunk - Bug #6783][Open] Infinite loop in inspect, not overriding inspect, to_s, and no known circular references. Stepping into inspect in debugger locks it up with 100% CPU. — "garysweaver (Gary Weaver)" <garysweaver@...>

8 messages 2012/07/23

[#46792] [ruby-trunk - Bug #6799][Open] Digest::*.hexdigest returns an ASCII-8BIT String — "Eregon (Benoit Daloze)" <redmine@...>

11 messages 2012/07/26

[#46799] [ruby-trunk - Feature #6801][Open] String#~ for a here document — "merborne (kyo endo)" <redmine@...>

12 messages 2012/07/27

[#46829] [ruby-trunk - Feature #6806][Open] Support functional programming: forbid instance/class variables for ModuleName::method_name, allow for ModuleName.method_name — "alexeymuranov (Alexey Muranov)" <redmine@...>

7 messages 2012/07/28

[#46832] [ruby-trunk - Bug #6807][Open] Can't compile ruby without ruby — "devcurmudgeon (Paul Sherwood)" <storitel@...>

13 messages 2012/07/28

[#46834] [ruby-trunk - Feature #6808][Open] Implicit index for enumerations — "trans (Thomas Sawyer)" <transfire@...>

15 messages 2012/07/28

[#46838] [ruby-trunk - Bug #6810][Open] `module A::B; end` is not equivalent to `module A; module B; end; end` with respect to constant lookup (scope) — "alexeymuranov (Alexey Muranov)" <redmine@...>

17 messages 2012/07/28

[#46896] (Half-baked DRAFT) new `require' framework — SASADA Koichi <ko1@...>

Hi,

22 messages 2012/07/31

[ruby-core:46578] Re: [ruby-trunk - Feature #6762] Control interrupt timing

From: SASADA Koichi <ko1@...>
Date: 2012-07-20 20:17:14 UTC
List: ruby-core #46578
(2012/07/21 4:48), Eric Wong wrote:
> "ko1 (Koichi Sasada)" <redmine@ruby-lang.org> wrote:
>> * Un-safe ensure clause: Generally, ensure clause should not interrupt
>> because it contains important tasks such as freeing resources.
> 
> Thank you for addressing this issue.  ensure clause behaving properly
> is most important to me.
> 
>>     # 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
> 
> I like the above is now possible and safe, but I think having
> Thread.control_interrupt twice in above example is repetitive
> and error-prone.
>
> How about having something like at_exit, but local to the current scope:


I understand what you want.

In my ticket, I proposed two things.

  (1) Introducing the concept to "interrupt control"
  (2) Introducing primitives to achieve (1)

Maybe you proposed

  (3) Extra APIs to use (1) and (2) in easy way

(or (2)?)

I want to make clear and fix the (1) and (2) before (3).
How about it?

----

> How about having something like at_exit, but local to the current scope:
> 
>   def something
>     at_scope_exit do
>       # Thread#raise doesn't interrupt here.
>       # do what you would normally do in ensure clause
>       # deallocate resource if allocated
>       res.release if res
>     end
> 
>     # It is possible to be interrupted by Thread#raise.
>     # You can write resource allocation code safely because
>     # at_scope_exit already registered deallocation code
>     res = Foo.acquire
>     ...
> 
>   end
> 
> at_scope_exit could probably take the same args as
> Thread.control_interrupt, too:
> 
>   at_scope_exit(TimeoutError => :never) { ... }

We need more extra primitive to hook block ending to implement it.
It seems hard task...

A Trivial point.  `res' in block is not a variable (it parsed as method)
because the assignment of res (res = ...) is placed after the block.

One idea is extending ensure semantics.
I'm not sure how to design it....
We need more ideas.

-- 
// SASADA Koichi at atdot dot net


In This Thread