xref: /petsc/src/sys/error/pstack.c (revision d45a07a79bb1e93ae6fa85d4a4175cd20a6ac3a0)
1d9262e54SJed Brown 
2c6db04a5SJed Brown #include <petscsys.h>        /*I  "petscsys.h"   I*/
3d9262e54SJed Brown 
48bf1f09cSShri Abhyankar #if defined(PETSC_USE_DEBUG)
5d9262e54SJed Brown 
61f46d60fSShri Abhyankar #if defined(PETSC_HAVE_PTHREADCLASSES)
7997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL)
8997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack *petscstack = 0;
91f46d60fSShri Abhyankar #endif
10fe89fe5aSShri Abhyankar #else
117087cfbeSBarry Smith PetscStack *petscstack = 0;
12fe89fe5aSShri Abhyankar #endif
13d9262e54SJed Brown 
1415681b3cSBarry Smith 
15e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
16e04113cfSBarry Smith #include <petscviewersaws.h>
1715681b3cSBarry Smith 
182657e9d9SBarry Smith static PetscBool amsmemstack = PETSC_FALSE;
1915681b3cSBarry Smith 
20d9262e54SJed Brown #undef __FUNCT__
21e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsGrantAccess"
2215681b3cSBarry Smith /*@C
23e04113cfSBarry Smith    PetscStackSAWsGrantAccess - Grants access of the PETSc stack frames to the SAWs publisher
2415681b3cSBarry Smith 
2515681b3cSBarry Smith    Collective on PETSC_COMM_WORLD?
2615681b3cSBarry Smith 
2715681b3cSBarry Smith    Level: developer
2815681b3cSBarry Smith 
2915681b3cSBarry Smith    Concepts: publishing object
3015681b3cSBarry Smith 
31e04113cfSBarry Smith    Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines
3215681b3cSBarry Smith 
33e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess()
3415681b3cSBarry Smith 
3515681b3cSBarry Smith @*/
36e04113cfSBarry Smith void  PetscStackSAWsGrantAccess(void)
37d9262e54SJed Brown {
38ec957eceSBarry Smith   if (amsmemstack) {
3916ad0300SBarry Smith     /* ignore any errors from SAWs */
409a492a5cSBarry Smith     SAWs_Unlock();
4115681b3cSBarry Smith   }
42d9262e54SJed Brown }
43d9262e54SJed Brown 
44d9262e54SJed Brown #undef __FUNCT__
45e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsTakeAccess"
4615681b3cSBarry Smith /*@C
47e04113cfSBarry Smith    PetscStackSAWsTakeAccess - Takes access of the PETSc stack frames to the SAWs publisher
4815681b3cSBarry Smith 
4915681b3cSBarry Smith    Collective on PETSC_COMM_WORLD?
5015681b3cSBarry Smith 
5115681b3cSBarry Smith    Level: developer
5215681b3cSBarry Smith 
5315681b3cSBarry Smith    Concepts: publishing object
5415681b3cSBarry Smith 
55e04113cfSBarry Smith    Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines
5615681b3cSBarry Smith 
57e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess()
5815681b3cSBarry Smith 
5915681b3cSBarry Smith @*/
60e04113cfSBarry Smith void  PetscStackSAWsTakeAccess(void)
61d9262e54SJed Brown {
62ec957eceSBarry Smith   if (amsmemstack) {
6316ad0300SBarry Smith     /* ignore any errors from SAWs */
649a492a5cSBarry Smith     SAWs_Lock();
6515681b3cSBarry Smith   }
6615681b3cSBarry Smith }
6715681b3cSBarry Smith 
68e04113cfSBarry Smith PetscErrorCode PetscStackViewSAWs(void)
6915681b3cSBarry Smith {
7015681b3cSBarry Smith   PetscStack*    petscstackp;
71*d45a07a7SBarry Smith   PetscMPIInt    rank;
72*d45a07a7SBarry Smith   PetscErrorCode ierr;
7315681b3cSBarry Smith 
74*d45a07a7SBarry Smith   ierr  = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
75*d45a07a7SBarry Smith   if (rank) return 0;
7615681b3cSBarry Smith   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
7767a1e3b6SBarry Smith   PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/functions",petscstackp->function,20,SAWs_READ,SAWs_STRING));
78b8a862caSBarry Smith   PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/_current_size",&petscstackp->currentsize,1,SAWs_READ,SAWs_INT));
792657e9d9SBarry Smith   amsmemstack = PETSC_TRUE;
8015681b3cSBarry Smith   return 0;
8115681b3cSBarry Smith }
8215681b3cSBarry Smith 
8315681b3cSBarry Smith #undef __FUNCT__
84e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsViewOff"
85e04113cfSBarry Smith PetscErrorCode PetscStackSAWsViewOff(void)
8615681b3cSBarry Smith {
87d9262e54SJed Brown   PetscFunctionBegin;
88*d45a07a7SBarry Smith   if (!amsmemstack) PetscFunctionReturn(0);
8916ad0300SBarry Smith   PetscStackCallSAWs(SAWs_Delete,("/PETSc/Stack"));
902657e9d9SBarry Smith   amsmemstack = PETSC_FALSE;
91d9262e54SJed Brown   PetscFunctionReturn(0);
92d9262e54SJed Brown }
93d9262e54SJed Brown 
9415681b3cSBarry Smith #endif
9515681b3cSBarry Smith 
967d5f7e0cSShri Abhyankar PetscErrorCode PetscStackCreate(void)
9774b43855SShri Abhyankar {
9874b43855SShri Abhyankar   PetscStack *petscstack_in;
99dbf62e16SBarry Smith   if (PetscStackActive()) return 0;
10074b43855SShri Abhyankar 
10174b43855SShri Abhyankar   petscstack_in              = (PetscStack*)malloc(sizeof(PetscStack));
10274b43855SShri Abhyankar   petscstack_in->currentsize = 0;
103047240e1SBarry Smith   PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in);
10415681b3cSBarry Smith 
105e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
10615681b3cSBarry Smith   {
10715681b3cSBarry Smith   PetscBool flg = PETSC_FALSE;
10815681b3cSBarry Smith   PetscOptionsHasName(NULL,"-stack_view",&flg);
109e04113cfSBarry Smith   if (flg) PetscStackViewSAWs();
11015681b3cSBarry Smith   }
11115681b3cSBarry Smith #endif
11274b43855SShri Abhyankar   return 0;
11374b43855SShri Abhyankar }
11474b43855SShri Abhyankar 
11515681b3cSBarry Smith 
116d9262e54SJed Brown #undef __FUNCT__
117d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
118639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
119d9262e54SJed Brown {
120d9262e54SJed Brown   int        i;
1211f46d60fSShri Abhyankar   PetscStack *petscstackp;
122d9262e54SJed Brown 
1231f46d60fSShri Abhyankar   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
124639ff905SBarry Smith   if (!file) file = PETSC_STDOUT;
125d9262e54SJed Brown 
126d9262e54SJed Brown   if (file == PETSC_STDOUT) {
127d9262e54SJed Brown     (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n");
128d9262e54SJed Brown     (*PetscErrorPrintf)("      INSTEAD the line number of the start of the function\n");
129d9262e54SJed Brown     (*PetscErrorPrintf)("      is given.\n");
130a297a907SKarl Rupp     for (i=petscstackp->currentsize-1; i>=0; i--) (*PetscErrorPrintf)("[%d] %s line %d %s%s\n",PetscGlobalRank,petscstackp->function[i],petscstackp->line[i],petscstackp->directory[i],petscstackp->file[i]);
131d9262e54SJed Brown   } else {
132d9262e54SJed Brown     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
133d9262e54SJed Brown     fprintf(file,"      INSTEAD the line number of the start of the function\n");
134d9262e54SJed Brown     fprintf(file,"      is given.\n");
135a297a907SKarl Rupp     for (i=petscstackp->currentsize-1; i>=0; i--) fprintf(file,"[%d] %s line %d %s%s\n",PetscGlobalRank,petscstackp->function[i],petscstackp->line[i],petscstackp->directory[i],petscstackp->file[i]);
136d9262e54SJed Brown   }
137d9262e54SJed Brown   return 0;
138d9262e54SJed Brown }
139d9262e54SJed Brown 
1407d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void)
14174b43855SShri Abhyankar {
142dbf62e16SBarry Smith   if (PetscStackActive()) {
1431f46d60fSShri Abhyankar     PetscStack *petscstack_in;
1441f46d60fSShri Abhyankar     petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack);
14574b43855SShri Abhyankar     free(petscstack_in);
146047240e1SBarry Smith     PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,(PetscStack*)0);
14761d886c9SShri Abhyankar     PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */
1487d5f7e0cSShri Abhyankar   }
149d9262e54SJed Brown   return 0;
150d9262e54SJed Brown }
151d9262e54SJed Brown 
152d9262e54SJed Brown #undef __FUNCT__
153d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy"
154d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1557087cfbeSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack *sint,PetscStack *sout)
156d9262e54SJed Brown {
157d9262e54SJed Brown   int i;
158d9262e54SJed Brown 
159a297a907SKarl Rupp   if (!sint) sout->currentsize = 0;
160a297a907SKarl Rupp   else {
161d9262e54SJed Brown     for (i=0; i<sint->currentsize; i++) {
162d9262e54SJed Brown       sout->function[i]     = sint->function[i];
163d9262e54SJed Brown       sout->file[i]         = sint->file[i];
164d9262e54SJed Brown       sout->directory[i]    = sint->directory[i];
165d9262e54SJed Brown       sout->line[i]         = sint->line[i];
166a8d2bbe5SBarry Smith       sout->petscroutine[i] = sint->petscroutine[i];
167d9262e54SJed Brown     }
168d9262e54SJed Brown     sout->currentsize = sint->currentsize;
169d9262e54SJed Brown   }
170d9262e54SJed Brown   return 0;
171d9262e54SJed Brown }
172d9262e54SJed Brown 
173d9262e54SJed Brown #undef __FUNCT__
174d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint"
175d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1767087cfbeSBarry Smith PetscErrorCode  PetscStackPrint(PetscStack *sint,FILE *fp)
177d9262e54SJed Brown {
178d9262e54SJed Brown   int i;
179d9262e54SJed Brown 
180d9262e54SJed Brown   if (!sint) return(0);
181a297a907SKarl Rupp   for (i=sint->currentsize-2; i>=0; i--) fprintf(fp,"      [%d]  %s() line %d in %s%s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->directory[i],sint->file[i]);
182d9262e54SJed Brown   return 0;
183d9262e54SJed Brown }
184d9262e54SJed Brown 
185d9262e54SJed Brown #else
18615681b3cSBarry Smith 
187d9262e54SJed Brown #undef __FUNCT__
188d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
1897087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
190d9262e54SJed Brown {
191d9262e54SJed Brown   PetscFunctionBegin;
192d9262e54SJed Brown   PetscFunctionReturn(0);
193d9262e54SJed Brown }
194d9262e54SJed Brown #undef __FUNCT__
195d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
196639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
197d9262e54SJed Brown {
198d9262e54SJed Brown   PetscFunctionBegin;
199d9262e54SJed Brown   PetscFunctionReturn(0);
200d9262e54SJed Brown }
201d9262e54SJed Brown #undef __FUNCT__
202d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
2037087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
204d9262e54SJed Brown {
205d9262e54SJed Brown   PetscFunctionBegin;
206d9262e54SJed Brown   PetscFunctionReturn(0);
207d9262e54SJed Brown }
208d9262e54SJed Brown 
209e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)     /* SAWs stack functions do nothing in optimized mode */
210e04113cfSBarry Smith void PetscStackSAWsGrantAccess(void) {}
211e04113cfSBarry Smith void PetscStackSAWsTakeAccess(void) {}
2126eb7abf7SJed Brown 
213e04113cfSBarry Smith PetscErrorCode PetscStackViewSAWs(void)
2146eb7abf7SJed Brown {
2156eb7abf7SJed Brown   return 0;
2166eb7abf7SJed Brown }
2176eb7abf7SJed Brown 
2186eb7abf7SJed Brown #undef __FUNCT__
219e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsViewOff"
220e04113cfSBarry Smith PetscErrorCode  PetscStackSAWsViewOff(void)
2216eb7abf7SJed Brown {
2226eb7abf7SJed Brown   PetscFunctionBegin;
2236eb7abf7SJed Brown   PetscFunctionReturn(0);
2246eb7abf7SJed Brown }
2256eb7abf7SJed Brown #endif
2266eb7abf7SJed Brown 
227d9262e54SJed Brown #endif
228d9262e54SJed Brown 
229