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 { 105*2f307e7aSJunchao Zhang int i,j; 106d9262e54SJed Brown 107639ff905SBarry Smith if (!file) file = PETSC_STDOUT; 108d9262e54SJed Brown 109d9262e54SJed Brown if (file == PETSC_STDOUT) { 110d9262e54SJed Brown (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n"); 111d9262e54SJed Brown (*PetscErrorPrintf)(" INSTEAD the line number of the start of the function\n"); 112d9262e54SJed Brown (*PetscErrorPrintf)(" is given.\n"); 113*2f307e7aSJunchao 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]); 114d9262e54SJed Brown } else { 115d9262e54SJed Brown fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n"); 116d9262e54SJed Brown fprintf(file," INSTEAD the line number of the start of the function\n"); 117d9262e54SJed Brown fprintf(file," is given.\n"); 118*2f307e7aSJunchao 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]); 119d9262e54SJed Brown } 120d9262e54SJed Brown return 0; 121d9262e54SJed Brown } 122d9262e54SJed Brown 1237d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void) 12474b43855SShri Abhyankar { 125dbf62e16SBarry Smith if (PetscStackActive()) { 1265c25fcd7SBarry Smith free(petscstack); 1275c25fcd7SBarry Smith petscstack = NULL; 1287d5f7e0cSShri Abhyankar } 129d9262e54SJed Brown return 0; 130d9262e54SJed Brown } 131d9262e54SJed Brown 132d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1337087cfbeSBarry Smith PetscErrorCode PetscStackCopy(PetscStack *sint,PetscStack *sout) 134d9262e54SJed Brown { 135d9262e54SJed Brown int i; 136d9262e54SJed Brown 137a297a907SKarl Rupp if (!sint) sout->currentsize = 0; 138a297a907SKarl Rupp else { 139d9262e54SJed Brown for (i=0; i<sint->currentsize; i++) { 140d9262e54SJed Brown sout->function[i] = sint->function[i]; 141d9262e54SJed Brown sout->file[i] = sint->file[i]; 142d9262e54SJed Brown sout->line[i] = sint->line[i]; 143a8d2bbe5SBarry Smith sout->petscroutine[i] = sint->petscroutine[i]; 144d9262e54SJed Brown } 145d9262e54SJed Brown sout->currentsize = sint->currentsize; 146d9262e54SJed Brown } 147d9262e54SJed Brown return 0; 148d9262e54SJed Brown } 149d9262e54SJed Brown 150d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1517087cfbeSBarry Smith PetscErrorCode PetscStackPrint(PetscStack *sint,FILE *fp) 152d9262e54SJed Brown { 153d9262e54SJed Brown int i; 154d9262e54SJed Brown 155d9262e54SJed Brown if (!sint) return(0); 156efca3c55SSatish 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]); 157d9262e54SJed Brown return 0; 158d9262e54SJed Brown } 159d9262e54SJed Brown 160