1d9262e54SJed Brown 2c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 3d9262e54SJed Brown 48bf1f09cSShri Abhyankar #if defined(PETSC_USE_DEBUG) 5d9262e54SJed Brown 61f46d60fSShri Abhyankar #if defined(PETSC_HAVE_PTHREADCLASSES) 7997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL) 8997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack *petscstack = 0; 91f46d60fSShri Abhyankar #endif 10fe89fe5aSShri Abhyankar #else 117087cfbeSBarry Smith PetscStack *petscstack = 0; 12fe89fe5aSShri Abhyankar #endif 13d9262e54SJed Brown 1415681b3cSBarry Smith 15e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 16e04113cfSBarry Smith #include <petscviewersaws.h> 1715681b3cSBarry Smith 182657e9d9SBarry Smith static PetscBool amsmemstack = PETSC_FALSE; 1915681b3cSBarry Smith 20d9262e54SJed Brown #undef __FUNCT__ 21e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsGrantAccess" 2215681b3cSBarry Smith /*@C 23e04113cfSBarry Smith PetscStackSAWsGrantAccess - Grants access of the PETSc stack frames to the SAWs publisher 2415681b3cSBarry Smith 2515681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 2615681b3cSBarry Smith 2715681b3cSBarry Smith Level: developer 2815681b3cSBarry Smith 2915681b3cSBarry Smith Concepts: publishing object 3015681b3cSBarry Smith 31e04113cfSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines 3215681b3cSBarry Smith 33e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 3415681b3cSBarry Smith 3515681b3cSBarry Smith @*/ 36e04113cfSBarry Smith void PetscStackSAWsGrantAccess(void) 37d9262e54SJed Brown { 38ec957eceSBarry Smith if (amsmemstack) { 3916ad0300SBarry Smith /* ignore any errors from SAWs */ 409a492a5cSBarry Smith SAWs_Unlock(); 4115681b3cSBarry Smith } 42d9262e54SJed Brown } 43d9262e54SJed Brown 44d9262e54SJed Brown #undef __FUNCT__ 45e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsTakeAccess" 4615681b3cSBarry Smith /*@C 47e04113cfSBarry Smith PetscStackSAWsTakeAccess - Takes access of the PETSc stack frames to the SAWs publisher 4815681b3cSBarry Smith 4915681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 5015681b3cSBarry Smith 5115681b3cSBarry Smith Level: developer 5215681b3cSBarry Smith 5315681b3cSBarry Smith Concepts: publishing object 5415681b3cSBarry Smith 55e04113cfSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines 5615681b3cSBarry Smith 57e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 5815681b3cSBarry Smith 5915681b3cSBarry Smith @*/ 60e04113cfSBarry Smith void PetscStackSAWsTakeAccess(void) 61d9262e54SJed Brown { 62ec957eceSBarry Smith if (amsmemstack) { 6316ad0300SBarry Smith /* ignore any errors from SAWs */ 649a492a5cSBarry Smith SAWs_Lock(); 6515681b3cSBarry Smith } 6615681b3cSBarry Smith } 6715681b3cSBarry Smith 68e04113cfSBarry Smith PetscErrorCode PetscStackViewSAWs(void) 6915681b3cSBarry Smith { 7015681b3cSBarry Smith PetscStack* petscstackp; 71*d45a07a7SBarry Smith PetscMPIInt rank; 72*d45a07a7SBarry Smith PetscErrorCode ierr; 7315681b3cSBarry Smith 74*d45a07a7SBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 75*d45a07a7SBarry Smith if (rank) return 0; 7615681b3cSBarry Smith petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); 7767a1e3b6SBarry Smith PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/functions",petscstackp->function,20,SAWs_READ,SAWs_STRING)); 78b8a862caSBarry Smith PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/_current_size",&petscstackp->currentsize,1,SAWs_READ,SAWs_INT)); 792657e9d9SBarry Smith amsmemstack = PETSC_TRUE; 8015681b3cSBarry Smith return 0; 8115681b3cSBarry Smith } 8215681b3cSBarry Smith 8315681b3cSBarry Smith #undef __FUNCT__ 84e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsViewOff" 85e04113cfSBarry Smith PetscErrorCode PetscStackSAWsViewOff(void) 8615681b3cSBarry Smith { 87d9262e54SJed Brown PetscFunctionBegin; 88*d45a07a7SBarry Smith if (!amsmemstack) PetscFunctionReturn(0); 8916ad0300SBarry Smith PetscStackCallSAWs(SAWs_Delete,("/PETSc/Stack")); 902657e9d9SBarry Smith amsmemstack = PETSC_FALSE; 91d9262e54SJed Brown PetscFunctionReturn(0); 92d9262e54SJed Brown } 93d9262e54SJed Brown 9415681b3cSBarry Smith #endif 9515681b3cSBarry Smith 967d5f7e0cSShri Abhyankar PetscErrorCode PetscStackCreate(void) 9774b43855SShri Abhyankar { 9874b43855SShri Abhyankar PetscStack *petscstack_in; 99dbf62e16SBarry Smith if (PetscStackActive()) return 0; 10074b43855SShri Abhyankar 10174b43855SShri Abhyankar petscstack_in = (PetscStack*)malloc(sizeof(PetscStack)); 10274b43855SShri Abhyankar petscstack_in->currentsize = 0; 103047240e1SBarry Smith PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in); 10415681b3cSBarry Smith 105e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 10615681b3cSBarry Smith { 10715681b3cSBarry Smith PetscBool flg = PETSC_FALSE; 10815681b3cSBarry Smith PetscOptionsHasName(NULL,"-stack_view",&flg); 109e04113cfSBarry Smith if (flg) PetscStackViewSAWs(); 11015681b3cSBarry Smith } 11115681b3cSBarry Smith #endif 11274b43855SShri Abhyankar return 0; 11374b43855SShri Abhyankar } 11474b43855SShri Abhyankar 11515681b3cSBarry Smith 116d9262e54SJed Brown #undef __FUNCT__ 117d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 118639ff905SBarry Smith PetscErrorCode PetscStackView(FILE *file) 119d9262e54SJed Brown { 120d9262e54SJed Brown int i; 1211f46d60fSShri Abhyankar PetscStack *petscstackp; 122d9262e54SJed Brown 1231f46d60fSShri Abhyankar petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); 124639ff905SBarry Smith if (!file) file = PETSC_STDOUT; 125d9262e54SJed Brown 126d9262e54SJed Brown if (file == PETSC_STDOUT) { 127d9262e54SJed Brown (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n"); 128d9262e54SJed Brown (*PetscErrorPrintf)(" INSTEAD the line number of the start of the function\n"); 129d9262e54SJed Brown (*PetscErrorPrintf)(" is given.\n"); 130a297a907SKarl Rupp for (i=petscstackp->currentsize-1; i>=0; i--) (*PetscErrorPrintf)("[%d] %s line %d %s%s\n",PetscGlobalRank,petscstackp->function[i],petscstackp->line[i],petscstackp->directory[i],petscstackp->file[i]); 131d9262e54SJed Brown } else { 132d9262e54SJed Brown fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n"); 133d9262e54SJed Brown fprintf(file," INSTEAD the line number of the start of the function\n"); 134d9262e54SJed Brown fprintf(file," is given.\n"); 135a297a907SKarl Rupp for (i=petscstackp->currentsize-1; i>=0; i--) fprintf(file,"[%d] %s line %d %s%s\n",PetscGlobalRank,petscstackp->function[i],petscstackp->line[i],petscstackp->directory[i],petscstackp->file[i]); 136d9262e54SJed Brown } 137d9262e54SJed Brown return 0; 138d9262e54SJed Brown } 139d9262e54SJed Brown 1407d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void) 14174b43855SShri Abhyankar { 142dbf62e16SBarry Smith if (PetscStackActive()) { 1431f46d60fSShri Abhyankar PetscStack *petscstack_in; 1441f46d60fSShri Abhyankar petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack); 14574b43855SShri Abhyankar free(petscstack_in); 146047240e1SBarry Smith PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,(PetscStack*)0); 14761d886c9SShri Abhyankar PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */ 1487d5f7e0cSShri Abhyankar } 149d9262e54SJed Brown return 0; 150d9262e54SJed Brown } 151d9262e54SJed Brown 152d9262e54SJed Brown #undef __FUNCT__ 153d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy" 154d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1557087cfbeSBarry Smith PetscErrorCode PetscStackCopy(PetscStack *sint,PetscStack *sout) 156d9262e54SJed Brown { 157d9262e54SJed Brown int i; 158d9262e54SJed Brown 159a297a907SKarl Rupp if (!sint) sout->currentsize = 0; 160a297a907SKarl Rupp else { 161d9262e54SJed Brown for (i=0; i<sint->currentsize; i++) { 162d9262e54SJed Brown sout->function[i] = sint->function[i]; 163d9262e54SJed Brown sout->file[i] = sint->file[i]; 164d9262e54SJed Brown sout->directory[i] = sint->directory[i]; 165d9262e54SJed Brown sout->line[i] = sint->line[i]; 166a8d2bbe5SBarry Smith sout->petscroutine[i] = sint->petscroutine[i]; 167d9262e54SJed Brown } 168d9262e54SJed Brown sout->currentsize = sint->currentsize; 169d9262e54SJed Brown } 170d9262e54SJed Brown return 0; 171d9262e54SJed Brown } 172d9262e54SJed Brown 173d9262e54SJed Brown #undef __FUNCT__ 174d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint" 175d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1767087cfbeSBarry Smith PetscErrorCode PetscStackPrint(PetscStack *sint,FILE *fp) 177d9262e54SJed Brown { 178d9262e54SJed Brown int i; 179d9262e54SJed Brown 180d9262e54SJed Brown if (!sint) return(0); 181a297a907SKarl Rupp for (i=sint->currentsize-2; i>=0; i--) fprintf(fp," [%d] %s() line %d in %s%s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->directory[i],sint->file[i]); 182d9262e54SJed Brown return 0; 183d9262e54SJed Brown } 184d9262e54SJed Brown 185d9262e54SJed Brown #else 18615681b3cSBarry Smith 187d9262e54SJed Brown #undef __FUNCT__ 188d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate" 1897087cfbeSBarry Smith PetscErrorCode PetscStackCreate(void) 190d9262e54SJed Brown { 191d9262e54SJed Brown PetscFunctionBegin; 192d9262e54SJed Brown PetscFunctionReturn(0); 193d9262e54SJed Brown } 194d9262e54SJed Brown #undef __FUNCT__ 195d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 196639ff905SBarry Smith PetscErrorCode PetscStackView(FILE *file) 197d9262e54SJed Brown { 198d9262e54SJed Brown PetscFunctionBegin; 199d9262e54SJed Brown PetscFunctionReturn(0); 200d9262e54SJed Brown } 201d9262e54SJed Brown #undef __FUNCT__ 202d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy" 2037087cfbeSBarry Smith PetscErrorCode PetscStackDestroy(void) 204d9262e54SJed Brown { 205d9262e54SJed Brown PetscFunctionBegin; 206d9262e54SJed Brown PetscFunctionReturn(0); 207d9262e54SJed Brown } 208d9262e54SJed Brown 209e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) /* SAWs stack functions do nothing in optimized mode */ 210e04113cfSBarry Smith void PetscStackSAWsGrantAccess(void) {} 211e04113cfSBarry Smith void PetscStackSAWsTakeAccess(void) {} 2126eb7abf7SJed Brown 213e04113cfSBarry Smith PetscErrorCode PetscStackViewSAWs(void) 2146eb7abf7SJed Brown { 2156eb7abf7SJed Brown return 0; 2166eb7abf7SJed Brown } 2176eb7abf7SJed Brown 2186eb7abf7SJed Brown #undef __FUNCT__ 219e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsViewOff" 220e04113cfSBarry Smith PetscErrorCode PetscStackSAWsViewOff(void) 2216eb7abf7SJed Brown { 2226eb7abf7SJed Brown PetscFunctionBegin; 2236eb7abf7SJed Brown PetscFunctionReturn(0); 2246eb7abf7SJed Brown } 2256eb7abf7SJed Brown #endif 2266eb7abf7SJed Brown 227d9262e54SJed Brown #endif 228d9262e54SJed Brown 229