1d9262e54SJed Brown 2c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 374b43855SShri Abhyankar #include <petscthreadcomm.h> 4d9262e54SJed Brown 58bf1f09cSShri Abhyankar #if defined(PETSC_USE_DEBUG) 6d9262e54SJed Brown 7*1f46d60fSShri Abhyankar #if defined(PETSC_HAVE_PTHREADCLASSES) 8997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL) 9997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack *petscstack = 0; 10*1f46d60fSShri Abhyankar #endif 11fe89fe5aSShri Abhyankar #else 127087cfbeSBarry Smith PetscStack *petscstack = 0; 13fe89fe5aSShri Abhyankar #endif 14d9262e54SJed Brown 15d9262e54SJed Brown #undef __FUNCT__ 16d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish" 177087cfbeSBarry Smith PetscErrorCode PetscStackPublish(void) 18d9262e54SJed Brown { 19d9262e54SJed Brown PetscFunctionBegin; 20d9262e54SJed Brown PetscFunctionReturn(0); 21d9262e54SJed Brown } 22d9262e54SJed Brown 23d9262e54SJed Brown #undef __FUNCT__ 24d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish" 257087cfbeSBarry Smith PetscErrorCode PetscStackDepublish(void) 26d9262e54SJed Brown { 27d9262e54SJed Brown PetscFunctionBegin; 28d9262e54SJed Brown PetscFunctionReturn(0); 29d9262e54SJed Brown } 30d9262e54SJed Brown 3174b43855SShri Abhyankar PetscErrorCode PetscStackCreate_kernel(PetscInt trank) 3274b43855SShri Abhyankar { 3374b43855SShri Abhyankar PetscStack *petscstack_in; 34*1f46d60fSShri Abhyankar if(PetscStackActive) return 0; 3574b43855SShri Abhyankar 3674b43855SShri Abhyankar petscstack_in = (PetscStack*)malloc(sizeof(PetscStack)); 3774b43855SShri Abhyankar petscstack_in->currentsize = 0; 38*1f46d60fSShri Abhyankar PetscThreadLocalSetValue(petscstack,petscstack_in); 3974b43855SShri Abhyankar return 0; 4074b43855SShri Abhyankar } 4174b43855SShri Abhyankar 42d9262e54SJed Brown #undef __FUNCT__ 43d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate" 447087cfbeSBarry Smith PetscErrorCode PetscStackCreate(void) 45d9262e54SJed Brown { 46d9262e54SJed Brown PetscErrorCode ierr; 47d9262e54SJed Brown 4874b43855SShri Abhyankar ierr = PetscThreadCommRunKernel0(PETSC_COMM_SELF,(PetscThreadKernel)PetscStackCreate_kernel);CHKERRQ(ierr); 4974b43855SShri 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; 60*1f46d60fSShri Abhyankar PetscStack* petscstackp; 61d9262e54SJed Brown 62*1f46d60fSShri Abhyankar petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); 63d9262e54SJed Brown if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF; 64d9262e54SJed Brown ierr = PetscViewerASCIIGetPointer(viewer,&file);CHKERRQ(ierr); 65d9262e54SJed Brown 66d9262e54SJed Brown if (file == PETSC_STDOUT) { 67d9262e54SJed Brown (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n"); 68d9262e54SJed Brown (*PetscErrorPrintf)(" INSTEAD the line number of the start of the function\n"); 69d9262e54SJed Brown (*PetscErrorPrintf)(" is given.\n"); 70*1f46d60fSShri Abhyankar for (i=petscstackp->currentsize-1; i>=0; i--) { 71d9262e54SJed Brown (*PetscErrorPrintf)("[%d] %s line %d %s%s\n",PetscGlobalRank, 72*1f46d60fSShri Abhyankar petscstackp->function[i], 73*1f46d60fSShri Abhyankar petscstackp->line[i], 74*1f46d60fSShri Abhyankar petscstackp->directory[i], 75*1f46d60fSShri Abhyankar petscstackp->file[i]); 76d9262e54SJed Brown } 77d9262e54SJed Brown } else { 78d9262e54SJed Brown fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n"); 79d9262e54SJed Brown fprintf(file," INSTEAD the line number of the start of the function\n"); 80d9262e54SJed Brown fprintf(file," is given.\n"); 81*1f46d60fSShri Abhyankar for (i=petscstackp->currentsize-1; i>=0; i--) { 82d9262e54SJed Brown fprintf(file,"[%d] %s line %d %s%s\n",PetscGlobalRank, 83*1f46d60fSShri Abhyankar petscstackp->function[i], 84*1f46d60fSShri Abhyankar petscstackp->line[i], 85*1f46d60fSShri Abhyankar petscstackp->directory[i], 86*1f46d60fSShri Abhyankar petscstackp->file[i]); 87d9262e54SJed Brown } 88d9262e54SJed Brown } 89d9262e54SJed Brown return 0; 90d9262e54SJed Brown } 91d9262e54SJed Brown 9274b43855SShri Abhyankar PetscErrorCode PetscStackDestroy_kernel(PetscInt trank) 9374b43855SShri Abhyankar { 94*1f46d60fSShri Abhyankar if(PetscStackActive) { 95*1f46d60fSShri Abhyankar PetscStack *petscstack_in; 96*1f46d60fSShri Abhyankar petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack); 9774b43855SShri Abhyankar free(petscstack_in); 98*1f46d60fSShri Abhyankar PetscThreadLocalSetValue(petscstack,(PetscStack*)0); 9974b43855SShri Abhyankar } 10074b43855SShri Abhyankar return 0; 10174b43855SShri Abhyankar } 10274b43855SShri Abhyankar 103d9262e54SJed Brown #undef __FUNCT__ 104d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy" 105d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1067087cfbeSBarry Smith PetscErrorCode PetscStackDestroy(void) 107d9262e54SJed Brown { 108d9262e54SJed Brown PetscErrorCode ierr; 10974b43855SShri Abhyankar ierr = PetscThreadCommRunKernel0(PETSC_COMM_SELF,(PetscThreadKernel)PetscStackDestroy_kernel);CHKERRQ(ierr); 11074b43855SShri Abhyankar ierr = PetscThreadCommBarrier(PETSC_COMM_SELF);CHKERRQ(ierr); 11161d886c9SShri Abhyankar PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */ 112d9262e54SJed Brown return 0; 113d9262e54SJed Brown } 114d9262e54SJed Brown 115d9262e54SJed Brown #undef __FUNCT__ 116d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy" 117d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1187087cfbeSBarry Smith PetscErrorCode PetscStackCopy(PetscStack* sint,PetscStack* sout) 119d9262e54SJed Brown { 120d9262e54SJed Brown int i; 121d9262e54SJed Brown 122d9262e54SJed Brown if (!sint) { 123d9262e54SJed Brown sout->currentsize = 0; 124d9262e54SJed Brown } else { 125d9262e54SJed Brown for (i=0; i<sint->currentsize; i++) { 126d9262e54SJed Brown sout->function[i] = sint->function[i]; 127d9262e54SJed Brown sout->file[i] = sint->file[i]; 128d9262e54SJed Brown sout->directory[i] = sint->directory[i]; 129d9262e54SJed Brown sout->line[i] = sint->line[i]; 130d9262e54SJed Brown } 131d9262e54SJed Brown sout->currentsize = sint->currentsize; 132d9262e54SJed Brown } 133d9262e54SJed Brown return 0; 134d9262e54SJed Brown } 135d9262e54SJed Brown 136d9262e54SJed Brown #undef __FUNCT__ 137d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint" 138d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1397087cfbeSBarry Smith PetscErrorCode PetscStackPrint(PetscStack* sint,FILE *fp) 140d9262e54SJed Brown { 141d9262e54SJed Brown int i; 142d9262e54SJed Brown 143d9262e54SJed Brown if (!sint) return(0); 144d9262e54SJed Brown for (i=sint->currentsize-3; i>=0; i--) { 145d9262e54SJed Brown fprintf(fp," [%d] %s() line %d in %s%s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->directory[i],sint->file[i]); 146d9262e54SJed Brown } 147d9262e54SJed Brown return 0; 148d9262e54SJed Brown } 149d9262e54SJed Brown 150d9262e54SJed Brown #else 151d9262e54SJed Brown #undef __FUNCT__ 152d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish" 1537087cfbeSBarry Smith PetscErrorCode PetscStackPublish(void) 154d9262e54SJed Brown { 155d9262e54SJed Brown PetscFunctionBegin; 156d9262e54SJed Brown PetscFunctionReturn(0); 157d9262e54SJed Brown } 158d9262e54SJed Brown #undef __FUNCT__ 159d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish" 1607087cfbeSBarry Smith PetscErrorCode PetscStackDepublish(void) 161d9262e54SJed Brown { 162d9262e54SJed Brown PetscFunctionBegin; 163d9262e54SJed Brown PetscFunctionReturn(0); 164d9262e54SJed Brown } 165d9262e54SJed Brown #undef __FUNCT__ 166d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate" 1677087cfbeSBarry Smith PetscErrorCode PetscStackCreate(void) 168d9262e54SJed Brown { 169d9262e54SJed Brown PetscFunctionBegin; 170d9262e54SJed Brown PetscFunctionReturn(0); 171d9262e54SJed Brown } 172d9262e54SJed Brown #undef __FUNCT__ 173d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 1747087cfbeSBarry Smith PetscErrorCode PetscStackView(PetscViewer viewer) 175d9262e54SJed Brown { 176d9262e54SJed Brown PetscFunctionBegin; 177d9262e54SJed Brown PetscFunctionReturn(0); 178d9262e54SJed Brown } 179d9262e54SJed Brown #undef __FUNCT__ 180d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy" 1817087cfbeSBarry Smith PetscErrorCode PetscStackDestroy(void) 182d9262e54SJed Brown { 183d9262e54SJed Brown PetscFunctionBegin; 184d9262e54SJed Brown PetscFunctionReturn(0); 185d9262e54SJed Brown } 186d9262e54SJed Brown 187d9262e54SJed Brown #endif 188d9262e54SJed Brown 189