How to detect an error in a Tcl thread fileevent or after script -


in main thread trying detect , respond error occurs in worker thread's fileevent script. wrote test script try detect thread errors in 4 cases:

  1. synchronous thread::send, immediate error in thread
  2. synchronous thread::send, error in thread after script
  3. asynchronous thread::send, immediate error in thread
  4. asynchronous thread::send, error in thread after script

i used after command in test thread (hopefully) mimic fileevent script. expected, case 1 thread error caught via catch of thread::send command , case 3 thread error caught thread::errorproc procedure , custom bgerror procedure. cases 2 , 4 thread errors reflected in main thread can't seem catch them via custom procedures.

following test script:

    #!/usr/bin/env tclsh       package require thread;       # custom error handling procedure errors during asynchronous thread::send     proc error_proc {id error} {             puts "\n---------- error_proc: $id $error **********\n";     }     thread::errorproc error_proc;       # custom error , bgerror procedures try see thread error     rename error original_error;     proc error {err} {             puts "---------- error: $err\n";     }     proc bgerror {err} {             puts "---------- bgerror: $err\n";     }       # non-blocking wait procedure keep output in order     proc waitms {ms} {             set ::done 0;             after $ms {set ::done 1};             vwait ::done;     }       # create worker thread     set tid [thread::create {              proc test_error_immediately {s} {                     error "test_error_immediately ($s)";             }              proc test_error_after {ms s} {                     after $ms [list error "test_error_after ($s)"];             }              thread::wait;              puts "---------- exiting thread";     }]       # test case 1 - synchronous thread::send, immediate error     if {[catch {thread::send $tid [list test_error_immediately "case 1"]} result]} {             set state "error";     } else {             set state "ok";     }     puts "---------- synchronous test_error_immediately $state ($result)\n"       # test case 2 - synchronous thread::send, error in thread after script     if {[catch {thread::send $tid [list test_error_after 1000 "case 2"]} result]} {             set state "error";     } else {             set state "ok";     }     puts "---------- synchronous test_error_after $state ($result)\n";       # wait output in order     waitms 1500;       # test case 3 - asynchronous thread::send, immediate error     if {[catch {thread::send -async $tid [list test_error_immediately "case 3"] result} catch_result]} {             set state "error";             set result $catch_result;     } else {             set state "ok";             vwait result;     }     puts "---------- asynchronous test_error_immediately $state ($result)\n";       # wait output in order     waitms 100;       # test case 4 - asynchronous thread::send, error in thread after script     if {[catch {thread::send -async $tid [list test_error_after 1000 "case 4"] result} catch_result]} {             set state "error";             set result $catch_result;     } else {             set state "ok";             vwait result;     }     puts "---------- asynchronous test_error_after $state ($result)\n";       # clean     if {[thread::exists $tid]} {              after 2000 {                     thread::release $::tid;                     puts "\n---------- $::tid released\n";             }     }       puts "---------- waiting forever ...\n";       vwait forever; 

following output on computer:

    ---------- synchronous test_error_immediately error (test_error_immediately (case 1))      ---------- synchronous test_error_after ok (after#0)      test_error_after (case 2)         while executing     "error {test_error_after (case 2)}"         ("after" script)      ---------- error_proc: tid0x7f5673e9d700 test_error_immediately (case 3)         while executing     "error "test_error_immediately ($s)""         (procedure "test_error_immediately" line 2)         invoked within     "test_error_immediately {case 3}" **********      ---------- asynchronous test_error_immediately ok (test_error_immediately (case 3))      ---------- bgerror: test_error_immediately (case 3)      ---------- asynchronous test_error_after ok (after#1)      ---------- waiting forever ...      test_error_after (case 4)         while executing     "error {test_error_after (case 4)}"         ("after" script)      ---------- tid0x7f5673e9d700 released      ---------- exiting thread 

i using tcl 8.5 , ubuntu 10.04 lts.

do have other suggestions on how detect error occurs within thread's fileevent or after script?

regards,
smercer


Comments

Popular posts from this blog

ios - UITEXTFIELD InputView Uipicker not working in swift -

Hatching array of circles in AutoCAD using c# -