[#390749] Why are there so many similar/identical methods in core classes — Kassym Dorsel <k.dorsel@...>

Let's look at the Array class and start with method aliases.

14 messages 2011/12/02

[#390755] Inverse Operation of Module#include — Su Zhang <su.comp.lang.ruby@...>

Hi list,

21 messages 2011/12/02
[#390759] Re: Inverse Operation of Module#include — Ryan Davis <ryand-ruby@...> 2011/12/02

[#390764] Re: Inverse Operation of Module#include — Isaac Sanders <isaacbfsanders@...> 2011/12/02

I would suggest an Adapter pattern use here. IF there is something that has

[#390795] Is there a better way to check this array? — Wayne Brissette <wbrisett@...>

I have an array which contains items that need to be renamed. Unfortunately the way things are changed are based on a comparison of if something else exists. For example in this simple array:

9 messages 2011/12/03

[#390876] black magical hash element vivification — Chad Perrin <code@...>

Ruby (1.9.3p0 to be precise, installed with RVM) is not behaving as I

12 messages 2011/12/05

[#390918] WEB SURVEY about Ruby Community — Intransition <transfire@...>

Did any one else get this survey request?

14 messages 2011/12/07

[#390972] Which is the best online document conversion site? — "Maria M." <mariamoore952@...>

Can anyone tell me that which is the best online document conversion

7 messages 2011/12/08

[#390976] Confusing results from string multiplication — Rob Marshall <robmarshall@...>

Hi,

19 messages 2011/12/08

[#391019] How can I do h["foo"] += "bar" if h["foo"] does not exist? — "Andrew S." <andrewinfosec@...>

Hi there,

13 messages 2011/12/09

[#391027] reading from file without end-of-lines — Janko Muzykant <umrzykus@...>

hi,

20 messages 2011/12/09
[#391028] Re: reading from file without end-of-lines — Gavin Sinclair <gsinclair@...> 2011/12/09

> i'm trying to read a few text values from single file:

[#391031] Re: reading from file without end-of-lines — Robert Klemme <shortcutter@...> 2011/12/09

On Fri, Dec 9, 2011 at 9:58 AM, Gavin Sinclair <gsinclair@gmail.com> wrote:

[#391042] Re: reading from file without end-of-lines — Gavin Sinclair <gsinclair@...> 2011/12/09

On Fri, Dec 9, 2011 at 8:18 PM, Robert Klemme

[#391135] I need advice on what to do next. — Nathan Kossaeth <system_freak_2004@...>

I am new to programming. I read the ebook "Learn to Program" by Chris

23 messages 2011/12/12

[#391216] perf optimization using profile results — Chuck Remes <cremes.devlist@...>

I need some help with optimizing a set of libraries that I use. They are ffi-rzmq, zmqmachine and rzmq_brokers (all up on github).

13 messages 2011/12/13
[#391218] Re: perf optimization using profile results — Chuck Remes <cremes.devlist@...> 2011/12/13

On Dec 13, 2011, at 9:57 AM, Chuck Remes wrote:

[#391234] Re: perf optimization using profile results — Charles Oliver Nutter <headius@...> 2011/12/14

A couple quick observations.

[#391238] Re: perf optimization using profile results — Chuck Remes <cremes.devlist@...> 2011/12/14

On Dec 13, 2011, at 7:03 PM, Charles Oliver Nutter wrote:

[#391324] ruby 1.9 threading performance goes non-linear — Joel VanderWerf <joelvanderwerf@...>

12 messages 2011/12/16
[#391325] Re: ruby 1.9 threading performance goes non-linear — Eric Wong <normalperson@...> 2011/12/16

Joel VanderWerf <joelvanderwerf@gmail.com> wrote:

[#391420] Accessing class instance variables from an instance? — "Shareef J." <shareef@...>

Hi there,

26 messages 2011/12/20
[#391454] Re: Accessing class instance variables from an instance? — Khat Harr <myphatproxy@...> 2011/12/21

Actually, now that I'm thinking about it the existing behavior sort of

[#391456] Re: Accessing class instance variables from an instance? — Josh Cheek <josh.cheek@...> 2011/12/21

On Tue, Dec 20, 2011 at 9:42 PM, Khat Harr <myphatproxy@hotmail.com> wrote:

[#391545] Kernel#exit raises an exception? — Khat Harr <myphatproxy@...>

While I was working on embedding an interpreter I wrote a function to

13 messages 2011/12/24

[#391618] rvmsh: An easy installer for RVM — Bryan Dunsmore <dunsmoreb@...>

I have recently begun work on a project called [rvmsh]

12 messages 2011/12/29

[#391783] Mailspam — Gunther Diemant <g.diemant@...>

Is there a way to stop this mailspam of Luca (Mail)?

12 messages 2011/12/29

[#391790] What’s the standard way of implementing #hash for value objects in Ruby? — Nikolai Weibull <now@...>

Hi!

23 messages 2011/12/29
[#391792] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Gunther Diemant <g.diemant@...> 2011/12/29

I think you can't access instance variables from a class method, so

[#391793] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Nikolai Weibull <now@...> 2011/12/29

On Thu, Dec 29, 2011 at 15:52, Gunther Diemant <g.diemant@gmx.net> wrote:

[#391811] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Robert Klemme <shortcutter@...> 2011/12/29

On Thu, Dec 29, 2011 at 4:06 PM, Nikolai Weibull <now@bitwi.se> wrote:

[#391812] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Nikolai Weibull <now@...> 2011/12/29

On Fri, Dec 30, 2011 at 00:26, Robert Klemme <shortcutter@googlemail.com> wrote:

[#391816] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Josh Cheek <josh.cheek@...> 2011/12/30

On Thu, Dec 29, 2011 at 5:47 PM, Nikolai Weibull <now@bitwi.se> wrote:

[#391833] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Robert Klemme <shortcutter@...> 2011/12/30

On Fri, Dec 30, 2011 at 12:47 AM, Nikolai Weibull <now@bitwi.se> wrote:

Re: C module calling ruby code cause cfp consistency error

From: Kim Burgestrand <kim@...>
Date: 2011-12-05 15:44:30 UTC
List: ruby-talk #390870
Hi Adam!

On Monday, 5 December 2011 at 11:23, Adam Bukowski wrote:
> I've written some module in C that uses wnck(on linux) to get window
> title. There must be some event loop which I run in different thread.
> When event window-changed occurs i want to call ruby method, to report
> window title.
> I've used some kind of observer pattern here, so ruby registers handler
> method in C module, and do something else.
>  
> When there is no handler function call in C code - everything is great,
> but it makes no sense.
>  
> Problem is that when I call ruby handler from different thread it causes
> cfp consistency error and rest of code in ruby file isn't working
> properly. It hangs waiting for window-change. When window is changed
> then it goes to next instruction.
>  
>  

Yes. You cannot call Ruby functions from a thread not created by Ruby. When
it comes to MRI, you must be the owner of the GIL to call ruby functions, and
since the thread is not a ruby-created thread you have no way of owning the GIL.

You *can* work around this, but it is not easy. But before you try working around
it with the solution I am about to (try to) explain, I urge you to read the later parts
of my post about `rb_thread_blocking_region`.

Anyway,

Dealing with this kind of asynchronous callback in Ruby means you will need
a thread in Ruby (either main thread, or just another thread, we call it the callback
thread) waiting for the callback to happen. This waiting needs to be implemented
in C, as you will need to convert all the data you need from the callback to Ruby
VALUEs from C values.

Because the `call_handler` is in a non-ruby thread, it cannot call ruby functions.
So, to pass information when this handler is called you need to have something
that *can* call Ruby functions wait for the `call_handler` to be called, and then
grab data from `call_handler`, convert it to Ruby values and then use it however
you want.

The only way I know of doing this is by setting up a global condition variable that,
from a Ruby-created thread, you wait for signals on (make sure you use the `rb_-
thread_blocking_region` function or you will block all of Ruby). When `call_handler`
is called you put the title in a memory location accessible from both the waiting C
function from Ruby, and `call_handler` itself.

`call_handler` will then put the raw title (or any kind of information) in this shared
memory location and then signal the Ruby C waiting-function that the callback has
been called. Once it has signaled, this `call_handler` can exit. Just make sure that
you don’t lose the parameters from memory when you exit the `call_handler`.

Anyhow, now when Ruby C waiting function has been signaled it knows that it has
some data. It will take this data from the previously mentioned shared memory loc-
ation and convert it to Ruby VALUEs that you can use in your Ruby code.

I’m sorry if this seems confusing. I’ve tried explaining this before by writing a blog
post about it: http://burgestrand.se/articles/asynchronous-callbacks-in-ruby-c-extensions.html
(keep in mind, the code might not work on windows, it is only for explanation of concept)

If you need another implementation, you can also look at Ruby FFI, that does a very
similar thing to handle callbacks: https://github.com/ffi/ffi/blob/master/ext/ffi_c/Function.c
(look for words gvl, cb, async; do keep in mind Ruby FFI’s solution works on windows,
ruby 1.8.7 and is a more general solution than what I have in my blog post)

> I've tried not to use native thread and call this blocking wnck's loop
> in ruby's Thread.new, but it hangs totally then.
>  
>  

If you try a blocking operation in any Ruby thread it will not allow other threads to run.
This, again, is because of the GIL. If you need to do a blocking operation in C, you can
use `rb_thread_blocking_region` to do it:

https://github.com/ruby/ruby/blob/ruby_1_9_3/thread.c#L1079

This method will first unlock the GIL, allowing other Ruby threads to run, and then call
your blocking operation (supplied as first parameter). If you need to pass additional data
you can use the second parameter, which will be given to the blocking function as its’
argument.

If Ruby needs to abort the blocking function (any reason, for example if user tries to exit
your script) it will call the unblocking function given as third parameter, with the fourth
parameter as its’ argument.

I wish you the best of luck, Adam!

PS: You might find `rb_thread_call_with_gvl` when you look through the source, and it
might look promising. Problem with this function is that it is useless when you are in a
non-Ruby thread. It is only useful if you are within a function that you came into by using
`rb_thread_blocking_region`, to temporarily jump back into Ruby and do some operation.

— Kim Burgestrand

In This Thread