Posted to tcl by karll at Wed Mar 25 21:15:16 GMT 2015view pretty

#
# tcl thread eventmark bug demo
#
# creates a producer thread and uses the main thread as a consumer thread
#
# the consumer thread sends to the producer thread to invoke blast,
# a proc that continuously generates async events to the consumer thread
#
# the consumer thread is configured using thread::configure -eventmark
# to limit the number of asynchronously posted scripts to the consumer's
# thread event loop
#
# the bug is that once the eventmark limit is reached, no further events
# are sent
#
# apparently the consumer consuming events does not decrease the number
# of pending events that the eventmark is looking at, or the act of
# performing pending events does not wake up the producer
#
# if you comment out the eventmark config, it works as expected
#
# also if you use thread::wait on the consumer thread instead of vwait
# it works
#

package require Thread

set consumerThread [thread::id]

thread::configure $consumerThread -eventmark 20

set producerThread [thread::create {

proc blast {thread} {
	while true {
		thread::send -async $thread hiya
	}
}

thread::wait
}]

proc hiya {} {
	puts "hiya [incr ::hiyaCount]"
}

thread::send -async $producerThread [list blast $consumerThread]

vwait die
#thread::wait