xref: /petsc/src/sys/error/pstack.c (revision 27104ee2013e31f06617ed2b246343664c6dee21)
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