1d9262e54SJed Brown 2c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 3*74b43855SShri Abhyankar #include <petscthreadcomm.h> 4d9262e54SJed Brown 58bf1f09cSShri Abhyankar #if defined(PETSC_USE_DEBUG) 6d9262e54SJed Brown 7997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL) 8997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack *petscstack = 0; 9fe89fe5aSShri Abhyankar #else 107087cfbeSBarry Smith PetscStack *petscstack = 0; 11fe89fe5aSShri Abhyankar #endif 12d9262e54SJed Brown 13d9262e54SJed Brown #undef __FUNCT__ 14d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish" 157087cfbeSBarry Smith PetscErrorCode PetscStackPublish(void) 16d9262e54SJed Brown { 17d9262e54SJed Brown PetscFunctionBegin; 18d9262e54SJed Brown PetscFunctionReturn(0); 19d9262e54SJed Brown } 20d9262e54SJed Brown 21d9262e54SJed Brown #undef __FUNCT__ 22d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish" 237087cfbeSBarry Smith PetscErrorCode PetscStackDepublish(void) 24d9262e54SJed Brown { 25d9262e54SJed Brown PetscFunctionBegin; 26d9262e54SJed Brown PetscFunctionReturn(0); 27d9262e54SJed Brown } 28d9262e54SJed Brown 29*74b43855SShri Abhyankar PetscErrorCode PetscStackCreate_kernel(PetscInt trank) 30*74b43855SShri Abhyankar { 31*74b43855SShri Abhyankar PetscStack *petscstack_in; 32*74b43855SShri Abhyankar if(petscstack) return 0; 33*74b43855SShri Abhyankar 34*74b43855SShri Abhyankar petscstack_in = (PetscStack*)malloc(sizeof(PetscStack)); 35*74b43855SShri Abhyankar petscstack_in->currentsize = 0; 36*74b43855SShri Abhyankar petscstack = petscstack_in; 37*74b43855SShri Abhyankar PetscThreadLocalSetValue(petscstack,petscstack); 38*74b43855SShri Abhyankar PetscThreadLocalSetValue(petscstack,petscstack); /* Sets the value for the pthread_key_t if it is used */ 39*74b43855SShri Abhyankar return 0; 40*74b43855SShri Abhyankar } 41*74b43855SShri Abhyankar 42d9262e54SJed Brown #undef __FUNCT__ 43d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate" 447087cfbeSBarry Smith PetscErrorCode PetscStackCreate(void) 45d9262e54SJed Brown { 46d9262e54SJed Brown PetscErrorCode ierr; 47d9262e54SJed Brown 48*74b43855SShri Abhyankar ierr = PetscThreadCommRunKernel0(PETSC_COMM_SELF,(PetscThreadKernel)PetscStackCreate_kernel);CHKERRQ(ierr); 49*74b43855SShri Abhyankar ierr = PetscThreadCommBarrier(PETSC_COMM_SELF);CHKERRQ(ierr); 50d9262e54SJed Brown return 0; 51d9262e54SJed Brown } 52d9262e54SJed Brown 53d9262e54SJed Brown #undef __FUNCT__ 54d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 557087cfbeSBarry Smith PetscErrorCode PetscStackView(PetscViewer viewer) 56d9262e54SJed Brown { 57d9262e54SJed Brown PetscErrorCode ierr; 58d9262e54SJed Brown int i; 59d9262e54SJed Brown FILE *file; 60d9262e54SJed Brown 61d9262e54SJed Brown if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF; 62d9262e54SJed Brown ierr = PetscViewerASCIIGetPointer(viewer,&file);CHKERRQ(ierr); 63d9262e54SJed Brown 64d9262e54SJed Brown if (file == PETSC_STDOUT) { 65d9262e54SJed Brown (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n"); 66d9262e54SJed Brown (*PetscErrorPrintf)(" INSTEAD the line number of the start of the function\n"); 67d9262e54SJed Brown (*PetscErrorPrintf)(" is given.\n"); 68d9262e54SJed Brown for (i=petscstack->currentsize-1; i>=0; i--) { 69d9262e54SJed Brown (*PetscErrorPrintf)("[%d] %s line %d %s%s\n",PetscGlobalRank, 70d9262e54SJed Brown petscstack->function[i], 71d9262e54SJed Brown petscstack->line[i], 72d9262e54SJed Brown petscstack->directory[i], 73d9262e54SJed Brown petscstack->file[i]); 74d9262e54SJed Brown } 75d9262e54SJed Brown } else { 76d9262e54SJed Brown fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n"); 77d9262e54SJed Brown fprintf(file," INSTEAD the line number of the start of the function\n"); 78d9262e54SJed Brown fprintf(file," is given.\n"); 79d9262e54SJed Brown for (i=petscstack->currentsize-1; i>=0; i--) { 80d9262e54SJed Brown fprintf(file,"[%d] %s line %d %s%s\n",PetscGlobalRank, 81d9262e54SJed Brown petscstack->function[i], 82d9262e54SJed Brown petscstack->line[i], 83d9262e54SJed Brown petscstack->directory[i], 84d9262e54SJed Brown petscstack->file[i]); 85d9262e54SJed Brown } 86d9262e54SJed Brown } 87d9262e54SJed Brown return 0; 88d9262e54SJed Brown } 89d9262e54SJed Brown 90*74b43855SShri Abhyankar PetscErrorCode PetscStackDestroy_kernel(PetscInt trank) 91*74b43855SShri Abhyankar { 92*74b43855SShri Abhyankar if(petscstack) { 93*74b43855SShri Abhyankar PetscStack *petscstack_in = petscstack; 94*74b43855SShri Abhyankar petscstack = 0; 95*74b43855SShri Abhyankar free(petscstack_in); 96*74b43855SShri Abhyankar } 97*74b43855SShri Abhyankar return 0; 98*74b43855SShri Abhyankar } 99*74b43855SShri Abhyankar 100d9262e54SJed Brown #undef __FUNCT__ 101d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy" 102d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1037087cfbeSBarry Smith PetscErrorCode PetscStackDestroy(void) 104d9262e54SJed Brown { 105d9262e54SJed Brown PetscErrorCode ierr; 106*74b43855SShri Abhyankar ierr = PetscThreadCommRunKernel0(PETSC_COMM_SELF,(PetscThreadKernel)PetscStackDestroy_kernel);CHKERRQ(ierr); 107*74b43855SShri Abhyankar ierr = PetscThreadCommBarrier(PETSC_COMM_SELF);CHKERRQ(ierr); 10861d886c9SShri Abhyankar PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */ 109d9262e54SJed Brown return 0; 110d9262e54SJed Brown } 111d9262e54SJed Brown 112d9262e54SJed Brown #undef __FUNCT__ 113d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy" 114d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1157087cfbeSBarry Smith PetscErrorCode PetscStackCopy(PetscStack* sint,PetscStack* sout) 116d9262e54SJed Brown { 117d9262e54SJed Brown int i; 118d9262e54SJed Brown 119d9262e54SJed Brown if (!sint) { 120d9262e54SJed Brown sout->currentsize = 0; 121d9262e54SJed Brown } else { 122d9262e54SJed Brown for (i=0; i<sint->currentsize; i++) { 123d9262e54SJed Brown sout->function[i] = sint->function[i]; 124d9262e54SJed Brown sout->file[i] = sint->file[i]; 125d9262e54SJed Brown sout->directory[i] = sint->directory[i]; 126d9262e54SJed Brown sout->line[i] = sint->line[i]; 127d9262e54SJed Brown } 128d9262e54SJed Brown sout->currentsize = sint->currentsize; 129d9262e54SJed Brown } 130d9262e54SJed Brown return 0; 131d9262e54SJed Brown } 132d9262e54SJed Brown 133d9262e54SJed Brown #undef __FUNCT__ 134d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint" 135d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1367087cfbeSBarry Smith PetscErrorCode PetscStackPrint(PetscStack* sint,FILE *fp) 137d9262e54SJed Brown { 138d9262e54SJed Brown int i; 139d9262e54SJed Brown 140d9262e54SJed Brown if (!sint) return(0); 141d9262e54SJed Brown for (i=sint->currentsize-3; i>=0; i--) { 142d9262e54SJed Brown fprintf(fp," [%d] %s() line %d in %s%s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->directory[i],sint->file[i]); 143d9262e54SJed Brown } 144d9262e54SJed Brown return 0; 145d9262e54SJed Brown } 146d9262e54SJed Brown 147d9262e54SJed Brown #else 148d9262e54SJed Brown #undef __FUNCT__ 149d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish" 1507087cfbeSBarry Smith PetscErrorCode PetscStackPublish(void) 151d9262e54SJed Brown { 152d9262e54SJed Brown PetscFunctionBegin; 153d9262e54SJed Brown PetscFunctionReturn(0); 154d9262e54SJed Brown } 155d9262e54SJed Brown #undef __FUNCT__ 156d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish" 1577087cfbeSBarry Smith PetscErrorCode PetscStackDepublish(void) 158d9262e54SJed Brown { 159d9262e54SJed Brown PetscFunctionBegin; 160d9262e54SJed Brown PetscFunctionReturn(0); 161d9262e54SJed Brown } 162d9262e54SJed Brown #undef __FUNCT__ 163d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate" 1647087cfbeSBarry Smith PetscErrorCode PetscStackCreate(void) 165d9262e54SJed Brown { 166d9262e54SJed Brown PetscFunctionBegin; 167d9262e54SJed Brown PetscFunctionReturn(0); 168d9262e54SJed Brown } 169d9262e54SJed Brown #undef __FUNCT__ 170d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 1717087cfbeSBarry Smith PetscErrorCode PetscStackView(PetscViewer viewer) 172d9262e54SJed Brown { 173d9262e54SJed Brown PetscFunctionBegin; 174d9262e54SJed Brown PetscFunctionReturn(0); 175d9262e54SJed Brown } 176d9262e54SJed Brown #undef __FUNCT__ 177d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy" 1787087cfbeSBarry Smith PetscErrorCode PetscStackDestroy(void) 179d9262e54SJed Brown { 180d9262e54SJed Brown PetscFunctionBegin; 181d9262e54SJed Brown PetscFunctionReturn(0); 182d9262e54SJed Brown } 183d9262e54SJed Brown 184d9262e54SJed Brown #endif 185d9262e54SJed Brown 186