#623 a saner NRE

closed-accepted
5
2010-09-27
2010-09-20
No

Attached a patch that removes all NRE duties from TEBC: it is a relatively big redesign of the NRE main loop.

The original NRE implementation has TclNRRunCallbacks (TNRRC) and TEBC work in tandem, working hard to reuse TEBC instances. The design is at the root of a very complicated logic flow within TEBC and elsewhere.

This patch removes the special NRE status from TEBC. The main advantage is that the logic is much simpler (both within TEBC and elsewhere), leading to enhanced maintainability.

I would appreciate more thorough testing (and perf impact estimates?) before committing this patch.

Discussion

  • miguel sofer

    miguel sofer - 2010-09-20

    a saner NRE

     
  • Alexandre Ferrieux

    Attaching perf measurements with the "10-bench + spacer" technique. The first four columns are normalized times. First line headers give the names:
    - tcl86 == vanilla HEAD
    - tcl86foo == HEAD + 16-byte foo spacer at beginning of regcomp.o
    - tcl86sn == HEAD + Saner Nre patch
    - tcl86snfoo == both
    File sorted on column 3, which is tcl86sn time.
    Bottom line: hard to summarize... range is roughly +-12%, though near both extremes the foo-spacer wipes the effect. Tough...

     
  • Alexandre Ferrieux

    Smoothed tclbench results for Saner Nre patch

     
  • Alexandre Ferrieux

    Also, var.test panics on my system (unix threaded, nondebug):

    Test file error: TclStackFree: incorrect freePtr (0x8421f48 != 0x8421f3f). Call out of sequence?

     
  • miguel sofer

    miguel sofer - 2010-09-21
    • labels: 310723 --> 60. NRE and coroutines
     
  • miguel sofer

    miguel sofer - 2010-09-22

    Note that this patch also fixes Bug #3072640

     
  • miguel sofer

    miguel sofer - 2010-09-22

    Mem corruption: some obj's typePtr points to some (other?) obj's string rep: see valgrind's complaint below.

    Does not at first look like a refCount issue: this is a -DPURIFY build, so that individual objs (and TclSmallAlloc) are all done by calls to ckalloc.

    ==3585== Invalid read of size 4
    ==3585== at 0x807B28B: TclFreeObj (tclObj.c:1413)
    ==3585== by 0x815C50E: TclResumeByteCode (tclExecute.c:6324)
    ==3585== by 0x80DCC7B: TclNRRunCallbacks (tclBasic.c:4312)
    ==3585== by 0x80DEE3F: TclEvalObjEx (tclBasic.c:5887)
    ==3585== by 0x80DEDCE: Tcl_EvalObjEx (tclBasic.c:5868)
    ==3585== by 0x816871B: Tcl_RecordAndEvalObj (tclHistory.c:192)
    ==3585== by 0x80736E6: Tcl_Main (tclMain.c:471)
    ==3585== by 0x80564C4: main (tclAppInit.c:85)
    ==3585== Address 0x4317cbf is 127 bytes inside a block of size 196 free'd
    ==3585== at 0x4024B3A: free (vg_replace_malloc.c:366)
    ==3585== by 0x818E817: TclpFree (tclAlloc.c:730)
    ==3585== by 0x80E7B34: Tcl_Free (tclCkalloc.c:1207)
    ==3585== by 0x807B272: TclFreeObj (tclObj.c:1410)
    ==3585== by 0x815C50E: TclResumeByteCode (tclExecute.c:6324)
    ==3585== by 0x80DCC7B: TclNRRunCallbacks (tclBasic.c:4312)
    ==3585== by 0x80DEE3F: TclEvalObjEx (tclBasic.c:5887)
    ==3585== by 0x80DEDCE: Tcl_EvalObjEx (tclBasic.c:5868)
    ==3585== by 0x816871B: Tcl_RecordAndEvalObj (tclHistory.c:192)
    ==3585== by 0x80736E6: Tcl_Main (tclMain.c:471)
    ==3585== by 0x80564C4: main (tclAppInit.c:85)

     
  • miguel sofer

    miguel sofer - 2010-09-22

    New patch; please apply to HEAD including the 2010-09-22 fixes

     
  • miguel sofer

    miguel sofer - 2010-09-22
     
  • Alexandre Ferrieux

    Moving target, aiming again ;-)
    Attaching new timings:

    - decache_summary.txt just compares before and after the DECACHE_STACK_INFO commits. I know they were necessary, but IMO it's interesting to keep an eye on the needle when doing brain surgery. Result: a maximum of 6% slowdown, not significant given the other deviations with/out the spacer.

    - sn2_summary.txt compares current HEAD with inv2.diff. Result: still <=12%...

     
  • miguel sofer

    miguel sofer - 2010-09-27

    updated patch - ready to commit as soon as I find out how to handle the 1-line change to itcl

     
  • miguel sofer

    miguel sofer - 2010-09-27

    patch ready to commit

     
  • miguel sofer

    miguel sofer - 2010-09-27
    • status: open --> closed-accepted
     
  • miguel sofer

    miguel sofer - 2010-09-27

    Committed