xref: /petsc/src/sys/error/pstack.c (revision d50831c44aeb795bfe318cd7aecdd61216e9ac7c)
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;
976386721SLisandro Dalcin #else
1076386721SLisandro Dalcin PetscThreadKey petscstack;
111f46d60fSShri Abhyankar #endif
12fe89fe5aSShri Abhyankar #else
137087cfbeSBarry Smith PetscStack *petscstack = 0;
14fe89fe5aSShri Abhyankar #endif
15d9262e54SJed Brown 
1615681b3cSBarry Smith 
17e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
18e04113cfSBarry Smith #include <petscviewersaws.h>
1915681b3cSBarry Smith 
202657e9d9SBarry Smith static PetscBool amsmemstack = PETSC_FALSE;
2115681b3cSBarry Smith 
22d9262e54SJed Brown #undef __FUNCT__
23e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsGrantAccess"
2415681b3cSBarry Smith /*@C
25e04113cfSBarry Smith    PetscStackSAWsGrantAccess - Grants access of the PETSc stack frames to the SAWs publisher
2615681b3cSBarry Smith 
2715681b3cSBarry Smith    Collective on PETSC_COMM_WORLD?
2815681b3cSBarry Smith 
2915681b3cSBarry Smith    Level: developer
3015681b3cSBarry Smith 
3115681b3cSBarry Smith    Concepts: publishing object
3215681b3cSBarry Smith 
33e04113cfSBarry Smith    Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines
3415681b3cSBarry Smith 
35e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess()
3615681b3cSBarry Smith 
3715681b3cSBarry Smith @*/
38e04113cfSBarry Smith void  PetscStackSAWsGrantAccess(void)
39d9262e54SJed Brown {
40ec957eceSBarry Smith   if (amsmemstack) {
4116ad0300SBarry Smith     /* ignore any errors from SAWs */
429a492a5cSBarry Smith     SAWs_Unlock();
4315681b3cSBarry Smith   }
44d9262e54SJed Brown }
45d9262e54SJed Brown 
46d9262e54SJed Brown #undef __FUNCT__
47e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsTakeAccess"
4815681b3cSBarry Smith /*@C
49e04113cfSBarry Smith    PetscStackSAWsTakeAccess - Takes access of the PETSc stack frames to the SAWs publisher
5015681b3cSBarry Smith 
5115681b3cSBarry Smith    Collective on PETSC_COMM_WORLD?
5215681b3cSBarry Smith 
5315681b3cSBarry Smith    Level: developer
5415681b3cSBarry Smith 
5515681b3cSBarry Smith    Concepts: publishing object
5615681b3cSBarry Smith 
57e04113cfSBarry Smith    Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallSAWs() since it may be used within those routines
5815681b3cSBarry Smith 
59e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess()
6015681b3cSBarry Smith 
6115681b3cSBarry Smith @*/
62e04113cfSBarry Smith void  PetscStackSAWsTakeAccess(void)
63d9262e54SJed Brown {
64ec957eceSBarry Smith   if (amsmemstack) {
6516ad0300SBarry Smith     /* ignore any errors from SAWs */
669a492a5cSBarry Smith     SAWs_Lock();
6715681b3cSBarry Smith   }
6815681b3cSBarry Smith }
6915681b3cSBarry Smith 
70e04113cfSBarry Smith PetscErrorCode PetscStackViewSAWs(void)
7115681b3cSBarry Smith {
7215681b3cSBarry Smith   PetscStack*    petscstackp;
73d45a07a7SBarry Smith   PetscMPIInt    rank;
74d45a07a7SBarry Smith   PetscErrorCode ierr;
7515681b3cSBarry Smith 
76d45a07a7SBarry Smith   ierr  = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
77d45a07a7SBarry Smith   if (rank) return 0;
7815681b3cSBarry Smith   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
7967a1e3b6SBarry Smith   PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/functions",petscstackp->function,20,SAWs_READ,SAWs_STRING));
80*d50831c4SBarry Smith   PetscStackCallSAWs(SAWs_Register,("/PETSc/Stack/__current_size",&petscstackp->currentsize,1,SAWs_READ,SAWs_INT));
812657e9d9SBarry Smith   amsmemstack = PETSC_TRUE;
8215681b3cSBarry Smith   return 0;
8315681b3cSBarry Smith }
8415681b3cSBarry Smith 
8515681b3cSBarry Smith #undef __FUNCT__
86e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsViewOff"
87e04113cfSBarry Smith PetscErrorCode PetscStackSAWsViewOff(void)
8815681b3cSBarry Smith {
89d9262e54SJed Brown   PetscFunctionBegin;
90d45a07a7SBarry Smith   if (!amsmemstack) PetscFunctionReturn(0);
9116ad0300SBarry Smith   PetscStackCallSAWs(SAWs_Delete,("/PETSc/Stack"));
922657e9d9SBarry Smith   amsmemstack = PETSC_FALSE;
93d9262e54SJed Brown   PetscFunctionReturn(0);
94d9262e54SJed Brown }
95d9262e54SJed Brown 
9615681b3cSBarry Smith #endif
9715681b3cSBarry Smith 
987d5f7e0cSShri Abhyankar PetscErrorCode PetscStackCreate(void)
9974b43855SShri Abhyankar {
10074b43855SShri Abhyankar   PetscStack *petscstack_in;
101dbf62e16SBarry Smith   if (PetscStackActive()) return 0;
10274b43855SShri Abhyankar 
10374b43855SShri Abhyankar   petscstack_in              = (PetscStack*)malloc(sizeof(PetscStack));
10474b43855SShri Abhyankar   petscstack_in->currentsize = 0;
105047240e1SBarry Smith   PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in);
10615681b3cSBarry Smith 
107e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
10815681b3cSBarry Smith   {
10915681b3cSBarry Smith   PetscBool flg = PETSC_FALSE;
11015681b3cSBarry Smith   PetscOptionsHasName(NULL,"-stack_view",&flg);
111e04113cfSBarry Smith   if (flg) PetscStackViewSAWs();
11215681b3cSBarry Smith   }
11315681b3cSBarry Smith #endif
11474b43855SShri Abhyankar   return 0;
11574b43855SShri Abhyankar }
11674b43855SShri Abhyankar 
11715681b3cSBarry Smith 
118d9262e54SJed Brown #undef __FUNCT__
119d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
120639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
121d9262e54SJed Brown {
122d9262e54SJed Brown   int        i;
1231f46d60fSShri Abhyankar   PetscStack *petscstackp;
124d9262e54SJed Brown 
1251f46d60fSShri Abhyankar   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
126639ff905SBarry Smith   if (!file) file = PETSC_STDOUT;
127d9262e54SJed Brown 
128d9262e54SJed Brown   if (file == PETSC_STDOUT) {
129d9262e54SJed Brown     (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n");
130d9262e54SJed Brown     (*PetscErrorPrintf)("      INSTEAD the line number of the start of the function\n");
131d9262e54SJed Brown     (*PetscErrorPrintf)("      is given.\n");
132a297a907SKarl 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]);
133d9262e54SJed Brown   } else {
134d9262e54SJed Brown     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
135d9262e54SJed Brown     fprintf(file,"      INSTEAD the line number of the start of the function\n");
136d9262e54SJed Brown     fprintf(file,"      is given.\n");
137a297a907SKarl 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]);
138d9262e54SJed Brown   }
139d9262e54SJed Brown   return 0;
140d9262e54SJed Brown }
141d9262e54SJed Brown 
1427d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void)
14374b43855SShri Abhyankar {
144dbf62e16SBarry Smith   if (PetscStackActive()) {
1451f46d60fSShri Abhyankar     PetscStack *petscstack_in;
1461f46d60fSShri Abhyankar     petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack);
14774b43855SShri Abhyankar     free(petscstack_in);
14876386721SLisandro Dalcin     PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,NULL);
1497d5f7e0cSShri Abhyankar   }
150d9262e54SJed Brown   return 0;
151d9262e54SJed Brown }
152d9262e54SJed Brown 
153d9262e54SJed Brown #undef __FUNCT__
154d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy"
155d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1567087cfbeSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack *sint,PetscStack *sout)
157d9262e54SJed Brown {
158d9262e54SJed Brown   int i;
159d9262e54SJed Brown 
160a297a907SKarl Rupp   if (!sint) sout->currentsize = 0;
161a297a907SKarl Rupp   else {
162d9262e54SJed Brown     for (i=0; i<sint->currentsize; i++) {
163d9262e54SJed Brown       sout->function[i]     = sint->function[i];
164d9262e54SJed Brown       sout->file[i]         = sint->file[i];
165d9262e54SJed Brown       sout->directory[i]    = sint->directory[i];
166d9262e54SJed Brown       sout->line[i]         = sint->line[i];
167a8d2bbe5SBarry Smith       sout->petscroutine[i] = sint->petscroutine[i];
168d9262e54SJed Brown     }
169d9262e54SJed Brown     sout->currentsize = sint->currentsize;
170d9262e54SJed Brown   }
171d9262e54SJed Brown   return 0;
172d9262e54SJed Brown }
173d9262e54SJed Brown 
174d9262e54SJed Brown #undef __FUNCT__
175d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint"
176d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1777087cfbeSBarry Smith PetscErrorCode  PetscStackPrint(PetscStack *sint,FILE *fp)
178d9262e54SJed Brown {
179d9262e54SJed Brown   int i;
180d9262e54SJed Brown 
181d9262e54SJed Brown   if (!sint) return(0);
182a297a907SKarl 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]);
183d9262e54SJed Brown   return 0;
184d9262e54SJed Brown }
185d9262e54SJed Brown 
186d9262e54SJed Brown #else
18715681b3cSBarry Smith 
18876386721SLisandro Dalcin #if defined(PETSC_HAVE_PTHREADCLASSES)
18976386721SLisandro Dalcin #if defined(PETSC_PTHREAD_LOCAL)
19076386721SLisandro Dalcin PETSC_PTHREAD_LOCAL void *petscstack = 0;
19176386721SLisandro Dalcin #else
19276386721SLisandro Dalcin PetscThreadKey petscstack;
19376386721SLisandro Dalcin #endif
19476386721SLisandro Dalcin #else
19576386721SLisandro Dalcin void *petscstack = 0;
19676386721SLisandro Dalcin #endif
19776386721SLisandro Dalcin 
198d9262e54SJed Brown #undef __FUNCT__
199d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
2007087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
201d9262e54SJed Brown {
202d9262e54SJed Brown   PetscFunctionBegin;
203d9262e54SJed Brown   PetscFunctionReturn(0);
204d9262e54SJed Brown }
205d9262e54SJed Brown #undef __FUNCT__
206d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
20776386721SLisandro Dalcin PetscErrorCode  PetscStackView(PETSC_UNUSED FILE *file)
208d9262e54SJed Brown {
209d9262e54SJed Brown   PetscFunctionBegin;
210d9262e54SJed Brown   PetscFunctionReturn(0);
211d9262e54SJed Brown }
212d9262e54SJed Brown #undef __FUNCT__
213d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
2147087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
215d9262e54SJed Brown {
216d9262e54SJed Brown   PetscFunctionBegin;
217d9262e54SJed Brown   PetscFunctionReturn(0);
218d9262e54SJed Brown }
21976386721SLisandro Dalcin #undef __FUNCT__
22076386721SLisandro Dalcin #define __FUNCT__ "PetscStackCopy"
22176386721SLisandro Dalcin PetscErrorCode  PetscStackCopy(PETSC_UNUSED void *sint,PETSC_UNUSED void *sout)
22276386721SLisandro Dalcin {
22376386721SLisandro Dalcin   PetscFunctionBegin;
22476386721SLisandro Dalcin   PetscFunctionReturn(0);
22576386721SLisandro Dalcin }
22676386721SLisandro Dalcin #undef __FUNCT__
22776386721SLisandro Dalcin #define __FUNCT__ "PetscStackPrint"
22876386721SLisandro Dalcin PetscErrorCode  PetscStackPrint(PETSC_UNUSED void *sint,PETSC_UNUSED FILE *fp)
22976386721SLisandro Dalcin {
23076386721SLisandro Dalcin   PetscFunctionBegin;
23176386721SLisandro Dalcin   PetscFunctionReturn(0);
23276386721SLisandro Dalcin }
233d9262e54SJed Brown 
234e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)     /* SAWs stack functions do nothing in optimized mode */
235e04113cfSBarry Smith void PetscStackSAWsGrantAccess(void) {}
236e04113cfSBarry Smith void PetscStackSAWsTakeAccess(void) {}
2376eb7abf7SJed Brown 
238e04113cfSBarry Smith PetscErrorCode PetscStackViewSAWs(void)
2396eb7abf7SJed Brown {
2406eb7abf7SJed Brown   return 0;
2416eb7abf7SJed Brown }
2426eb7abf7SJed Brown 
2436eb7abf7SJed Brown #undef __FUNCT__
244e04113cfSBarry Smith #define __FUNCT__ "PetscStackSAWsViewOff"
245e04113cfSBarry Smith PetscErrorCode  PetscStackSAWsViewOff(void)
2466eb7abf7SJed Brown {
2476eb7abf7SJed Brown   PetscFunctionBegin;
2486eb7abf7SJed Brown   PetscFunctionReturn(0);
2496eb7abf7SJed Brown }
2506eb7abf7SJed Brown #endif
2516eb7abf7SJed Brown 
252d9262e54SJed Brown #endif
253d9262e54SJed Brown 
254