[#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 ext and GVL] Why UBF() is called even if Ruby traps signals ??

From: Iñaki Baz Castillo <ibc@...>
Date: 2012-05-22 17:11:51 UTC
List: ruby-talk #395816
2012/5/22 Eric Wong <normalperson@yhbt.net>:
> I=C3=B1aki Baz Castillo <ibc@aliax.net> wrote:
>> But that's not my problem. In fact, I have a mechanism to communicate
>> with UV loop at any time safely from any thread:
>>
>> =C2=A0 uv_async_send() =C2=A0 (thread safe)
>
> OK, perfect. =C2=A0You can probably just call in your ubf(), nothing else=
.

Right, I've got it :)  (more below).


>> So from the ubf() function I have no problem in telling UV "please do
>> this now or in your next instant iteration". My problem is: what to
>> say?
>>
>> 1) If ubf() has been called from Thread#kill then I need to run a
>> function that closes all the active UV handlers so uv_run() exits.
>
> Can you run those cleanup handlers in the killer and not the killee?
> You should Thread#join the killee, and then cleanup in the killer.

The problem is that I don't know if my library user will do
Thread#kill or Thread#raise or whatever :)
But don't worry, Finally I've it working (more below).



> On the other hand, with uv_async_send(), you can probably avoid
> Thread#kill entirely. =C2=A0Thread#kill can be dangerous/unreliable,
> as ensure clauses will still fire, and ensure clauses can be
> broken, too.

I don't want to use it, but the user could do it :)


>> 2) If ubf() has been called due to a signal receipt, I don't want
>> uv_run() to exit. Instead the signal wakeups the UV loop and generates
>> an iteration in which I call to rb_check_interrupts() for handling the
>> signal in Ruby land and I'm happy. But the ubf() has been called !!!
>>
>> So the problem is that when a signal is received, it makes the ubf()
>> function to be called and, at that point, I have no way to know,
>> within the ubf() function, whether it has been called by Thread#kill
>> or by a received signal.
>
> You're right, there's no way for the ubf() to know why it's called.
>
> The purpose of the ubf() is only to wake up a thread and have it
> reacquire the GVL. =C2=A0That's it.
>
> Once a thread reacquires the GVL, it can:
> - run Ruby signal handlers (automatically done by VM)
> - die (respond to Thread#kill, again automatically done by VM)
> - give up the GVL again and resume blocking (your choice)

Perfect. Once this is fully understood by me I've redesigned my code
so when my ubf() function is called:

- I don't know if it has been called due to a signal or due to a
Thread#kill, so in my ubf() function I just create a uv_async handle
(thread safe), and send it to the UV reactor.

- The reactor is then wakeup, acquires the GVL and runs
rb_check_interrupts(), so in case I've received a signal it is handled
in Ruby land.

And just it :)


In the other side, now I don't assume that my ubf() must terminate my
blocking function (uv_run) so what I do is basically:

def MyLibrary.run

  @running =3D true

  uv_run_terminated_by_itself =3D false
  begin
    uv_run()
    uv_run_terminated_by_itself =3D true
  ensure
    @running =3D false
    unless uv_run_terminated_by_itself
      destroy_handles()
    end
  end


And that's all. The ensure block is executed in any case (due to a
signal not trapped by Ruby, a Thread#kill, ...).

:)

--=20
I=C3=B1aki Baz Castillo
<ibc@aliax.net>

In This Thread

Prev Next