Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | 3532959 Make sure the lifetime management of entries in the linePBodyPtr hash table can tolerate either order of teardown, interp first, or Proc first. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | core-8-5-branch |
Files: | files | file ages | folders |
SHA1: |
20de131aef784fcddaacdc789e53c5ef |
User & Date: | dgp 2012-06-11 17:34:35 |
Context
2012-06-12
| ||
12:35 | add test that triggered reporting of [Bug 3530230] check-in: 25c42cd3dc user: dkf tags: core-8-5-branch | |
2012-06-11
| ||
22:25 | First draft patch to fix Bug 3024359. No reliable test yet. check-in: a5173a4b74 user: dgp tags: bug-3024359 | |
17:49 | 3532959 Make sure the lifetime management of entries in the linePBodyPtr hash table can tolerate eit... check-in: bfddfa54a6 user: dgp tags: trunk | |
17:34 | 3532959 Make sure the lifetime management of entries in the linePBodyPtr hash table can tolerate eit... check-in: 20de131aef user: dgp tags: core-8-5-branch | |
12:21 | Revised so that we avoid hashing twice. Closed-Leaf check-in: 0e61587a63 user: dgp tags: bug-3532959 | |
2012-06-08
| ||
13:14 | Update autogoo for gettimeofday(). Thanks Joe English. check-in: a5996386b3 user: dgp tags: core-8-5-branch | |
Changes
Changes to ChangeLog.
1 2 3 4 5 6 7 | 2012-06-08 Don Porter <[email protected]> * unix/configure.in: Update autogoo for gettimeofday(). * unix/tclUnixPort.h: Thanks Joe English. * unix/configure: autoconf 2.13 * unix/tclUnixPort.h: [Bug 3530533] Centralize #include <pthread.h> | > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 2012-06-11 Don Porter <[email protected]> * generic/tclBasic.c: [Bug 3532959] Make sure the lifetime management * generic/tclProc.c: of entries in the linePBodyPtr hash table can * tests/proc.test: tolerate either order of teardown, interp first, or Proc first. 2012-06-08 Don Porter <[email protected]> * unix/configure.in: Update autogoo for gettimeofday(). * unix/tclUnixPort.h: Thanks Joe English. * unix/configure: autoconf 2.13 * unix/tclUnixPort.h: [Bug 3530533] Centralize #include <pthread.h> |
︙ | ︙ |
Changes to generic/tclBasic.c.
︙ | ︙ | |||
1384 1385 1386 1387 1388 1389 1390 | Tcl_HashSearch hSearch; int i; for (hPtr = Tcl_FirstHashEntry(iPtr->linePBodyPtr, &hSearch); hPtr != NULL; hPtr = Tcl_NextHashEntry(&hSearch)) { CmdFrame *cfPtr = Tcl_GetHashValue(hPtr); | | > > | | | | | > | 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 | Tcl_HashSearch hSearch; int i; for (hPtr = Tcl_FirstHashEntry(iPtr->linePBodyPtr, &hSearch); hPtr != NULL; hPtr = Tcl_NextHashEntry(&hSearch)) { CmdFrame *cfPtr = Tcl_GetHashValue(hPtr); Proc *procPtr = (Proc *) Tcl_GetHashKey(iPtr->linePBodyPtr, hPtr); procPtr->iPtr = NULL; if (cfPtr) { if (cfPtr->type == TCL_LOCATION_SOURCE) { Tcl_DecrRefCount(cfPtr->data.eval.path); } ckfree((char *) cfPtr->line); ckfree((char *) cfPtr); } Tcl_DeleteHashEntry(hPtr); } Tcl_DeleteHashTable(iPtr->linePBodyPtr); ckfree((char *) iPtr->linePBodyPtr); iPtr->linePBodyPtr = NULL; /* |
︙ | ︙ |
Changes to generic/tclProc.c.
︙ | ︙ | |||
2194 2195 2196 2197 2198 2199 2200 | /* * TIP #280: Release the location data associated with this Proc * structure, if any. The interpreter may not exist (For example for * procbody structures created by tbcload. See also Tcl_ProcObjCmd(), when * the same ProcPtr is overwritten with a new CmdFrame. */ | | > | | | | | | | > | 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 | /* * TIP #280: Release the location data associated with this Proc * structure, if any. The interpreter may not exist (For example for * procbody structures created by tbcload. See also Tcl_ProcObjCmd(), when * the same ProcPtr is overwritten with a new CmdFrame. */ if (iPtr == NULL) { return; } hePtr = Tcl_FindHashEntry(iPtr->linePBodyPtr, (char *) procPtr); if (!hePtr) { return; } cfPtr = (CmdFrame *) Tcl_GetHashValue(hePtr); if (cfPtr) { if (cfPtr->type == TCL_LOCATION_SOURCE) { Tcl_DecrRefCount(cfPtr->data.eval.path); cfPtr->data.eval.path = NULL; } ckfree((char *) cfPtr->line); cfPtr->line = NULL; ckfree((char *) cfPtr); } Tcl_DeleteHashEntry(hePtr); } /* *---------------------------------------------------------------------- * * TclUpdateReturnInfo -- |
︙ | ︙ | |||
2443 2444 2445 2446 2447 2448 2449 | SetLambdaFromAny( Tcl_Interp *interp, /* Used for error reporting if not NULL. */ register Tcl_Obj *objPtr) /* The object to convert. */ { Interp *iPtr = (Interp *) interp; char *name; Tcl_Obj *argsPtr, *bodyPtr, *nsObjPtr, **objv, *errPtr; | | > | 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 | SetLambdaFromAny( Tcl_Interp *interp, /* Used for error reporting if not NULL. */ register Tcl_Obj *objPtr) /* The object to convert. */ { Interp *iPtr = (Interp *) interp; char *name; Tcl_Obj *argsPtr, *bodyPtr, *nsObjPtr, **objv, *errPtr; int isNew, objc, result; CmdFrame *cfPtr = NULL; Proc *procPtr; if (interp == NULL) { return TCL_ERROR; } /* |
︙ | ︙ | |||
2540 2541 2542 2543 2544 2545 2546 | /* * We can record source location within a lambda only if the body * was not created by substitution. */ if (contextPtr->line && (contextPtr->nline >= 2) && (contextPtr->line[1] >= 0)) { | | < > < < < > > | 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 | /* * We can record source location within a lambda only if the body * was not created by substitution. */ if (contextPtr->line && (contextPtr->nline >= 2) && (contextPtr->line[1] >= 0)) { int buf[2]; /* * Move from approximation (line of list cmd word) to actual * location (line of 2nd list element). */ cfPtr = (CmdFrame *) ckalloc(sizeof(CmdFrame)); TclListLines(objPtr, contextPtr->line[1], 2, buf, NULL); cfPtr->level = -1; cfPtr->type = contextPtr->type; cfPtr->line = (int *) ckalloc(sizeof(int)); cfPtr->line[0] = buf[1]; cfPtr->nline = 1; cfPtr->framePtr = NULL; cfPtr->nextPtr = NULL; cfPtr->data.eval.path = contextPtr->data.eval.path; Tcl_IncrRefCount(cfPtr->data.eval.path); cfPtr->cmd.str.cmd = NULL; cfPtr->cmd.str.len = 0; } /* * 'contextPtr' is going out of scope. Release the reference that * it's holding to the source file path */ Tcl_DecrRefCount(contextPtr->data.eval.path); } TclStackFree(interp, contextPtr); } Tcl_SetHashValue(Tcl_CreateHashEntry(iPtr->linePBodyPtr, (char *) procPtr, &isNew), cfPtr); /* * Set the namespace for this lambda: given by objv[2] understood as a * global reference, or else global per default. */ if (objc == 2) { |
︙ | ︙ |
Changes to tests/proc.test.
︙ | ︙ | |||
387 388 389 390 391 392 393 394 395 396 397 398 399 400 | return $i } set res [list [catch {ugly::foo} msg] $msg] namespace delete ugly set res } {0 4} # cleanup catch {rename p ""} catch {rename t ""} ::tcltest::cleanupTests return | > > > > > > > > | 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 | return $i } set res [list [catch {ugly::foo} msg] $msg] namespace delete ugly set res } {0 4} test proc-7.4 {Proc struct outlives its interp: Bug 3532959} { set lambda x lappend lambda {set a 1} interp create slave slave eval [list apply $lambda foo] interp delete slave unset lambda } {} # cleanup catch {rename p ""} catch {rename t ""} ::tcltest::cleanupTests return |