xref: /petsc/src/sys/error/pstack.c (revision efca3c55b02548817e185e5069a2acfe20fa4458)
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 
1715681b3cSBarry Smith #if defined(PETSC_HAVE_AMS)
1815681b3cSBarry Smith #include <petscviewerams.h>
1915681b3cSBarry Smith 
2015681b3cSBarry Smith static AMS_Memory amsmemstack = -1;
2115681b3cSBarry Smith 
22d9262e54SJed Brown #undef __FUNCT__
2315681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSGrantAccess"
2415681b3cSBarry Smith /*@C
2515681b3cSBarry Smith    PetscStackAMSGrantAccess - Grants access of the PETSc stack frames to the AMS 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 
3315681b3cSBarry Smith    Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallAMS() since it may be used within those routines
3415681b3cSBarry Smith 
3515681b3cSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess()
3615681b3cSBarry Smith 
3715681b3cSBarry Smith @*/
3815681b3cSBarry Smith void  PetscStackAMSGrantAccess(void)
39d9262e54SJed Brown {
4015681b3cSBarry Smith   if (amsmemstack != -1) {
4115681b3cSBarry Smith     AMS_Memory_grant_access(amsmemstack);
4215681b3cSBarry Smith   }
43d9262e54SJed Brown }
44d9262e54SJed Brown 
45d9262e54SJed Brown #undef __FUNCT__
4615681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSTakeAccess"
4715681b3cSBarry Smith /*@C
4815681b3cSBarry Smith    PetscStackAMSTakeAccess - Takes access of the PETSc stack frames to the AMS publisher
4915681b3cSBarry Smith 
5015681b3cSBarry Smith    Collective on PETSC_COMM_WORLD?
5115681b3cSBarry Smith 
5215681b3cSBarry Smith    Level: developer
5315681b3cSBarry Smith 
5415681b3cSBarry Smith    Concepts: publishing object
5515681b3cSBarry Smith 
5615681b3cSBarry Smith    Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallAMS() since it may be used within those routines
5715681b3cSBarry Smith 
5815681b3cSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess()
5915681b3cSBarry Smith 
6015681b3cSBarry Smith @*/
6115681b3cSBarry Smith void  PetscStackAMSTakeAccess(void)
62d9262e54SJed Brown {
6315681b3cSBarry Smith   if (amsmemstack != -1) {
6415681b3cSBarry Smith     AMS_Memory_take_access(amsmemstack);
6515681b3cSBarry Smith   }
6615681b3cSBarry Smith }
6715681b3cSBarry Smith 
6815681b3cSBarry Smith PetscErrorCode PetscStackViewAMS(void)
6915681b3cSBarry Smith {
7015681b3cSBarry Smith   AMS_Comm       acomm;
7115681b3cSBarry Smith   PetscErrorCode ierr;
7215681b3cSBarry Smith   AMS_Memory     mem;
7315681b3cSBarry Smith   PetscStack*    petscstackp;
7415681b3cSBarry Smith 
7515681b3cSBarry Smith   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
7615681b3cSBarry Smith   ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_WORLD,&acomm);CHKERRQ(ierr);
7715681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_create,(acomm,"Stack",&mem));
7815681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_take_access,(mem));
7915681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_add_field,(mem,"functions",petscstackp->function,10,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
8015681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_add_field,(mem,"current size",&petscstackp->currentsize,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
8115681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_publish,(mem));
8215681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_grant_access,(mem));
8315681b3cSBarry Smith   amsmemstack = mem;
8415681b3cSBarry Smith   return 0;
8515681b3cSBarry Smith }
8615681b3cSBarry Smith 
8715681b3cSBarry Smith #undef __FUNCT__
8815681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSViewOff"
8915681b3cSBarry Smith PetscErrorCode PetscStackAMSViewOff(void)
9015681b3cSBarry Smith {
9115681b3cSBarry Smith   PetscErrorCode ierr;
9215681b3cSBarry Smith 
93d9262e54SJed Brown   PetscFunctionBegin;
9415681b3cSBarry Smith   if (amsmemstack == -1) PetscFunctionReturn(0);
9515681b3cSBarry Smith   ierr        = AMS_Memory_destroy(amsmemstack);CHKERRQ(ierr);
9615681b3cSBarry Smith   amsmemstack = -1;
97d9262e54SJed Brown   PetscFunctionReturn(0);
98d9262e54SJed Brown }
99d9262e54SJed Brown 
10015681b3cSBarry Smith #endif
10115681b3cSBarry Smith 
1027d5f7e0cSShri Abhyankar PetscErrorCode PetscStackCreate(void)
10374b43855SShri Abhyankar {
10474b43855SShri Abhyankar   PetscStack *petscstack_in;
105dbf62e16SBarry Smith   if (PetscStackActive()) return 0;
10674b43855SShri Abhyankar 
10774b43855SShri Abhyankar   petscstack_in              = (PetscStack*)malloc(sizeof(PetscStack));
10874b43855SShri Abhyankar   petscstack_in->currentsize = 0;
109047240e1SBarry Smith   PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in);
11015681b3cSBarry Smith 
11115681b3cSBarry Smith #if defined(PETSC_HAVE_AMS)
11215681b3cSBarry Smith   {
11315681b3cSBarry Smith   PetscBool flg = PETSC_FALSE;
11415681b3cSBarry Smith   PetscOptionsHasName(NULL,"-stack_view",&flg);
11515681b3cSBarry Smith   if (flg) PetscStackViewAMS();
11615681b3cSBarry Smith   }
11715681b3cSBarry Smith #endif
11874b43855SShri Abhyankar   return 0;
11974b43855SShri Abhyankar }
12074b43855SShri Abhyankar 
12115681b3cSBarry Smith 
122d9262e54SJed Brown #undef __FUNCT__
123d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
124639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
125d9262e54SJed Brown {
126d9262e54SJed Brown   int        i;
1271f46d60fSShri Abhyankar   PetscStack *petscstackp;
128d9262e54SJed Brown 
1291f46d60fSShri Abhyankar   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
130639ff905SBarry Smith   if (!file) file = PETSC_STDOUT;
131d9262e54SJed Brown 
132d9262e54SJed Brown   if (file == PETSC_STDOUT) {
133d9262e54SJed Brown     (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n");
134d9262e54SJed Brown     (*PetscErrorPrintf)("      INSTEAD the line number of the start of the function\n");
135d9262e54SJed Brown     (*PetscErrorPrintf)("      is given.\n");
136*efca3c55SSatish Balay     for (i=petscstackp->currentsize-1; i>=0; i--) (*PetscErrorPrintf)("[%d] %s line %d %s\n",PetscGlobalRank,petscstackp->function[i],petscstackp->line[i],petscstackp->file[i]);
137d9262e54SJed Brown   } else {
138d9262e54SJed Brown     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
139d9262e54SJed Brown     fprintf(file,"      INSTEAD the line number of the start of the function\n");
140d9262e54SJed Brown     fprintf(file,"      is given.\n");
141*efca3c55SSatish Balay     for (i=petscstackp->currentsize-1; i>=0; i--) fprintf(file,"[%d] %s line %d %s\n",PetscGlobalRank,petscstackp->function[i],petscstackp->line[i],petscstackp->file[i]);
142d9262e54SJed Brown   }
143d9262e54SJed Brown   return 0;
144d9262e54SJed Brown }
145d9262e54SJed Brown 
1467d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void)
14774b43855SShri Abhyankar {
148dbf62e16SBarry Smith   if (PetscStackActive()) {
1491f46d60fSShri Abhyankar     PetscStack *petscstack_in;
1501f46d60fSShri Abhyankar     petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack);
15174b43855SShri Abhyankar     free(petscstack_in);
15276386721SLisandro Dalcin     PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,NULL);
1537d5f7e0cSShri Abhyankar   }
154d9262e54SJed Brown   return 0;
155d9262e54SJed Brown }
156d9262e54SJed Brown 
157d9262e54SJed Brown #undef __FUNCT__
158d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy"
159d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1607087cfbeSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack *sint,PetscStack *sout)
161d9262e54SJed Brown {
162d9262e54SJed Brown   int i;
163d9262e54SJed Brown 
164a297a907SKarl Rupp   if (!sint) sout->currentsize = 0;
165a297a907SKarl Rupp   else {
166d9262e54SJed Brown     for (i=0; i<sint->currentsize; i++) {
167d9262e54SJed Brown       sout->function[i]     = sint->function[i];
168d9262e54SJed Brown       sout->file[i]         = sint->file[i];
169d9262e54SJed Brown       sout->line[i]         = sint->line[i];
170a8d2bbe5SBarry Smith       sout->petscroutine[i] = sint->petscroutine[i];
171d9262e54SJed Brown     }
172d9262e54SJed Brown     sout->currentsize = sint->currentsize;
173d9262e54SJed Brown   }
174d9262e54SJed Brown   return 0;
175d9262e54SJed Brown }
176d9262e54SJed Brown 
177d9262e54SJed Brown #undef __FUNCT__
178d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint"
179d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1807087cfbeSBarry Smith PetscErrorCode  PetscStackPrint(PetscStack *sint,FILE *fp)
181d9262e54SJed Brown {
182d9262e54SJed Brown   int i;
183d9262e54SJed Brown 
184d9262e54SJed Brown   if (!sint) return(0);
185*efca3c55SSatish 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]);
186d9262e54SJed Brown   return 0;
187d9262e54SJed Brown }
188d9262e54SJed Brown 
189d9262e54SJed Brown #else
19015681b3cSBarry Smith 
19176386721SLisandro Dalcin #if defined(PETSC_HAVE_PTHREADCLASSES)
19276386721SLisandro Dalcin #if defined(PETSC_PTHREAD_LOCAL)
19376386721SLisandro Dalcin PETSC_PTHREAD_LOCAL void *petscstack = 0;
19476386721SLisandro Dalcin #else
19576386721SLisandro Dalcin PetscThreadKey petscstack;
19676386721SLisandro Dalcin #endif
19776386721SLisandro Dalcin #else
19876386721SLisandro Dalcin void *petscstack = 0;
19976386721SLisandro Dalcin #endif
20076386721SLisandro Dalcin 
201d9262e54SJed Brown #undef __FUNCT__
202d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
2037087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
204d9262e54SJed Brown {
205d9262e54SJed Brown   PetscFunctionBegin;
206d9262e54SJed Brown   PetscFunctionReturn(0);
207d9262e54SJed Brown }
208d9262e54SJed Brown #undef __FUNCT__
209d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
21076386721SLisandro Dalcin PetscErrorCode  PetscStackView(PETSC_UNUSED FILE *file)
211d9262e54SJed Brown {
212d9262e54SJed Brown   PetscFunctionBegin;
213d9262e54SJed Brown   PetscFunctionReturn(0);
214d9262e54SJed Brown }
215d9262e54SJed Brown #undef __FUNCT__
216d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
2177087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
218d9262e54SJed Brown {
219d9262e54SJed Brown   PetscFunctionBegin;
220d9262e54SJed Brown   PetscFunctionReturn(0);
221d9262e54SJed Brown }
22276386721SLisandro Dalcin #undef __FUNCT__
22376386721SLisandro Dalcin #define __FUNCT__ "PetscStackCopy"
22476386721SLisandro Dalcin PetscErrorCode  PetscStackCopy(PETSC_UNUSED void *sint,PETSC_UNUSED void *sout)
22576386721SLisandro Dalcin {
22676386721SLisandro Dalcin   PetscFunctionBegin;
22776386721SLisandro Dalcin   PetscFunctionReturn(0);
22876386721SLisandro Dalcin }
22976386721SLisandro Dalcin #undef __FUNCT__
23076386721SLisandro Dalcin #define __FUNCT__ "PetscStackPrint"
23176386721SLisandro Dalcin PetscErrorCode  PetscStackPrint(PETSC_UNUSED void *sint,PETSC_UNUSED FILE *fp)
23276386721SLisandro Dalcin {
23376386721SLisandro Dalcin   PetscFunctionBegin;
23476386721SLisandro Dalcin   PetscFunctionReturn(0);
23576386721SLisandro Dalcin }
236d9262e54SJed Brown 
2376eb7abf7SJed Brown #if defined(PETSC_HAVE_AMS)     /* AMS stack functions do nothing in optimized mode */
2386eb7abf7SJed Brown void PetscStackAMSGrantAccess(void) {}
2396eb7abf7SJed Brown void PetscStackAMSTakeAccess(void) {}
2406eb7abf7SJed Brown 
2416eb7abf7SJed Brown PetscErrorCode PetscStackViewAMS(void)
2426eb7abf7SJed Brown {
2436eb7abf7SJed Brown   return 0;
2446eb7abf7SJed Brown }
2456eb7abf7SJed Brown 
2466eb7abf7SJed Brown #undef __FUNCT__
2476eb7abf7SJed Brown #define __FUNCT__ "PetscStackAMSViewOff"
2486eb7abf7SJed Brown PetscErrorCode  PetscStackAMSViewOff(void)
2496eb7abf7SJed Brown {
2506eb7abf7SJed Brown   PetscFunctionBegin;
2516eb7abf7SJed Brown   PetscFunctionReturn(0);
2526eb7abf7SJed Brown }
2536eb7abf7SJed Brown #endif
2546eb7abf7SJed Brown 
255d9262e54SJed Brown #endif
256d9262e54SJed Brown 
257