Folks,

    Currently we have all these XXXRegisterDestroy() routines that are not 
called

petscao.h:PETSC_EXTERN PetscErrorCode AORegisterDestroy(void);
petsccharacteristic.h:PETSC_EXTERN PetscErrorCode 
CharacteristicRegisterDestroy(void);
petscdm.h:PETSC_EXTERN PetscErrorCode DMRegisterDestroy(void);
petscdraw.h:PETSC_EXTERN PetscErrorCode PetscDrawRegisterDestroy(void);
petscis.h:PETSC_EXTERN PetscErrorCode ISRegisterDestroy(void);
petscksp.h:PETSC_EXTERN PetscErrorCode KSPRegisterDestroy(void);
petscmat.h:PETSC_EXTERN PetscErrorCode MatOrderingRegisterDestroy(void);
petscmat.h:PETSC_EXTERN PetscErrorCode MatColoringRegisterDestroy(void);
petscmat.h:PETSC_EXTERN PetscErrorCode MatPartitioningRegisterDestroy(void);
petscmat.h:PETSC_EXTERN PetscErrorCode MatCoarsenRegisterDestroy(void);
petscmat.h:PETSC_EXTERN PetscErrorCode MatMFFDRegisterDestroy(void);
petscpc.h:PETSC_EXTERN PetscErrorCode PCRegisterDestroy(void);
petscpf.h:PETSC_EXTERN PetscErrorCode PFRegisterDestroy(void);
petscsf.h:PETSC_EXTERN PetscErrorCode PetscSFRegisterDestroy(void);
petscsnes.h:PETSC_EXTERN PetscErrorCode SNESRegisterDestroy(void);
petscsnes.h:PETSC_EXTERN PetscErrorCode SNESLineSearchRegisterDestroy(void);
petscsnes.h:PETSC_EXTERN PetscErrorCode SNESMSRegisterDestroy(void);
petscsys.h:PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroy(PetscObject);
petscsys.h:PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroyAll(void);
petscsys.h:PETSC_EXTERN PetscErrorCode PetscRandomRegisterDestroy(void);
petscthreadcomm.h:PETSC_EXTERN PetscErrorCode 
PetscThreadCommRegisterDestroy(void);
petscts.h:PETSC_EXTERN PetscErrorCode TSRegisterDestroy(void);
petscts.h:PETSC_EXTERN PetscErrorCode TSAdaptRegisterDestroy(void);
petscts.h:PETSC_EXTERN PetscErrorCode TSGLAdaptRegisterDestroy(void);
petscts.h:PETSC_EXTERN PetscErrorCode TSGLRegisterDestroy(void);
petscts.h:PETSC_EXTERN PetscErrorCode TSARKIMEXRegisterDestroy(void);
petscts.h:PETSC_EXTERN PetscErrorCode TSRosWRegisterDestroy(void);
petscvec.h:PETSC_EXTERN PetscErrorCode VecRegisterDestroy(void);
petscviewer.h:PETSC_EXTERN PetscErrorCode PetscViewerRegisterDestroy(void);

The only one that is called is PetscThreadCommRegisterDestroy() and that is 
actually a (harmless) bug.

Currently PetscFunctionListAdd() maintains a list of all function lists in 
existence and in PetscFinalize() PetscFunctionListDestroyAll() loops over all 
the list of lists destroying each list. Thus all of these lists are destroyed 
without the XXXRegisterDestroy() needing to be called. A drawback is that 
PetscFunctionListDestroyAll() is called before some of the XXXFinalizePackage() 
are called thus leaving XXXList global variables pointing to freed memory (this 
is why for example VecFinalizePackage() has   VecList               = NULL; in 
it.) 

  I propose the following change; each appropriate XXXFinalizePackage() call 
the appropriate XXXRegisterDestroy() (this would replace the VecList            
   = NULL; lines) and PetscFunctionListDestroyAll() be renamed to just generate 
a dump of any lists that don't get properly freed. 

   Comments? I'd like to do it soon so it gets tested before the release but it 
is pretty straightforward,

  Barry







Reply via email to