1d9262e54SJed Brown 2c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 3d9262e54SJed Brown 402c9f0b5SLisandro Dalcin PetscStack *petscstack = NULL; 515681b3cSBarry Smith 6e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 7e04113cfSBarry Smith #include <petscviewersaws.h> 815681b3cSBarry Smith 92657e9d9SBarry Smith static PetscBool amsmemstack = PETSC_FALSE; 1015681b3cSBarry Smith 1115681b3cSBarry Smith /*@C 12e04113cfSBarry Smith PetscStackSAWsGrantAccess - Grants access of the PETSc stack frames to the SAWs publisher 1315681b3cSBarry Smith 1415681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 1515681b3cSBarry Smith 1615681b3cSBarry Smith Level: developer 1715681b3cSBarry Smith 18e04113cfSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines 1915681b3cSBarry Smith 20e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 2115681b3cSBarry Smith 2215681b3cSBarry Smith @*/ 23e04113cfSBarry Smith void PetscStackSAWsGrantAccess(void) 24d9262e54SJed Brown { 25ec957eceSBarry Smith if (amsmemstack) { 2616ad0300SBarry Smith /* ignore any errors from SAWs */ 279a492a5cSBarry Smith SAWs_Unlock(); 2815681b3cSBarry Smith } 29d9262e54SJed Brown } 30d9262e54SJed Brown 3115681b3cSBarry Smith /*@C 32e04113cfSBarry Smith PetscStackSAWsTakeAccess - Takes access of the PETSc stack frames to the SAWs publisher 3315681b3cSBarry Smith 3415681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 3515681b3cSBarry Smith 3615681b3cSBarry Smith Level: developer 3715681b3cSBarry Smith 38e04113cfSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines 3915681b3cSBarry Smith 40e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 4115681b3cSBarry Smith 4215681b3cSBarry Smith @*/ 43e04113cfSBarry Smith void PetscStackSAWsTakeAccess(void) 44d9262e54SJed Brown { 45ec957eceSBarry Smith if (amsmemstack) { 4616ad0300SBarry Smith /* ignore any errors from SAWs */ 479a492a5cSBarry Smith SAWs_Lock(); 4815681b3cSBarry Smith } 4915681b3cSBarry Smith } 5015681b3cSBarry Smith 51e04113cfSBarry Smith PetscErrorCode PetscStackViewSAWs(void) 5215681b3cSBarry Smith { 53d45a07a7SBarry Smith PetscMPIInt rank; 54d45a07a7SBarry Smith PetscErrorCode ierr; 5515681b3cSBarry Smith 5655b25c41SPierre Jolivet ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 57d45a07a7SBarry Smith if (rank) return 0; 585c25fcd7SBarry Smith PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/functions",petscstack->function,20,SAWs_READ,SAWs_STRING)); 595c25fcd7SBarry Smith PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/__current_size",&petscstack->currentsize,1,SAWs_READ,SAWs_INT)); 602657e9d9SBarry Smith amsmemstack = PETSC_TRUE; 6115681b3cSBarry Smith return 0; 6215681b3cSBarry Smith } 6315681b3cSBarry Smith 64e04113cfSBarry Smith PetscErrorCode PetscStackSAWsViewOff(void) 6515681b3cSBarry Smith { 66d9262e54SJed Brown PetscFunctionBegin; 67d45a07a7SBarry Smith if (!amsmemstack) PetscFunctionReturn(0); 6816ad0300SBarry Smith PetscStackCallSAWs(SAWs_Delete,("/PETSc/Stack")); 692657e9d9SBarry Smith amsmemstack = PETSC_FALSE; 70d9262e54SJed Brown PetscFunctionReturn(0); 71d9262e54SJed Brown } 72d9262e54SJed Brown 73c82b4e47SJed Brown # endif 7476422c65SBarry Smith 7515681b3cSBarry Smith 767d5f7e0cSShri Abhyankar PetscErrorCode PetscStackCreate(void) 7774b43855SShri Abhyankar { 7874b43855SShri Abhyankar PetscStack *petscstack_in; 797fdeb8b9SBarry Smith PetscInt i; 807fdeb8b9SBarry Smith 81dbf62e16SBarry Smith if (PetscStackActive()) return 0; 8274b43855SShri Abhyankar 8374b43855SShri Abhyankar petscstack_in = (PetscStack*)malloc(sizeof(PetscStack)); 8474b43855SShri Abhyankar petscstack_in->currentsize = 0; 85a2f94806SJed Brown petscstack_in->hotdepth = 0; 867fdeb8b9SBarry Smith for (i=0; i<PETSCSTACKSIZE; i++) { 8702c9f0b5SLisandro Dalcin petscstack_in->function[i] = NULL; 8802c9f0b5SLisandro Dalcin petscstack_in->file[i] = NULL; 897fdeb8b9SBarry Smith } 905c25fcd7SBarry Smith petscstack = petscstack_in; 9115681b3cSBarry Smith 92e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 9315681b3cSBarry Smith { 9415681b3cSBarry Smith PetscBool flg = PETSC_FALSE; 9576a34f28SBarry Smith PetscOptionsHasName(NULL,NULL,"-stack_view",&flg); 96e04113cfSBarry Smith if (flg) PetscStackViewSAWs(); 9715681b3cSBarry Smith } 9815681b3cSBarry Smith #endif 9974b43855SShri Abhyankar return 0; 10074b43855SShri Abhyankar } 10174b43855SShri Abhyankar 10215681b3cSBarry Smith 103639ff905SBarry Smith PetscErrorCode PetscStackView(FILE *file) 104d9262e54SJed Brown { 1052f307e7aSJunchao Zhang int i,j; 106d9262e54SJed Brown 107639ff905SBarry Smith if (!file) file = PETSC_STDOUT; 108d9262e54SJed Brown 109*6d07e311SBarry Smith if (petscstack->currentsize <= 1) { 110d9262e54SJed Brown if (file == PETSC_STDOUT) { 111*6d07e311SBarry Smith (*PetscErrorPrintf)("No error traceback is avaiable, the problem could be in the main program. \n"); 112*6d07e311SBarry Smith } else { 113*6d07e311SBarry Smith fprintf(file,"No error traceback is avaiable, the problem could be in the main program. \n"); 114*6d07e311SBarry Smith } 115*6d07e311SBarry Smith } else { 116*6d07e311SBarry Smith if (file == PETSC_STDOUT) { 117*6d07e311SBarry Smith (*PetscErrorPrintf)("The EXACT line numbers in the error traceback are not available.\n"); 118*6d07e311SBarry Smith (*PetscErrorPrintf)("instead the line number of the start of the function is given.\n"); 1192f307e7aSJunchao Zhang for (i=petscstack->currentsize-1,j=1; i>=0; i--,j++) (*PetscErrorPrintf)("#%d %s() at %s:%d\n",j,petscstack->function[i],petscstack->file[i],petscstack->line[i]); 120d9262e54SJed Brown } else { 121*6d07e311SBarry Smith fprintf(file,"The EXACT line numbers in the error traceback are not available.\n"); 122*6d07e311SBarry Smith fprintf(file,"Instead the line number of the start of the function is given.\n"); 1232f307e7aSJunchao Zhang for (i=petscstack->currentsize-1,j=1; i>=0; i--,j++) fprintf(file,"[%d] #%d %s() at %s:%d\n",PetscGlobalRank,j,petscstack->function[i],petscstack->file[i],petscstack->line[i]); 124d9262e54SJed Brown } 125*6d07e311SBarry Smith } 126d9262e54SJed Brown return 0; 127d9262e54SJed Brown } 128d9262e54SJed Brown 1297d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void) 13074b43855SShri Abhyankar { 131dbf62e16SBarry Smith if (PetscStackActive()) { 1325c25fcd7SBarry Smith free(petscstack); 1335c25fcd7SBarry Smith petscstack = NULL; 1347d5f7e0cSShri Abhyankar } 135d9262e54SJed Brown return 0; 136d9262e54SJed Brown } 137d9262e54SJed Brown 138d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1397087cfbeSBarry Smith PetscErrorCode PetscStackCopy(PetscStack *sint,PetscStack *sout) 140d9262e54SJed Brown { 141d9262e54SJed Brown int i; 142d9262e54SJed Brown 143a297a907SKarl Rupp if (!sint) sout->currentsize = 0; 144a297a907SKarl Rupp else { 145d9262e54SJed Brown for (i=0; i<sint->currentsize; i++) { 146d9262e54SJed Brown sout->function[i] = sint->function[i]; 147d9262e54SJed Brown sout->file[i] = sint->file[i]; 148d9262e54SJed Brown sout->line[i] = sint->line[i]; 149a8d2bbe5SBarry Smith sout->petscroutine[i] = sint->petscroutine[i]; 150d9262e54SJed Brown } 151d9262e54SJed Brown sout->currentsize = sint->currentsize; 152d9262e54SJed Brown } 153d9262e54SJed Brown return 0; 154d9262e54SJed Brown } 155d9262e54SJed Brown 156d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1577087cfbeSBarry Smith PetscErrorCode PetscStackPrint(PetscStack *sint,FILE *fp) 158d9262e54SJed Brown { 159d9262e54SJed Brown int i; 160d9262e54SJed Brown 161d9262e54SJed Brown if (!sint) return(0); 162efca3c55SSatish Balay for (i=sint->currentsize-2; i>=0; i--) fprintf(fp," [%d] %s() line %d in %s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->file[i]); 163d9262e54SJed Brown return 0; 164d9262e54SJed Brown } 165d9262e54SJed Brown 166