Skip to content
  • Koichi Sasada's avatar
    2f50936c
    Ractor.make_shareable(obj) · 2f50936c
    Koichi Sasada authored
    Introduce new method Ractor.make_shareable(obj) which tries to make
    obj shareable object. Protocol is here.
    
    (1) If obj is shareable, it is shareable.
    (2) If obj is not a shareable object and if obj can be shareable
        object if it is frozen, then freeze obj. If obj has reachable
        objects (rs), do rs.each{|o| Ractor.make_shareable(o)}
        recursively (recursion is not Ruby-level, but C-level).
    (3) Otherwise, raise Ractor::Error. Now T_DATA is not a shareable
        object even if the object is frozen.
    
    If the method finished without error, given obj is marked as
    a sharable object.
    
    To allow makng a shareable frozen T_DATA object, then set
    `RUBY_TYPED_FROZEN_SHAREABLE` as type->flags. On default,
    this flag is not set. It means user defined T_DATA objects are
    not allowed to become shareable objects when it is frozen.
    
    You can make any object  shareable by setting FL_SHAREABLE flag,
    so if you know that the T_DATA object is shareable (== thread-safe),
    set this flag, at creation time for example. `Ractor` object is one
    example, which is not a frozen, but a shareable object.
    2f50936c
    Ractor.make_shareable(obj)
    Koichi Sasada authored
    Introduce new method Ractor.make_shareable(obj) which tries to make
    obj shareable object. Protocol is here.
    
    (1) If obj is shareable, it is shareable.
    (2) If obj is not a shareable object and if obj can be shareable
        object if it is frozen, then freeze obj. If obj has reachable
        objects (rs), do rs.each{|o| Ractor.make_shareable(o)}
        recursively (recursion is not Ruby-level, but C-level).
    (3) Otherwise, raise Ractor::Error. Now T_DATA is not a shareable
        object even if the object is frozen.
    
    If the method finished without error, given obj is marked as
    a sharable object.
    
    To allow makng a shareable frozen T_DATA object, then set
    `RUBY_TYPED_FROZEN_SHAREABLE` as type->flags. On default,
    this flag is not set. It means user defined T_DATA objects are
    not allowed to become shareable objects when it is frozen.
    
    You can make any object  shareable by setting FL_SHAREABLE flag,
    so if you know that the T_DATA object is shareable (== thread-safe),
    set this flag, at creation time for example. `Ractor` object is one
    example, which is not a frozen, but a shareable object.
Loading