1d9262e54SJed Brown 2c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 3d9262e54SJed Brown 48bf1f09cSShri Abhyankar #if defined(PETSC_USE_DEBUG) 5d9262e54SJed Brown 6997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL) 7997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack *petscstack = 0; 8fe89fe5aSShri Abhyankar #else 97087cfbeSBarry Smith PetscStack *petscstack = 0; 10fe89fe5aSShri Abhyankar #endif 11d9262e54SJed Brown 12d9262e54SJed Brown #undef __FUNCT__ 13d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish" 147087cfbeSBarry Smith PetscErrorCode PetscStackPublish(void) 15d9262e54SJed Brown { 16d9262e54SJed Brown PetscFunctionBegin; 17d9262e54SJed Brown PetscFunctionReturn(0); 18d9262e54SJed Brown } 19d9262e54SJed Brown 20d9262e54SJed Brown #undef __FUNCT__ 21d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish" 227087cfbeSBarry Smith PetscErrorCode PetscStackDepublish(void) 23d9262e54SJed Brown { 24d9262e54SJed Brown PetscFunctionBegin; 25d9262e54SJed Brown PetscFunctionReturn(0); 26d9262e54SJed Brown } 27d9262e54SJed Brown 28d9262e54SJed Brown #undef __FUNCT__ 29d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate" 307087cfbeSBarry Smith PetscErrorCode PetscStackCreate(void) 31d9262e54SJed Brown { 32d9262e54SJed Brown PetscErrorCode ierr; 33d9262e54SJed Brown 34d9262e54SJed Brown PetscStack *petscstack_in; 35d9262e54SJed Brown if (petscstack) return 0; 36d9262e54SJed Brown 37d9262e54SJed Brown ierr = PetscNew(PetscStack,&petscstack_in);CHKERRQ(ierr); 38d9262e54SJed Brown petscstack_in->currentsize = 0; 39d9262e54SJed Brown petscstack = petscstack_in; 40*61d886c9SShri Abhyankar PetscThreadLocalSetValue(petscstack,petscstack); /* Sets the value for the pthread_key_t if it is used */ 41d9262e54SJed Brown return 0; 42d9262e54SJed Brown } 43d9262e54SJed Brown 44d9262e54SJed Brown #undef __FUNCT__ 45d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 467087cfbeSBarry Smith PetscErrorCode PetscStackView(PetscViewer viewer) 47d9262e54SJed Brown { 48d9262e54SJed Brown PetscErrorCode ierr; 49d9262e54SJed Brown int i; 50d9262e54SJed Brown FILE *file; 51d9262e54SJed Brown 52d9262e54SJed Brown if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF; 53d9262e54SJed Brown ierr = PetscViewerASCIIGetPointer(viewer,&file);CHKERRQ(ierr); 54d9262e54SJed Brown 55d9262e54SJed Brown if (file == PETSC_STDOUT) { 56d9262e54SJed Brown (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n"); 57d9262e54SJed Brown (*PetscErrorPrintf)(" INSTEAD the line number of the start of the function\n"); 58d9262e54SJed Brown (*PetscErrorPrintf)(" is given.\n"); 59d9262e54SJed Brown for (i=petscstack->currentsize-1; i>=0; i--) { 60d9262e54SJed Brown (*PetscErrorPrintf)("[%d] %s line %d %s%s\n",PetscGlobalRank, 61d9262e54SJed Brown petscstack->function[i], 62d9262e54SJed Brown petscstack->line[i], 63d9262e54SJed Brown petscstack->directory[i], 64d9262e54SJed Brown petscstack->file[i]); 65d9262e54SJed Brown } 66d9262e54SJed Brown } else { 67d9262e54SJed Brown fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n"); 68d9262e54SJed Brown fprintf(file," INSTEAD the line number of the start of the function\n"); 69d9262e54SJed Brown fprintf(file," is given.\n"); 70d9262e54SJed Brown for (i=petscstack->currentsize-1; i>=0; i--) { 71d9262e54SJed Brown fprintf(file,"[%d] %s line %d %s%s\n",PetscGlobalRank, 72d9262e54SJed Brown petscstack->function[i], 73d9262e54SJed Brown petscstack->line[i], 74d9262e54SJed Brown petscstack->directory[i], 75d9262e54SJed Brown petscstack->file[i]); 76d9262e54SJed Brown } 77d9262e54SJed Brown } 78d9262e54SJed Brown return 0; 79d9262e54SJed Brown } 80d9262e54SJed Brown 81d9262e54SJed Brown #undef __FUNCT__ 82d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy" 83d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 847087cfbeSBarry Smith PetscErrorCode PetscStackDestroy(void) 85d9262e54SJed Brown { 86d9262e54SJed Brown PetscErrorCode ierr; 87d9262e54SJed Brown if (petscstack){ 88d9262e54SJed Brown PetscStack *petscstack_in = petscstack; 89d9262e54SJed Brown petscstack = 0; 90d9262e54SJed Brown ierr = PetscFree(petscstack_in);CHKERRQ(ierr); 91*61d886c9SShri Abhyankar PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */ 92d9262e54SJed Brown } 93d9262e54SJed Brown return 0; 94d9262e54SJed Brown } 95d9262e54SJed Brown 96d9262e54SJed Brown #undef __FUNCT__ 97d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy" 98d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 997087cfbeSBarry Smith PetscErrorCode PetscStackCopy(PetscStack* sint,PetscStack* sout) 100d9262e54SJed Brown { 101d9262e54SJed Brown int i; 102d9262e54SJed Brown 103d9262e54SJed Brown if (!sint) { 104d9262e54SJed Brown sout->currentsize = 0; 105d9262e54SJed Brown } else { 106d9262e54SJed Brown for (i=0; i<sint->currentsize; i++) { 107d9262e54SJed Brown sout->function[i] = sint->function[i]; 108d9262e54SJed Brown sout->file[i] = sint->file[i]; 109d9262e54SJed Brown sout->directory[i] = sint->directory[i]; 110d9262e54SJed Brown sout->line[i] = sint->line[i]; 111d9262e54SJed Brown } 112d9262e54SJed Brown sout->currentsize = sint->currentsize; 113d9262e54SJed Brown } 114d9262e54SJed Brown return 0; 115d9262e54SJed Brown } 116d9262e54SJed Brown 117d9262e54SJed Brown #undef __FUNCT__ 118d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint" 119d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1207087cfbeSBarry Smith PetscErrorCode PetscStackPrint(PetscStack* sint,FILE *fp) 121d9262e54SJed Brown { 122d9262e54SJed Brown int i; 123d9262e54SJed Brown 124d9262e54SJed Brown if (!sint) return(0); 125d9262e54SJed Brown for (i=sint->currentsize-3; i>=0; i--) { 126d9262e54SJed Brown fprintf(fp," [%d] %s() line %d in %s%s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->directory[i],sint->file[i]); 127d9262e54SJed Brown } 128d9262e54SJed Brown return 0; 129d9262e54SJed Brown } 130d9262e54SJed Brown 131d9262e54SJed Brown #else 132d9262e54SJed Brown #undef __FUNCT__ 133d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish" 1347087cfbeSBarry Smith PetscErrorCode PetscStackPublish(void) 135d9262e54SJed Brown { 136d9262e54SJed Brown PetscFunctionBegin; 137d9262e54SJed Brown PetscFunctionReturn(0); 138d9262e54SJed Brown } 139d9262e54SJed Brown #undef __FUNCT__ 140d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish" 1417087cfbeSBarry Smith PetscErrorCode PetscStackDepublish(void) 142d9262e54SJed Brown { 143d9262e54SJed Brown PetscFunctionBegin; 144d9262e54SJed Brown PetscFunctionReturn(0); 145d9262e54SJed Brown } 146d9262e54SJed Brown #undef __FUNCT__ 147d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate" 1487087cfbeSBarry Smith PetscErrorCode PetscStackCreate(void) 149d9262e54SJed Brown { 150d9262e54SJed Brown PetscFunctionBegin; 151d9262e54SJed Brown PetscFunctionReturn(0); 152d9262e54SJed Brown } 153d9262e54SJed Brown #undef __FUNCT__ 154d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 1557087cfbeSBarry Smith PetscErrorCode PetscStackView(PetscViewer viewer) 156d9262e54SJed Brown { 157d9262e54SJed Brown PetscFunctionBegin; 158d9262e54SJed Brown PetscFunctionReturn(0); 159d9262e54SJed Brown } 160d9262e54SJed Brown #undef __FUNCT__ 161d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy" 1627087cfbeSBarry Smith PetscErrorCode PetscStackDestroy(void) 163d9262e54SJed Brown { 164d9262e54SJed Brown PetscFunctionBegin; 165d9262e54SJed Brown PetscFunctionReturn(0); 166d9262e54SJed Brown } 167d9262e54SJed Brown 168d9262e54SJed Brown #endif 169d9262e54SJed Brown 170