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