[#395238] rubygem: ispunity (unite all your internet connections) — Arun Tomar <tomar.arun@...>

Dear friends,

12 messages 2012/05/01

[#395250] Overwriting one Ruby array or arrays with another — Craig Law <lists@...>

Hi

14 messages 2012/05/02

[#395258] array of strings - finding letter combinations — "Sebastjan H." <lists@...>

Hi All,

16 messages 2012/05/02

[#395357] Why Enumerator#next does not return more than one value? — Földes László <lists@...>

If I have an Enumerator which yields elements of a mathematical series

10 messages 2012/05/07

[#395373] How to use Data_Wrap_Struct to assign the DATA VALUE to an exsiting Ruby object? — Iñaki Baz Castillo <ibc@...>

Hi, my code receives an arbitrary klass name (provided by the user)

8 messages 2012/05/07

[#395429] passing via instance variable or regular () — sam jam <lists@...>

def first

10 messages 2012/05/10

[#395463] I'm looking for a Metaprogramming Project — Phil Stone <lists@...>

Hello,

19 messages 2012/05/11

[#395548] A million reasons why Encoding was a mistake — Marc Heiler <lists@...>

Newcomer wants to try Ruby.

15 messages 2012/05/15
[#395561] Re: A million reasons why Encoding was a mistake — Ryan Davis <ryand-ruby@...> 2012/05/15

[#395595] Re: A million reasons why Encoding was a mistake — Brian Candler <lists@...> 2012/05/16

I will add that the OP is not entirely alone in his opinion.

[#395551] How to ensure that a block runs entirely after other threads? (Thread.exclusive does not "work") — Iñaki Baz Castillo <ibc@...>

Hi, I expected that in the following example code, thread t1 would not

8 messages 2012/05/15

[#395575] GUI with ruby on windows — David Acosta <lists@...>

hello friends, i am a begginer and i have a litlle question, how can i

17 messages 2012/05/16

[#395604] what is going wrong here? — roob noob <lists@...>

Notice the initialization of both classes in each of the examples, if

20 messages 2012/05/16

[#395646] rb_gc_register_address() or rb_gc_mark()? — Iñaki Baz Castillo <ibc@...>

Hi, I've bad experiences with rb_gc_register_address(), it does never

16 messages 2012/05/17

[#395686] reading from and writing to a Unicode encoded file — "Sebastjan H." <lists@...>

Hi,

19 messages 2012/05/18
[#395694] Re: reading from and writing to a Unicode encoded file — Regis d'Aubarede <lists@...> 2012/05/18

Hello,

[#395697] Re: reading from and writing to a Unicode encoded file — "Sebastjan H." <lists@...> 2012/05/18

Regis d'Aubarede wrote in post #1061272:

[#395698] Re: reading from and writing to a Unicode encoded file — Regis d'Aubarede <lists@...> 2012/05/18

Sebastjan H. wrote in post #1061276:

[#395699] Re: reading from and writing to a Unicode encoded file — "Sebastjan H." <lists@...> 2012/05/18

Regis d'Aubarede wrote in post #1061277:

[#395750] Re: reading from and writing to a Unicode encoded file - issues when using Shoes — "Sebastjan H." <lists@...> 2012/05/21

Hi,

[#395754] Re: reading from and writing to a Unicode encoded file - issues when using Shoes — "Sebastjan H." <lists@...> 2012/05/21

Sebastjan H. wrote in post #1061483:

[#395740] ? Ruby through CGI and Rails — Shaun Lloyd <list@...>

Hi everybody,

22 messages 2012/05/21
[#395764] Re: Ruby through CGI and Rails — Brian Candler <lists@...> 2012/05/21

Shaun Lloyd wrote in post #1061455:

[#395786] Re: Ruby through CGI and Rails — Shaun Lloyd <list@...> 2012/05/22

On 22/05/12 03:37, Brian Candler wrote:

[#395838] Re: Ruby through CGI and Rails — Brian Candler <lists@...> 2012/05/23

Shaun Lloyd wrote in post #1061602:

[#395787] Changing self class from inside a method?? — David Madison <lists@...>

Let's start off with the assumption I want a method that allows an

10 messages 2012/05/22

[#395841] Memory-efficient set of Fixnums — George Dupre <lists@...>

Hi,

25 messages 2012/05/23

[#395883] looking for a ruby idiom : r=foo; return r if r — botp <botpena@...>

Hi All,

11 messages 2012/05/24

[#395966] Am I justified to use a global variable if it must be used in all scopes? — Phil Stone <lists@...>

Hello,

12 messages 2012/05/27

[#396010] does this leak more than the size of the string via timing side channels — rooby shoez <lists@...>

string1 = "string"

16 messages 2012/05/29

[#396038] Is it possible to avoid longjmp in exceptions, Thread#kill, exit(), signals? — Iñaki Baz Castillo <ibc@...>

Hi, my Ruby C extension runs a C loop (libuv) without GVL. At some

8 messages 2012/05/29

Re: [C exten] Is it possible to avoid longjmp in exceptions, Thread#kill, exit(), signals?

From: Peter Zotov <whitequark@...>
Date: 2012-05-29 21:10:15 UTC
List: ruby-talk #396043
Iñaki Baz Castillo писал 29.05.2012 22:37:
> Please forget this for now. I've realized that my call to 
> rb_protect()
> didn't rescue exceptions if they were not StandardError (due to a
> check I did in my C code). So I *do* can rescue at C level any kind 
> of
> error/exception, inclouding Interrupt or Exit and act according.
>
> So please let me work a bit on it and I will comment the result.
>
> Thanks a lot.
>
> <snip>
>>
>> My question is: is there any way to avoid the longjmp? or a 
>> different
>> approach: is there any way from my C code to avoid being interrupted
>> while I go to Ruby land (by acquiring the GVL)?

Let me still answer your question.

Exceptions are a mechanism of control flow which is both nonlocal and 
cannot
be represented by procedure calls/returns. The only way to do that in C 
is
longjmp. (In a proper language like Lisp there are also continuations, 
for example.)
Well, technically there is no way to do this in C-as-a-language, and 
longjmp
is a platform-specific and IIRC nonstandard extension (I'm not quite 
sure,
through).

So.. if you want exceptions in C, you need longjmp, period. (You can 
also
avoid using system stack, i.e. represent nested Ruby calls by some 
internal
structure, rather the current way where nested Ruby calls map to nested
native stack frames, but that will degrade performance significantly.)

Thread#kill and exit() both send signals. POSIX threads are a weird 
kind of
processes, hence they can receive signals too, and Thread#kill works 
that way.
Actually, signals are a mechanism of asynchronous prioritized execution 
of code
in a context of another thread, and, surprise, there is no way to do 
that in
C. (Signals are also pretty evil, too, because not only they are 
asynchronous,
but also there is no sane way to synchronize their execution with main 
control
flow, which is the reason 99% of signal handlers are of form
"void signal() { flag = 1; }".)

So, if you want to deliver asynchronous external events to your program 
without
an explicit event loop (which you will probably need anyway, see 
above), you
need to use signals, period.

I don't really think that there is some magical (i.e. nonstandard) way 
to avoid
signal/longjmp-caused interruptions for your code. I would also really 
discourage
you from messing with signals: they're already a big pile of crap, 
don't add even
more compelxity there. Longjmp is, too, but at least it's synchronous.

-- 
   WBR, Peter Zotov.

In This Thread