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; 976386721SLisandro Dalcin #else 1076386721SLisandro Dalcin PetscThreadKey petscstack; 111f46d60fSShri Abhyankar #endif 12fe89fe5aSShri Abhyankar #else 137087cfbeSBarry Smith PetscStack *petscstack = 0; 14fe89fe5aSShri Abhyankar #endif 15d9262e54SJed Brown 1615681b3cSBarry Smith 17e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 18e04113cfSBarry Smith #include <petscviewersaws.h> 1915681b3cSBarry Smith 202657e9d9SBarry Smith static PetscBool amsmemstack = PETSC_FALSE; 2115681b3cSBarry Smith 22d9262e54SJed Brown #undef __FUNCT__ 23e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsGrantAccess" 2415681b3cSBarry Smith /*@C 25e04113cfSBarry Smith PetscStackSAWsGrantAccess - Grants access of the PETSc stack frames to the SAWs publisher 2615681b3cSBarry Smith 2715681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 2815681b3cSBarry Smith 2915681b3cSBarry Smith Level: developer 3015681b3cSBarry Smith 3115681b3cSBarry Smith Concepts: publishing object 3215681b3cSBarry Smith 33e04113cfSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines 3415681b3cSBarry Smith 35e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 3615681b3cSBarry Smith 3715681b3cSBarry Smith @*/ 38e04113cfSBarry Smith void PetscStackSAWsGrantAccess(void) 39d9262e54SJed Brown { 40ec957eceSBarry Smith if (amsmemstack) { 4116ad0300SBarry Smith /* ignore any errors from SAWs */ 429a492a5cSBarry Smith SAWs_Unlock(); 4315681b3cSBarry Smith } 44d9262e54SJed Brown } 45d9262e54SJed Brown 46d9262e54SJed Brown #undef __FUNCT__ 47e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsTakeAccess" 4815681b3cSBarry Smith /*@C 49e04113cfSBarry Smith PetscStackSAWsTakeAccess - Takes access of the PETSc stack frames to the SAWs publisher 5015681b3cSBarry Smith 5115681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 5215681b3cSBarry Smith 5315681b3cSBarry Smith Level: developer 5415681b3cSBarry Smith 5515681b3cSBarry Smith Concepts: publishing object 5615681b3cSBarry Smith 57e04113cfSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines 5815681b3cSBarry Smith 59e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 6015681b3cSBarry Smith 6115681b3cSBarry Smith @*/ 62e04113cfSBarry Smith void PetscStackSAWsTakeAccess(void) 63d9262e54SJed Brown { 64ec957eceSBarry Smith if (amsmemstack) { 6516ad0300SBarry Smith /* ignore any errors from SAWs */ 669a492a5cSBarry Smith SAWs_Lock(); 6715681b3cSBarry Smith } 6815681b3cSBarry Smith } 6915681b3cSBarry Smith 70e04113cfSBarry Smith PetscErrorCode PetscStackViewSAWs(void) 7115681b3cSBarry Smith { 7215681b3cSBarry Smith PetscStack* petscstackp; 73d45a07a7SBarry Smith PetscMPIInt rank; 74d45a07a7SBarry Smith PetscErrorCode ierr; 7515681b3cSBarry Smith 76d45a07a7SBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 77d45a07a7SBarry Smith if (rank) return 0; 7815681b3cSBarry Smith petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); 7967a1e3b6SBarry Smith PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/functions",petscstackp->function,20,SAWs_READ,SAWs_STRING)); 80*d50831c4SBarry Smith PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/__current_size",&petscstackp->currentsize,1,SAWs_READ,SAWs_INT)); 812657e9d9SBarry Smith amsmemstack = PETSC_TRUE; 8215681b3cSBarry Smith return 0; 8315681b3cSBarry Smith } 8415681b3cSBarry Smith 8515681b3cSBarry Smith #undef __FUNCT__ 86e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsViewOff" 87e04113cfSBarry Smith PetscErrorCode PetscStackSAWsViewOff(void) 8815681b3cSBarry Smith { 89d9262e54SJed Brown PetscFunctionBegin; 90d45a07a7SBarry Smith if (!amsmemstack) PetscFunctionReturn(0); 9116ad0300SBarry Smith PetscStackCallSAWs(SAWs_Delete,("/PETSc/Stack")); 922657e9d9SBarry Smith amsmemstack = PETSC_FALSE; 93d9262e54SJed Brown PetscFunctionReturn(0); 94d9262e54SJed Brown } 95d9262e54SJed Brown 9615681b3cSBarry Smith #endif 9715681b3cSBarry Smith 987d5f7e0cSShri Abhyankar PetscErrorCode PetscStackCreate(void) 9974b43855SShri Abhyankar { 10074b43855SShri Abhyankar PetscStack *petscstack_in; 101dbf62e16SBarry Smith if (PetscStackActive()) return 0; 10274b43855SShri Abhyankar 10374b43855SShri Abhyankar petscstack_in = (PetscStack*)malloc(sizeof(PetscStack)); 10474b43855SShri Abhyankar petscstack_in->currentsize = 0; 105047240e1SBarry Smith PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in); 10615681b3cSBarry Smith 107e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 10815681b3cSBarry Smith { 10915681b3cSBarry Smith PetscBool flg = PETSC_FALSE; 11015681b3cSBarry Smith PetscOptionsHasName(NULL,"-stack_view",&flg); 111e04113cfSBarry Smith if (flg) PetscStackViewSAWs(); 11215681b3cSBarry Smith } 11315681b3cSBarry Smith #endif 11474b43855SShri Abhyankar return 0; 11574b43855SShri Abhyankar } 11674b43855SShri Abhyankar 11715681b3cSBarry Smith 118d9262e54SJed Brown #undef __FUNCT__ 119d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 120639ff905SBarry Smith PetscErrorCode PetscStackView(FILE *file) 121d9262e54SJed Brown { 122d9262e54SJed Brown int i; 1231f46d60fSShri Abhyankar PetscStack *petscstackp; 124d9262e54SJed Brown 1251f46d60fSShri Abhyankar petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); 126639ff905SBarry Smith if (!file) file = PETSC_STDOUT; 127d9262e54SJed Brown 128d9262e54SJed Brown if (file == PETSC_STDOUT) { 129d9262e54SJed Brown (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n"); 130d9262e54SJed Brown (*PetscErrorPrintf)(" INSTEAD the line number of the start of the function\n"); 131d9262e54SJed Brown (*PetscErrorPrintf)(" is given.\n"); 132a297a907SKarl 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]); 133d9262e54SJed Brown } else { 134d9262e54SJed Brown fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n"); 135d9262e54SJed Brown fprintf(file," INSTEAD the line number of the start of the function\n"); 136d9262e54SJed Brown fprintf(file," is given.\n"); 137a297a907SKarl 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]); 138d9262e54SJed Brown } 139d9262e54SJed Brown return 0; 140d9262e54SJed Brown } 141d9262e54SJed Brown 1427d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void) 14374b43855SShri Abhyankar { 144dbf62e16SBarry Smith if (PetscStackActive()) { 1451f46d60fSShri Abhyankar PetscStack *petscstack_in; 1461f46d60fSShri Abhyankar petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack); 14774b43855SShri Abhyankar free(petscstack_in); 14876386721SLisandro Dalcin PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,NULL); 1497d5f7e0cSShri Abhyankar } 150d9262e54SJed Brown return 0; 151d9262e54SJed Brown } 152d9262e54SJed Brown 153d9262e54SJed Brown #undef __FUNCT__ 154d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy" 155d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1567087cfbeSBarry Smith PetscErrorCode PetscStackCopy(PetscStack *sint,PetscStack *sout) 157d9262e54SJed Brown { 158d9262e54SJed Brown int i; 159d9262e54SJed Brown 160a297a907SKarl Rupp if (!sint) sout->currentsize = 0; 161a297a907SKarl Rupp else { 162d9262e54SJed Brown for (i=0; i<sint->currentsize; i++) { 163d9262e54SJed Brown sout->function[i] = sint->function[i]; 164d9262e54SJed Brown sout->file[i] = sint->file[i]; 165d9262e54SJed Brown sout->directory[i] = sint->directory[i]; 166d9262e54SJed Brown sout->line[i] = sint->line[i]; 167a8d2bbe5SBarry Smith sout->petscroutine[i] = sint->petscroutine[i]; 168d9262e54SJed Brown } 169d9262e54SJed Brown sout->currentsize = sint->currentsize; 170d9262e54SJed Brown } 171d9262e54SJed Brown return 0; 172d9262e54SJed Brown } 173d9262e54SJed Brown 174d9262e54SJed Brown #undef __FUNCT__ 175d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint" 176d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1777087cfbeSBarry Smith PetscErrorCode PetscStackPrint(PetscStack *sint,FILE *fp) 178d9262e54SJed Brown { 179d9262e54SJed Brown int i; 180d9262e54SJed Brown 181d9262e54SJed Brown if (!sint) return(0); 182a297a907SKarl 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]); 183d9262e54SJed Brown return 0; 184d9262e54SJed Brown } 185d9262e54SJed Brown 186d9262e54SJed Brown #else 18715681b3cSBarry Smith 18876386721SLisandro Dalcin #if defined(PETSC_HAVE_PTHREADCLASSES) 18976386721SLisandro Dalcin #if defined(PETSC_PTHREAD_LOCAL) 19076386721SLisandro Dalcin PETSC_PTHREAD_LOCAL void *petscstack = 0; 19176386721SLisandro Dalcin #else 19276386721SLisandro Dalcin PetscThreadKey petscstack; 19376386721SLisandro Dalcin #endif 19476386721SLisandro Dalcin #else 19576386721SLisandro Dalcin void *petscstack = 0; 19676386721SLisandro Dalcin #endif 19776386721SLisandro Dalcin 198d9262e54SJed Brown #undef __FUNCT__ 199d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate" 2007087cfbeSBarry Smith PetscErrorCode PetscStackCreate(void) 201d9262e54SJed Brown { 202d9262e54SJed Brown PetscFunctionBegin; 203d9262e54SJed Brown PetscFunctionReturn(0); 204d9262e54SJed Brown } 205d9262e54SJed Brown #undef __FUNCT__ 206d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 20776386721SLisandro Dalcin PetscErrorCode PetscStackView(PETSC_UNUSED FILE *file) 208d9262e54SJed Brown { 209d9262e54SJed Brown PetscFunctionBegin; 210d9262e54SJed Brown PetscFunctionReturn(0); 211d9262e54SJed Brown } 212d9262e54SJed Brown #undef __FUNCT__ 213d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy" 2147087cfbeSBarry Smith PetscErrorCode PetscStackDestroy(void) 215d9262e54SJed Brown { 216d9262e54SJed Brown PetscFunctionBegin; 217d9262e54SJed Brown PetscFunctionReturn(0); 218d9262e54SJed Brown } 21976386721SLisandro Dalcin #undef __FUNCT__ 22076386721SLisandro Dalcin #define __FUNCT__ "PetscStackCopy" 22176386721SLisandro Dalcin PetscErrorCode PetscStackCopy(PETSC_UNUSED void *sint,PETSC_UNUSED void *sout) 22276386721SLisandro Dalcin { 22376386721SLisandro Dalcin PetscFunctionBegin; 22476386721SLisandro Dalcin PetscFunctionReturn(0); 22576386721SLisandro Dalcin } 22676386721SLisandro Dalcin #undef __FUNCT__ 22776386721SLisandro Dalcin #define __FUNCT__ "PetscStackPrint" 22876386721SLisandro Dalcin PetscErrorCode PetscStackPrint(PETSC_UNUSED void *sint,PETSC_UNUSED FILE *fp) 22976386721SLisandro Dalcin { 23076386721SLisandro Dalcin PetscFunctionBegin; 23176386721SLisandro Dalcin PetscFunctionReturn(0); 23276386721SLisandro Dalcin } 233d9262e54SJed Brown 234e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) /* SAWs stack functions do nothing in optimized mode */ 235e04113cfSBarry Smith void PetscStackSAWsGrantAccess(void) {} 236e04113cfSBarry Smith void PetscStackSAWsTakeAccess(void) {} 2376eb7abf7SJed Brown 238e04113cfSBarry Smith PetscErrorCode PetscStackViewSAWs(void) 2396eb7abf7SJed Brown { 2406eb7abf7SJed Brown return 0; 2416eb7abf7SJed Brown } 2426eb7abf7SJed Brown 2436eb7abf7SJed Brown #undef __FUNCT__ 244e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsViewOff" 245e04113cfSBarry Smith PetscErrorCode PetscStackSAWsViewOff(void) 2466eb7abf7SJed Brown { 2476eb7abf7SJed Brown PetscFunctionBegin; 2486eb7abf7SJed Brown PetscFunctionReturn(0); 2496eb7abf7SJed Brown } 2506eb7abf7SJed Brown #endif 2516eb7abf7SJed Brown 252d9262e54SJed Brown #endif 253d9262e54SJed Brown 254