On Thu, 18 Apr 2002, Rusty Brooks wrote:

> The point being, if I had a method to bring one of the shared variables into
> the current context, like ns_share did, then all other procedures downstream
> could be blissfully unaware if they were shared or not.

How about using variable read/write traces to mimic the old ns_share
behaviour using nsv's? Here's a quick lunch time first stab at it:

    proc nsv->ns_share {nsv name1 name2 op} {
        upvar 1 $name1 var
        set value [nsv_get $nsv $name2]
        switch [string equal $name2 ""] {
            0 { set var($name2) $value }
            1 { set var $value }
        }
    }

    proc ns_share->nsv {nsv name1 name2 op} {
        upvar 1 $name1 var
        if [string equal $name2 ""] {
            set value $var
        } else {
            set value $var($name2)
        }
        nsv_set $nsv $name2 $value
    }

    proc NS_SHARE {var} {
        if {[lsearch -exact [nsv_names] $var] != -1} {
            if {[nsv_array names $var] == [list [list]]} {
                uplevel 1 [list set $var [nsv_get $var ""]]
            } else {
                uplevel 1 [list array set $var [nsv_array get $var]]
            }
        }
        uplevel 1 [list trace var $var r "nsv->ns_share [list $var]"]
        uplevel 1 [list trace var $var w "ns_share->nsv [list $var]"]
    }

I suppose it might also be good to overload/redefine/extend [array] so
that it checks to see if other array elements have been added in another
thread or something.  Also an unset trace on array elements to remove them
from the nsv...  Anyway, perhaps a place to start to make the migration
easier/less painful (or code more readable).

Michael

Reply via email to