[#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

[#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

[#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> w=

[#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=21

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.
> =20
> When there is no handler function call in C code - everything is great,=

> but it makes no sense.
> =20
> Problem is that when I call ruby handler from different thread it cause=
s
> 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.
> =20
> =20

Yes. You cannot call Ruby functions from a thread not created by Ruby. Wh=
en
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 t=
he GIL.

You *can* work around this, but it is not easy. But before you try workin=
g around
it with the solution I am about to (try to) explain, I urge you to read t=
he later parts
of my post about =60rb=5Fthread=5Fblocking=5Fregion=60.

Anyway,

Dealing with this kind of asynchronous callback in Ruby means you will ne=
ed
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 impl=
emented
in C, as you will need to convert all the data you need from the callback=
 to Ruby
VALUEs from C values.

Because the =60call=5Fhandler=60 is in a non-ruby thread, it cannot call =
ruby functions.
So, to pass information when this handler is called you need to have some=
thing
that *can* call Ruby functions wait for the =60call=5Fhandler=60 to be ca=
lled, and then
grab data from =60call=5Fhandler=60, convert it to Ruby values and then u=
se it however
you want.

The only way I know of doing this is by setting up a global condition var=
iable that,
from a Ruby-created thread, you wait for signals on (make sure you use th=
e =60rb=5F-
thread=5Fblocking=5Fregion=60 function or you will block all of Ruby). Wh=
en =60call=5Fhandler=60
is called you put the title in a memory location accessible from both the=
 waiting C
function from Ruby, and =60call=5Fhandler=60 itself.

=60call=5Fhandler=60 will then put the raw title (or any kind of informat=
ion) in this shared
memory location and then signal the Ruby C waiting-function that the call=
back has
been called. Once it has signaled, this =60call=5Fhandler=60 can exit. Ju=
st make sure that
you don=E2=80=99t lose the parameters from memory when you exit the =60ca=
ll=5Fhandler=60.

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 me=
mory loc-
ation and convert it to Ruby VALUEs that you can use in your Ruby code.

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

If you need another implementation, you can also look at Ruby =46=46I, th=
at does a very
similar thing to handle callbacks: https://github.com/ffi/ffi/blob/master=
/ext/ffi=5Fc/=46unction.c
(look for words gvl, cb, async; do keep in mind Ruby =46=46I=E2=80=99s so=
lution works on windows,
ruby 1.8.7 and is a more general solution than what I have in my blog pos=
t)

> 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.
> =20
> =20

If you try a blocking operation in any Ruby thread it will not allow othe=
r threads to run.
This, again, is because of the GIL. If you need to do a blocking operatio=
n in C, you can
use =60rb=5Fthread=5Fblocking=5Fregion=60 to do it:

https://github.com/ruby/ruby/blob/ruby=5F1=5F9=5F3/thread.c=23L1079

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 pas=
s additional data
you can use the second parameter, which will be given to the blocking fun=
ction as its=E2=80=99
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 paramete=
r, with the fourth
parameter as its=E2=80=99 argument.

I wish you the best of luck, Adam=21

PS: You might find =60rb=5Fthread=5Fcall=5Fwith=5Fgvl=60 when you look th=
rough the source, and it
might look promising. Problem with this function is that it is useless wh=
en you are in a
non-Ruby thread. It is only useful if you are within a function that you =
came into by using
=60rb=5Fthread=5Fblocking=5Fregion=60, to temporarily jump back into Ruby=
 and do some operation.

=E2=80=94 Kim Burgestrand

In This Thread