You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
4.1 KiB
129 lines
4.1 KiB
set arg1 [lindex $::argv 0] |
|
|
|
interp create code1 |
|
interp create code2 |
|
|
|
puts stdout "Testing target interpreter of thread::send." |
|
puts stdout "For tcl 8.6 (?) The target interp can vary depending on which interp first called a thread function such as thread::id." |
|
puts stdout "For tcl 9 - there is a difference between -async and non-async target interp *when sending to own thread*" |
|
puts stdout "loading Thread package in all interps" |
|
puts stdout "auto_path in parent interp: $::auto_path" |
|
code1 eval [list set ::auto_path $::auto_path] |
|
code2 eval [list set ::auto_path $::auto_path] |
|
|
|
set tversion_code1 [code1 eval {package require Thread}] |
|
set tversion_code2 [code2 eval {package require Thread}] |
|
set tversion_parent [package require Thread] |
|
#puts stdout "Thread version in parent interp: $tversion_parent" |
|
|
|
puts stdout "establishing ::testfunc proc in all interps" |
|
code1 eval {proc ::testfunc {args} {puts stdout "evaluated in \x1b\[31mcode1\x1b\[m interp: $args"}} |
|
code2 eval {proc ::testfunc {args} {puts stderr "evaluated in \x1b\[33mcode2\x1b\[m interp: $args"}} |
|
proc ::testfunc {args} {puts stdout "evaluated in \x1b\[32mparent\x1b\[m interp: $args"} |
|
|
|
|
|
puts stderr "Calling a thread function in nominated interp '$arg1' first" |
|
#1st use of thread function makes that interp the one to receive all subsequent messages |
|
switch -- $arg1 { |
|
parent { |
|
thread::id |
|
} |
|
code1 { |
|
code1 eval {thread::id} |
|
} |
|
code2 { |
|
code2 eval {thread::id} |
|
} |
|
default { |
|
#puts stderr "Usage thread_interp.tcl parent|code1|code2" |
|
puts stderr "Usage thread_interp.tcl parent|code1" |
|
exit 1 |
|
} |
|
} |
|
|
|
|
|
puts stdout "sending scripts" |
|
|
|
puts stdout "send to own thread::id from child interp" |
|
puts stdout "----------------------------------------" |
|
#sending to own thread from child interp. |
|
code1 eval { |
|
thread::send [thread::id] { |
|
::testfunc script sent from code1 interp |
|
} |
|
} |
|
code1 eval { |
|
package require Thread |
|
thread::send -async [thread::id] { |
|
::testfunc script sent from code1 interp with -async |
|
} |
|
} |
|
|
|
code1 eval { |
|
thread::send [thread::id] {} |
|
} |
|
after 1000 |
|
puts stdout "----------------------------------------" |
|
flush stdout |
|
|
|
code2 eval { |
|
thread::send [thread::id] { |
|
::testfunc script sent from code2 interp |
|
} |
|
} |
|
code2 eval { |
|
package require Thread |
|
thread::send -async [thread::id] { |
|
::testfunc script sent from code2 interp with -async |
|
} |
|
} |
|
|
|
code1 eval { |
|
set workertid [thread::create] |
|
thread::send $workertid {package require Thread} |
|
thread::send -async $workertid [list thread::send [thread::id] { |
|
::testfunc script sent from code1 interp via worker |
|
}] |
|
} |
|
code1 eval { |
|
set workertid [thread::create] |
|
thread::send $workertid {package require Thread} |
|
thread::send $workertid [list thread::send -async [thread::id] { |
|
::testfunc script sent from code1 interp via worker -async |
|
}] |
|
} |
|
|
|
|
|
set workertid [thread::create -preserved] |
|
thread::send -async $workertid [list set ::auto_path $::auto_path] |
|
#thread::send -async $workertid {package require Thread} |
|
thread::send -async $workertid {interp create code1} |
|
thread::send $workertid [list code1 eval [list set ::auto_path $::auto_path]] |
|
thread::send $workertid [list code1 eval {package require Thread}] |
|
#thread::send -async $workertid {puts --------------------; flush stdout} |
|
thread::send -async $workertid [list code1 eval {puts stdout "workerthread: [thread::id]"}] |
|
thread::send -async $workertid [list code1 eval [list thread::send [thread::id] { |
|
::testfunc script sent from worker |
|
}]] |
|
after idle {set ::done 1} |
|
vwait ::done |
|
#exit 1 |
|
thread::send -async $workertid [list thread::send -async [thread::id] { |
|
::testfunc script sent from parent interp via worker -async |
|
}] |
|
thread::send [thread::id] { |
|
::testfunc script sent from parent interp |
|
} |
|
thread::send -async [thread::id] { |
|
::testfunc script sent from parent interp with -async |
|
} |
|
puts stdout "done sending scripts" |
|
flush stdout |
|
|
|
|
|
after idle {set ::done 1} |
|
#after 1000 {set ::done 1} |
|
vwait ::done |
|
|
|
|
|
|
|
|