Project

General

Profile

Actions

Feature #10211

closed

Implement Signal.current_trap(sig)

Added by kyrylo (Kyrylo Silin) about 10 years ago. Updated over 9 years ago.

Status:
Feedback
Assignee:
-
Target version:
-
[ruby-core:64830]

Description

Here's pseudocode by ko1:

def trap2(sig)
  previous_proc = Signal.current_trap(sig)
  Signal.trap(sig){
    previous_proc.call if previous_proc
    yield
  }
end
 
trap2(:INT){...}

Motivation

I'm developing a gem that allows using multiple callbacks for a trap: [[https://github.com/kyrylo/multitrap]]
It's pretty simple (and slightly broken). The problem is that if you earlier had defined traps and then
required my library, it would discard your previously defined callbacks.
The library overrides Signal.trap and stores callbacks in a hash. However, it stores only new callbacks.
I cannot access previously defined callbacks for signals. They are stored in GET_VM()->trap_list, which
isn't exposed neither to Ruby nor to the C extension API. I know when you define a trap, it returns a proc.
However, nobody typicaly stores it, so there's no way to access it. So if my gem loads after this assignment,
I'm unable to capture that proc, hence I always overwrite previous "traps". This library might be useful if you
want to define a trap that conflicts with some other gem you depend on, which defines its own trap for the
same signal.

So I need some way to access the callbacks.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0