diff options
| author | Miguel Sofer <miguel.sofer@gmail.com> | 2002-08-14 17:31:42 (GMT) | 
|---|---|---|
| committer | Miguel Sofer <miguel.sofer@gmail.com> | 2002-08-14 17:31:42 (GMT) | 
| commit | 4b5d9d688fcfa02e6cbce01873ea40fa7fc62bde (patch) | |
| tree | 8f131b477e23d20a986cef5ee5d879ec86f8f4f1 | |
| parent | e5da04bb09ebf77a289165ed344ef33a59883585 (diff) | |
| download | tcl-4b5d9d688fcfa02e6cbce01873ea40fa7fc62bde.zip tcl-4b5d9d688fcfa02e6cbce01873ea40fa7fc62bde.tar.gz tcl-4b5d9d688fcfa02e6cbce01873ea40fa7fc62bde.tar.bz2 | |
	* generic/tclInt.h:
	* generic/tclObj.c: (code cleanup) factored the parts in the macros
	TclNewObj() / TclDecrRefCount() into a common part for all
	memory allocators and two new macros TclAllocObjStorage() /
	TclFreeObjStorage() that are specific to each allocator and fully
	describe the differences. Removed allocator-specific code from
	tclObj.c by using the macros.
| -rw-r--r-- | ChangeLog | 10 | ||||
| -rw-r--r-- | generic/tclInt.h | 146 | ||||
| -rw-r--r-- | generic/tclObj.c | 44 | 
3 files changed, 73 insertions, 127 deletions
| @@ -1,3 +1,13 @@ +2002-08-14  Miguel Sofer  <msofer@users.sourceforge.net> + +	* generic/tclInt.h: +	* generic/tclObj.c: (code cleanup) factored the parts in the macros  +	TclNewObj() / TclDecrRefCount() into a common part for all +	memory allocators and two new macros TclAllocObjStorage() / +	TclFreeObjStorage() that are specific to each allocator and fully +	describe the differences. Removed allocator-specific code from +	tclObj.c by using the macros. +	  2002-08-12  Miguel Sofer  <msofer@users.sourceforge.net>  	* generic/tclCmdMZ.c: fixing UMR in delete traces, [Bug 589863]. diff --git a/generic/tclInt.h b/generic/tclInt.h index 9193564..2c8f413 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -12,7 +12,7 @@   * See the file "license.terms" for information on usage and redistribution   * of this file, and for a DISCLAIMER OF ALL WARRANTIES.   * - * RCS: @(#) $Id: tclInt.h,v 1.110 2002/08/05 03:24:41 dgp Exp $ + * RCS: @(#) $Id: tclInt.h,v 1.111 2002/08/14 17:31:43 msofer Exp $   */  #ifndef _TCLINT @@ -2108,6 +2108,10 @@ EXTERN Tcl_Obj *TclPtrIncrVar _ANSI_ARGS_((Tcl_Interp *interp, Var *varPtr,   *   * EXTERN void	TclNewObj _ANSI_ARGS_((Tcl_Obj *objPtr));   * EXTERN void	TclDecrRefCount _ANSI_ARGS_((Tcl_Obj *objPtr)); + * + * These macros are defined in terms of two macros that depend on  + * memory allocator in use: TclAllocObjStorage, TclFreeObjStorage. + * They are defined below.   *----------------------------------------------------------------   */ @@ -2121,29 +2125,16 @@ EXTERN Tcl_Obj *TclPtrIncrVar _ANSI_ARGS_((Tcl_Interp *interp, Var *varPtr,  #  define TclIncrObjsFreed()  #endif /* TCL_COMPILE_STATS */ -#ifdef TCL_MEM_DEBUG -#  define TclNewObj(objPtr) \ -    (objPtr) = (Tcl_Obj *) \ -	 Tcl_DbCkalloc(sizeof(Tcl_Obj), __FILE__, __LINE__); \ -    (objPtr)->refCount = 0; \ -    (objPtr)->bytes    = tclEmptyStringRep; \ -    (objPtr)->length   = 0; \ -    (objPtr)->typePtr  = NULL; \ -    TclIncrObjsAllocated() -      -#  define TclDbNewObj(objPtr, file, line) \ -    (objPtr) = (Tcl_Obj *) Tcl_DbCkalloc(sizeof(Tcl_Obj), (file), (line)); \ +#define TclNewObj(objPtr) \ +    TclAllocObjStorage(objPtr); \ +    TclIncrObjsAllocated(); \      (objPtr)->refCount = 0; \      (objPtr)->bytes    = tclEmptyStringRep; \      (objPtr)->length   = 0; \ -    (objPtr)->typePtr  = NULL; \ -    TclIncrObjsAllocated() -      -#  define TclDecrRefCount(objPtr) \ +    (objPtr)->typePtr  = NULL + +#define TclDecrRefCount(objPtr) \      if (--(objPtr)->refCount <= 0) { \ -	if ((objPtr)->refCount < -1) \ -	    panic("Reference count for %lx was negative: %s line %d", \ -		  (objPtr), __FILE__, __LINE__); \  	if (((objPtr)->typePtr != NULL) \  		&& ((objPtr)->typePtr->freeIntRepProc != NULL)) { \  	    (objPtr)->typePtr->freeIntRepProc(objPtr); \ @@ -2152,10 +2143,30 @@ EXTERN Tcl_Obj *TclPtrIncrVar _ANSI_ARGS_((Tcl_Interp *interp, Var *varPtr,  		&& ((objPtr)->bytes != tclEmptyStringRep)) { \  	    ckfree((char *) (objPtr)->bytes); \  	} \ -	ckfree((char *) (objPtr)); \ +        TclFreeObjStorage(objPtr); \  	TclIncrObjsFreed(); \      } +#ifdef TCL_MEM_DEBUG +#  define TclAllocObjStorage(objPtr) \ +       (objPtr) = (Tcl_Obj *) \ +           Tcl_DbCkalloc(sizeof(Tcl_Obj), __FILE__, __LINE__) + +#  define TclFreeObjStorage(objPtr) \ +       if ((objPtr)->refCount < -1) { \ +           panic("Reference count for %lx was negative: %s line %d", \ +	           (objPtr), __FILE__, __LINE__); \ +       } \ +       ckfree((char *) (objPtr)) +      +#  define TclDbNewObj(objPtr, file, line) \ +       (objPtr) = (Tcl_Obj *) Tcl_DbCkalloc(sizeof(Tcl_Obj), (file), (line)); \ +       (objPtr)->refCount = 0; \ +       (objPtr)->bytes    = tclEmptyStringRep; \ +       (objPtr)->length   = 0; \ +       (objPtr)->typePtr  = NULL; \ +       TclIncrObjsAllocated() +       #elif defined(PURIFY)  /* @@ -2165,27 +2176,11 @@ EXTERN Tcl_Obj *TclPtrIncrVar _ANSI_ARGS_((Tcl_Interp *interp, Var *varPtr,   * better track memory leaks   */ -#  define TclNewObj(objPtr) \ -    (objPtr) = (Tcl_Obj *) Tcl_Ckalloc(sizeof(Tcl_Obj)); \ -    (objPtr)->refCount = 0; \ -    (objPtr)->bytes    = tclEmptyStringRep; \ -    (objPtr)->length   = 0; \ -    (objPtr)->typePtr  = NULL; \ -    TclIncrObjsAllocated(); +#  define TclAllocObjStorage(objPtr) \ +       (objPtr) = (Tcl_Obj *) Tcl_Ckalloc(sizeof(Tcl_Obj)) -#  define TclDecrRefCount(objPtr) \ -    if (--(objPtr)->refCount <= 0) { \ -	if (((objPtr)->typePtr != NULL) \ -		&& ((objPtr)->typePtr->freeIntRepProc != NULL)) { \ -	    (objPtr)->typePtr->freeIntRepProc(objPtr); \ -	} \ -	if (((objPtr)->bytes != NULL) \ -		&& ((objPtr)->bytes != tclEmptyStringRep)) { \ -	    ckfree((char *) (objPtr)->bytes); \ -	} \ -	ckfree((char *) (objPtr)); \ -	TclIncrObjsFreed(); \ -    } +#  define TclFreeObjStorage(objPtr) \ +       ckfree((char *) (objPtr))  #elif defined(TCL_THREADS) && defined(USE_THREAD_ALLOC) @@ -2197,25 +2192,11 @@ EXTERN Tcl_Obj *TclPtrIncrVar _ANSI_ARGS_((Tcl_Interp *interp, Var *varPtr,  EXTERN Tcl_Obj *TclThreadAllocObj _ANSI_ARGS_((void));  EXTERN void TclThreadFreeObj _ANSI_ARGS_((Tcl_Obj *)); -#  define TclNewObj(objPtr) \ -       (objPtr) = TclThreadAllocObj(); \ -       (objPtr)->refCount = 0; \ -       (objPtr)->bytes    = tclEmptyStringRep; \ -       (objPtr)->length   = 0; \ -       (objPtr)->typePtr  = NULL - -#  define TclDecrRefCount(objPtr) \ -       if (--(objPtr)->refCount <= 0) { \ -           if (((objPtr)->typePtr != NULL) \ -                   && ((objPtr)->typePtr->freeIntRepProc != NULL)) { \ -               (objPtr)->typePtr->freeIntRepProc(objPtr); \ -           } \ -           if (((objPtr)->bytes != NULL) \ -                   && ((objPtr)->bytes != tclEmptyStringRep)) { \ -               ckfree((char *) (objPtr)->bytes); \ -           } \ -           TclThreadFreeObj((objPtr)); \ -       } +#  define TclAllocObjStorage(objPtr) \ +       (objPtr) = TclThreadAllocObj() + +#  define TclFreeObjStorage(objPtr) \ +       TclThreadFreeObj((objPtr))  #else /* not TCL_MEM_DEBUG */ @@ -2224,37 +2205,22 @@ EXTERN void TclThreadFreeObj _ANSI_ARGS_((Tcl_Obj *));  extern Tcl_Mutex tclObjMutex;  #endif -#  define TclNewObj(objPtr) \ -    Tcl_MutexLock(&tclObjMutex); \ -    if (tclFreeObjList == NULL) { \ -	TclAllocateFreeObjects(); \ -    } \ -    (objPtr) = tclFreeObjList; \ -    tclFreeObjList = (Tcl_Obj *) \ -	tclFreeObjList->internalRep.otherValuePtr; \ -    (objPtr)->refCount = 0; \ -    (objPtr)->bytes    = tclEmptyStringRep; \ -    (objPtr)->length   = 0; \ -    (objPtr)->typePtr  = NULL; \ -    TclIncrObjsAllocated(); \ -    Tcl_MutexUnlock(&tclObjMutex) +#  define TclAllocObjStorage(objPtr) \ +       Tcl_MutexLock(&tclObjMutex); \ +       if (tclFreeObjList == NULL) { \ +	   TclAllocateFreeObjects(); \ +       } \ +       (objPtr) = tclFreeObjList; \ +       tclFreeObjList = (Tcl_Obj *) \ +	   tclFreeObjList->internalRep.otherValuePtr; \ +       Tcl_MutexUnlock(&tclObjMutex) + +#  define TclFreeObjStorage(objPtr) \ +       Tcl_MutexLock(&tclObjMutex); \ +       (objPtr)->internalRep.otherValuePtr = (VOID *) tclFreeObjList; \ +       tclFreeObjList = (objPtr); \ +       Tcl_MutexUnlock(&tclObjMutex) -#  define TclDecrRefCount(objPtr) \ -    if (--(objPtr)->refCount <= 0) { \ -	if (((objPtr)->typePtr != NULL) \ -		&& ((objPtr)->typePtr->freeIntRepProc != NULL)) { \ -	    (objPtr)->typePtr->freeIntRepProc(objPtr); \ -	} \ -	if (((objPtr)->bytes != NULL) \ -		&& ((objPtr)->bytes != tclEmptyStringRep)) { \ -	    ckfree((char *) (objPtr)->bytes); \ -	} \ -	Tcl_MutexLock(&tclObjMutex); \ -	(objPtr)->internalRep.otherValuePtr = (VOID *) tclFreeObjList; \ -	tclFreeObjList = (objPtr); \ -	TclIncrObjsFreed(); \ -	Tcl_MutexUnlock(&tclObjMutex); \ -    }  #endif /* TCL_MEM_DEBUG */  /* diff --git a/generic/tclObj.c b/generic/tclObj.c index 7ecf030..2eb61fd 100644 --- a/generic/tclObj.c +++ b/generic/tclObj.c @@ -11,7 +11,7 @@   * See the file "license.terms" for information on usage and redistribution   * of this file, and for a DISCLAIMER OF ALL WARRANTIES.   * - * RCS: @(#) $Id: tclObj.c,v 1.38 2002/08/07 17:13:56 msofer Exp $ + * RCS: @(#) $Id: tclObj.c,v 1.39 2002/08/14 17:31:43 msofer Exp $   */  #include "tclInt.h" @@ -516,30 +516,11 @@ Tcl_NewObj()      register Tcl_Obj *objPtr;      /* -     * Allocate the object using the list of free Tcl_Obj structs -     * we maintain. +     * Use the macro defined in tclInt.h - it will use the +     * correct allocator.       */ -    Tcl_MutexLock(&tclObjMutex); -#ifdef PURIFY -    objPtr = (Tcl_Obj *) Tcl_Ckalloc(sizeof(Tcl_Obj)); -#elif defined(TCL_THREADS) && defined(USE_THREAD_ALLOC) -    objPtr = TclThreadAllocObj();  -#else -    if (tclFreeObjList == NULL) { -	TclAllocateFreeObjects(); -    } -    objPtr = tclFreeObjList; -    tclFreeObjList = (Tcl_Obj *) tclFreeObjList->internalRep.otherValuePtr; -#endif -    objPtr->refCount = 0; -    objPtr->bytes    = tclEmptyStringRep; -    objPtr->length   = 0; -    objPtr->typePtr  = NULL; -#ifdef TCL_COMPILE_STATS -    tclObjsAlloced++; -#endif /* TCL_COMPILE_STATS */ -    Tcl_MutexUnlock(&tclObjMutex); +    TclNewObj(objPtr);      return objPtr;  }  #endif /* TCL_MEM_DEBUG */ @@ -583,24 +564,13 @@ Tcl_DbNewObj(file, line)      register Tcl_Obj *objPtr;      /* -     * If debugging Tcl's memory usage, allocate the object using ckalloc. -     * Otherwise, allocate it using the list of free Tcl_Obj structs we -     * maintain. +     * Use the macro defined in tclInt.h - it will use the +     * correct allocator.       */ -    objPtr = (Tcl_Obj *) Tcl_DbCkalloc(sizeof(Tcl_Obj), file, line); -    objPtr->refCount = 0; -    objPtr->bytes    = tclEmptyStringRep; -    objPtr->length   = 0; -    objPtr->typePtr  = NULL; -#ifdef TCL_COMPILE_STATS -    Tcl_MutexLock(&tclObjMutex); -    tclObjsAlloced++; -    Tcl_MutexUnlock(&tclObjMutex); -#endif /* TCL_COMPILE_STATS */ +    TclDbNewObj(objPtr, file, line);      return objPtr;  } -  #else /* if not TCL_MEM_DEBUG */  Tcl_Obj * | 
