>>>>> "Jiang" == Jiang Wu <[EMAIL PROTECTED]> writes:

Thanks, this description helps alot.

    Jiang> Background: The relationship between the various objects
    Jiang> are quite tricky.  It takes some time to think them
    Jiang> through.  Basically, to reference a Tcl_Obj, the C
    Jiang> structure representing a Tcl object in the C Tcl
    Jiang> interpreter, TclBlend creates a TclObject, a Java class
    Jiang> instance using the following relationship:

    Jiang> TclObject (tcl.lang.TclObject, Java class) <contains>
    Jiang>          CObject (tcl.lang.CObject, Java class) <contains> 
    Jiang>                    a pointer to Tcl_Obj

In the case above what does the Tcl_Obj represent? Is it just a native
tcl object such as a string, a list, or an array?

    Jiang> CObject is a subclass of InternalObject
    Jiang> (tcl.lang.InternalObject).  InternalObject is an abstract
    Jiang> class containing an interface so that TclObject can be used
    Jiang> as the common interface to not only Tcl_Obj, but also other
    Jiang> types of TclBlend objects such as ReflectObject,
    Jiang> TclInteger, etc, all of those are subclass of
    Jiang> InternalObject.

    Jiang> On the C side, the C Tcl interpreter needs access to Java
    Jiang> objects defined in TclBlend, such as ReflectObject,
    Jiang> TclInteger, etc.  TclBlend uses a Tcl_Obj implementation to
    Jiang> wrap around any TclObject using the following relationship:

    Jiang> Tcl_Obj (A C struct with function pointers to functions
    Jiang>         that are specifically designed to manipulate TclBlend's
    Jiang>         TclObject.  Defined in javaObj.c in TclBlend.)  <contains>
    Jiang>         reference/pointer to the Java TclObject

This makes sense.  The Tcl_Obj internal rep always holds a jobject
handle to a java TclObject.

    Jiang> It seems that you can get infinite recusive containment as
    Jiang> in:

    Jiang> Tcl_Object <contains> 
    Jiang>         Tcl_Obj <contains> 
    Jiang>              Tcl_Object <contains>
    Jiang>                  Tcl_Obj <contains> ...

Yeh this was confusing me, especially when I started thinking about
the changes you made to the refcounting code.

    Jiang> TclBlend is smart enough to detect such attempt.  When it
    Jiang> is detected, TclBlend removes the extra level containment
    Jiang> so that most of the time you will have either:

Is that what's going on in the setInternalRep method of the TclObject
class?  It checks for a CObject internal rep and creates a new
reference to the current TclObject instance if the new rep is not of
type CObject.  Where else is this detection done?

    Jiang>    Tcl_Object <contains> Tcl_Obj

    Jiang> or

    Jiang>    Tcl_Obj <contains> Tcl_Object

    Jiang> The Problem:

    Jiang> The proposed solution is to never use the GC thread to free
    Jiang> Tcl_Obj and always use the thread that created the Tcl_Obj
    Jiang> to free the Tcl_Obj.

My initial impression is that this is the correct way to do it, though
it can be tricky to get all of the reference counting right.


The TclJava mailing list is sponsored by Scriptics Corporation.
To subscribe:    send mail to [EMAIL PROTECTED]  
                 with the word SUBSCRIBE as the subject.
To unsubscribe:  send mail to [EMAIL PROTECTED] 
                 with the word UNSUBSCRIBE as the subject.
To send to the list, send email to '[EMAIL PROTECTED]'. 
An archive is available at http://www.mail-archive.com/tcljava@scriptics.com

Reply via email to