Hi, i'm using Ragel parser generating Ruby code. The generated code
uses a Class instead of an instance, and that class has lots of
attributes and methods. Something like:

--------------
class MyParser

   class << self
       attr_accessor :_machine_trans_keys
       private :_machine_trans_keys, :_machine_trans_keys=
   end

 self._machine_trans_keys = [
       0, 0, 9, 34, 10, 10,
       9, 32, 9, 34, -64,
       126, -128, -65, -128, -65,
       -128, -65, -128, -65, -128, -65,
       10, 10, 9, 32, 13,
       13, 10, 10, 0, 127,
       0, 0, 0
   ]

 ...
 ...

 def self.run_machine(data)
     ...
 end

end
-------------


So I wonder how could I use this class into a threaded program. A Ruby
singleton class is the Class itself, so if a running thread modifies
some Class attribute then all the other threads will see that change (error!!!).

As an ilustration, please run the following Ruby code:

-----------------------
#!/usr/bin/env ruby

class Test

        class << self
                attr_accessor :my_string
        end

        self.my_string = "initial value"

end

t1 = Thread.new(Test) do |test|
        puts "--- I'm thread 1:"
        puts "---   Writting: my_string = 'new value'"
        test.my_string = "new value"
        puts "---   Reading:  my_string = #{test.my_string}"
end

sleep 0.5

t2 = Thread.new(Test) do |test|
        puts "--- I'm thread 2:"
        puts "---   Reading:  my_string = #{test.my_string}"
end

t1.join
t2.join
-----------------------


This will generate the following output:
--------------------
--- I'm thread 1:
---   Writting: my_string = 'new value'
---   Reading:  my_string = new value
--- I'm thread 2:
---   Reading:  my_string = new value
-------------------

As you can see, when thread2 gets the value of "my_string" it is "new
value", the value set previously by thread1.
AFAIK there is no way to avoid this problem since "Test" is a class,
not an instance (we are using the Singleton mode).


Now imagine that instead of Test we use MyParser with Ragel code
generated (Singleton class again). We would have the same problem.


Why does the Ruby generated code make use of Singleton class instead
of creating instance methods and attributes?
Thanks a lot.

-- 
Iñaki Baz Castillo
<[email protected]>

_______________________________________________
ragel-users mailing list
[email protected]
http://www.complang.org/mailman/listinfo/ragel-users

Reply via email to