1d9262e54SJed Brown 2*27104ee2SJacob Faibussowitsch #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 3d9262e54SJed Brown 4*27104ee2SJacob Faibussowitsch #if PetscDefined(USE_DEBUG) 5*27104ee2SJacob Faibussowitsch PetscStack petscstack; 6*27104ee2SJacob Faibussowitsch #endif 715681b3cSBarry Smith 8e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 9e04113cfSBarry Smith #include <petscviewersaws.h> 1015681b3cSBarry Smith 112657e9d9SBarry Smith static PetscBool amsmemstack = PETSC_FALSE; 1215681b3cSBarry Smith 1315681b3cSBarry Smith /*@C 14e04113cfSBarry Smith PetscStackSAWsGrantAccess - Grants access of the PETSc stack frames to the SAWs publisher 1515681b3cSBarry Smith 1615681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 1715681b3cSBarry Smith 1815681b3cSBarry Smith Level: developer 1915681b3cSBarry Smith 20e04113cfSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines 2115681b3cSBarry Smith 22e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 2315681b3cSBarry Smith 2415681b3cSBarry Smith @*/ 25e04113cfSBarry Smith void PetscStackSAWsGrantAccess(void) 26d9262e54SJed Brown { 27ec957eceSBarry Smith if (amsmemstack) { 2816ad0300SBarry Smith /* ignore any errors from SAWs */ 299a492a5cSBarry Smith SAWs_Unlock(); 3015681b3cSBarry Smith } 31d9262e54SJed Brown } 32d9262e54SJed Brown 3315681b3cSBarry Smith /*@C 34e04113cfSBarry Smith PetscStackSAWsTakeAccess - Takes access of the PETSc stack frames to the SAWs publisher 3515681b3cSBarry Smith 3615681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 3715681b3cSBarry Smith 3815681b3cSBarry Smith Level: developer 3915681b3cSBarry Smith 40e04113cfSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines 4115681b3cSBarry Smith 42e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 4315681b3cSBarry Smith 4415681b3cSBarry Smith @*/ 45e04113cfSBarry Smith void PetscStackSAWsTakeAccess(void) 46d9262e54SJed Brown { 47ec957eceSBarry Smith if (amsmemstack) { 4816ad0300SBarry Smith /* ignore any errors from SAWs */ 499a492a5cSBarry Smith SAWs_Lock(); 5015681b3cSBarry Smith } 5115681b3cSBarry Smith } 5215681b3cSBarry Smith 53e04113cfSBarry Smith PetscErrorCode PetscStackViewSAWs(void) 5415681b3cSBarry Smith { 55d45a07a7SBarry Smith PetscMPIInt rank; 56d45a07a7SBarry Smith PetscErrorCode ierr; 5715681b3cSBarry Smith 5855b25c41SPierre Jolivet ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 59d45a07a7SBarry Smith if (rank) return 0; 60*27104ee2SJacob Faibussowitsch #if PetscDefined(USE_DEBUG) 61*27104ee2SJacob Faibussowitsch PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/functions",petscstack.function,20,SAWs_READ,SAWs_STRING)); 62*27104ee2SJacob Faibussowitsch PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/__current_size",&petscstack.currentsize,1,SAWs_READ,SAWs_INT)); 63*27104ee2SJacob Faibussowitsch #endif 642657e9d9SBarry Smith amsmemstack = PETSC_TRUE; 6515681b3cSBarry Smith return 0; 6615681b3cSBarry Smith } 6715681b3cSBarry Smith 68e04113cfSBarry Smith PetscErrorCode PetscStackSAWsViewOff(void) 6915681b3cSBarry Smith { 70d9262e54SJed Brown PetscFunctionBegin; 71d45a07a7SBarry Smith if (!amsmemstack) PetscFunctionReturn(0); 7216ad0300SBarry Smith PetscStackCallSAWs(SAWs_Delete,("/PETSc/Stack")); 732657e9d9SBarry Smith amsmemstack = PETSC_FALSE; 74d9262e54SJed Brown PetscFunctionReturn(0); 75d9262e54SJed Brown } 76*27104ee2SJacob Faibussowitsch #endif /* PETSC_HAVE_SAWS */ 77d9262e54SJed Brown 78*27104ee2SJacob Faibussowitsch #if PetscDefined(USE_DEBUG) 79*27104ee2SJacob Faibussowitsch PetscErrorCode PetscStackSetCheck(PetscBool check) 8074b43855SShri Abhyankar { 81*27104ee2SJacob Faibussowitsch petscstack.check = check; 82*27104ee2SJacob Faibussowitsch return 0; 837fdeb8b9SBarry Smith } 8415681b3cSBarry Smith 85*27104ee2SJacob Faibussowitsch PetscErrorCode PetscStackReset(void) 8615681b3cSBarry Smith { 87*27104ee2SJacob Faibussowitsch memset(&petscstack,0,sizeof(petscstack)); 8874b43855SShri Abhyankar return 0; 8974b43855SShri Abhyankar } 9074b43855SShri Abhyankar 91639ff905SBarry Smith PetscErrorCode PetscStackView(FILE *file) 92d9262e54SJed Brown { 93639ff905SBarry Smith if (!file) file = PETSC_STDOUT; 94*27104ee2SJacob Faibussowitsch if (petscstack.currentsize < 0) { 95*27104ee2SJacob Faibussowitsch /* < 0 is absolutely a corrupted stack, but this function is usually called in an error 96*27104ee2SJacob Faibussowitsch * handler, which are not capable of recovering from errors so best we can do is print 97*27104ee2SJacob Faibussowitsch * this warning */ 98*27104ee2SJacob Faibussowitsch fprintf(file,"PetscStack is definitely corrupted with stack size %d\n",petscstack.currentsize); 99*27104ee2SJacob Faibussowitsch } else if (petscstack.currentsize == 0) { 100d9262e54SJed Brown if (file == PETSC_STDOUT) { 1017a746cd8SPierre Jolivet (*PetscErrorPrintf)("No error traceback is available, the problem could be in the main program. \n"); 1026d07e311SBarry Smith } else { 1037a746cd8SPierre Jolivet fprintf(file,"No error traceback is available, the problem could be in the main program. \n"); 1046d07e311SBarry Smith } 1056d07e311SBarry Smith } else { 1066d07e311SBarry Smith if (file == PETSC_STDOUT) { 1076d07e311SBarry Smith (*PetscErrorPrintf)("The EXACT line numbers in the error traceback are not available.\n"); 1086d07e311SBarry Smith (*PetscErrorPrintf)("instead the line number of the start of the function is given.\n"); 109*27104ee2SJacob Faibussowitsch for (int i = petscstack.currentsize-1, j = 1; i >= 0; --i, ++j) { 110*27104ee2SJacob Faibussowitsch (*PetscErrorPrintf)("#%d %s() at %s:%d\n",j,petscstack.function[i],petscstack.file[i],petscstack.line[i]); 111*27104ee2SJacob Faibussowitsch } 112d9262e54SJed Brown } else { 1136d07e311SBarry Smith fprintf(file,"The EXACT line numbers in the error traceback are not available.\n"); 1146d07e311SBarry Smith fprintf(file,"Instead the line number of the start of the function is given.\n"); 115*27104ee2SJacob Faibussowitsch for (int i = petscstack.currentsize-1, j = 1; i >= 0; --i, ++j) { 116*27104ee2SJacob Faibussowitsch fprintf(file,"[%d] #%d %s() at %s:%d\n",PetscGlobalRank,j,petscstack.function[i],petscstack.file[i],petscstack.line[i]); 117d9262e54SJed Brown } 1186d07e311SBarry Smith } 1197d5f7e0cSShri Abhyankar } 120d9262e54SJed Brown return 0; 121d9262e54SJed Brown } 122d9262e54SJed Brown 123d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1247087cfbeSBarry Smith PetscErrorCode PetscStackCopy(PetscStack *sint,PetscStack *sout) 125d9262e54SJed Brown { 126*27104ee2SJacob Faibussowitsch if (sint) { 127*27104ee2SJacob Faibussowitsch for (int i = 0; i < sint->currentsize; ++i) { 128d9262e54SJed Brown sout->function[i] = sint->function[i]; 129d9262e54SJed Brown sout->file[i] = sint->file[i]; 130d9262e54SJed Brown sout->line[i] = sint->line[i]; 131a8d2bbe5SBarry Smith sout->petscroutine[i] = sint->petscroutine[i]; 132d9262e54SJed Brown } 133d9262e54SJed Brown sout->currentsize = sint->currentsize; 134*27104ee2SJacob Faibussowitsch } else { 135*27104ee2SJacob Faibussowitsch sout->currentsize = 0; 136d9262e54SJed Brown } 137d9262e54SJed Brown return 0; 138d9262e54SJed Brown } 139d9262e54SJed Brown 140d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1417087cfbeSBarry Smith PetscErrorCode PetscStackPrint(PetscStack *sint,FILE *fp) 142d9262e54SJed Brown { 143*27104ee2SJacob Faibussowitsch if (sint) { 144*27104ee2SJacob Faibussowitsch for (int i = sint->currentsize-2; i >= 0; --i) { 145*27104ee2SJacob Faibussowitsch fprintf(fp," [%d] %s() at %s:%d\n",PetscGlobalRank,sint->function[i],sint->file[i],sint->line[i]); 146*27104ee2SJacob Faibussowitsch } 147*27104ee2SJacob Faibussowitsch } 148d9262e54SJed Brown return 0; 149d9262e54SJed Brown } 150*27104ee2SJacob Faibussowitsch #endif /* PetscDefined(USE_DEBUG) */ 151