xref: /petsc/src/sys/error/pstack.c (revision a2f94806544a9e762bb1e13643a479e55c7e525e)
1d9262e54SJed Brown 
2c6db04a5SJed Brown #include <petscsys.h>        /*I  "petscsys.h"   I*/
3d9262e54SJed Brown 
4d9262e54SJed Brown 
51f46d60fSShri Abhyankar #if defined(PETSC_HAVE_PTHREADCLASSES)
6997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL)
7997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack *petscstack = 0;
876386721SLisandro Dalcin #else
976386721SLisandro Dalcin PetscThreadKey petscstack;
101f46d60fSShri Abhyankar #endif
11fe89fe5aSShri Abhyankar #else
127087cfbeSBarry Smith PetscStack *petscstack = 0;
13fe89fe5aSShri Abhyankar #endif
14d9262e54SJed Brown 
15c82b4e47SJed Brown #if defined(PETSC_HAVE_AMS)
16c82b4e47SJed Brown 
172d7c6352SJed Brown #  if defined(PETSC_USE_DEBUG)
1815681b3cSBarry Smith 
1915681b3cSBarry Smith #include <petscviewerams.h>
2015681b3cSBarry Smith 
2115681b3cSBarry Smith static AMS_Memory amsmemstack = -1;
2215681b3cSBarry Smith 
23d9262e54SJed Brown #undef __FUNCT__
2415681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSGrantAccess"
2515681b3cSBarry Smith /*@C
2615681b3cSBarry Smith    PetscStackAMSGrantAccess - Grants access of the PETSc stack frames to the AMS publisher
2715681b3cSBarry Smith 
2815681b3cSBarry Smith    Collective on PETSC_COMM_WORLD?
2915681b3cSBarry Smith 
3015681b3cSBarry Smith    Level: developer
3115681b3cSBarry Smith 
3215681b3cSBarry Smith    Concepts: publishing object
3315681b3cSBarry Smith 
3415681b3cSBarry Smith    Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallAMS() since it may be used within those routines
3515681b3cSBarry Smith 
3615681b3cSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess()
3715681b3cSBarry Smith 
3815681b3cSBarry Smith @*/
3915681b3cSBarry Smith void  PetscStackAMSGrantAccess(void)
40d9262e54SJed Brown {
4115681b3cSBarry Smith   if (amsmemstack != -1) {
4215681b3cSBarry Smith     AMS_Memory_grant_access(amsmemstack);
4315681b3cSBarry Smith   }
44d9262e54SJed Brown }
45d9262e54SJed Brown 
46d9262e54SJed Brown #undef __FUNCT__
4715681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSTakeAccess"
4815681b3cSBarry Smith /*@C
4915681b3cSBarry Smith    PetscStackAMSTakeAccess - Takes access of the PETSc stack frames to the AMS 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 
5715681b3cSBarry Smith    Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallAMS() since it may be used within those routines
5815681b3cSBarry Smith 
5915681b3cSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess()
6015681b3cSBarry Smith 
6115681b3cSBarry Smith @*/
6215681b3cSBarry Smith void  PetscStackAMSTakeAccess(void)
63d9262e54SJed Brown {
6415681b3cSBarry Smith   if (amsmemstack != -1) {
6515681b3cSBarry Smith     AMS_Memory_take_access(amsmemstack);
6615681b3cSBarry Smith   }
6715681b3cSBarry Smith }
6815681b3cSBarry Smith 
6915681b3cSBarry Smith PetscErrorCode PetscStackViewAMS(void)
7015681b3cSBarry Smith {
7115681b3cSBarry Smith   AMS_Comm       acomm;
7215681b3cSBarry Smith   PetscErrorCode ierr;
7315681b3cSBarry Smith   AMS_Memory     mem;
7415681b3cSBarry Smith   PetscStack*    petscstackp;
7515681b3cSBarry Smith 
7615681b3cSBarry Smith   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
7715681b3cSBarry Smith   ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_WORLD,&acomm);CHKERRQ(ierr);
7815681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_create,(acomm,"Stack",&mem));
7915681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_take_access,(mem));
8015681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_add_field,(mem,"functions",petscstackp->function,10,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
8115681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_add_field,(mem,"current size",&petscstackp->currentsize,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
8215681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_publish,(mem));
8315681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_grant_access,(mem));
8415681b3cSBarry Smith   amsmemstack = mem;
8515681b3cSBarry Smith   return 0;
8615681b3cSBarry Smith }
8715681b3cSBarry Smith 
8815681b3cSBarry Smith #undef __FUNCT__
8915681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSViewOff"
9015681b3cSBarry Smith PetscErrorCode PetscStackAMSViewOff(void)
9115681b3cSBarry Smith {
9215681b3cSBarry Smith   PetscErrorCode ierr;
9315681b3cSBarry Smith 
94d9262e54SJed Brown   PetscFunctionBegin;
9515681b3cSBarry Smith   if (amsmemstack == -1) PetscFunctionReturn(0);
9615681b3cSBarry Smith   ierr        = AMS_Memory_destroy(amsmemstack);CHKERRQ(ierr);
9715681b3cSBarry Smith   amsmemstack = -1;
98d9262e54SJed Brown   PetscFunctionReturn(0);
99d9262e54SJed Brown }
100d9262e54SJed Brown 
101c82b4e47SJed Brown #  else
102c82b4e47SJed Brown 
103c82b4e47SJed Brown /* AMS stack functions do nothing in optimized mode */
104c82b4e47SJed Brown void PetscStackAMSGrantAccess(void) {}
105c82b4e47SJed Brown void PetscStackAMSTakeAccess(void) {}
106c82b4e47SJed Brown 
107c82b4e47SJed Brown PetscErrorCode PetscStackViewAMS(void)
108c82b4e47SJed Brown {
109c82b4e47SJed Brown   return 0;
110c82b4e47SJed Brown }
111c82b4e47SJed Brown 
112c82b4e47SJed Brown #undef __FUNCT__
113c82b4e47SJed Brown #define __FUNCT__ "PetscStackAMSViewOff"
114c82b4e47SJed Brown PetscErrorCode  PetscStackAMSViewOff(void)
115c82b4e47SJed Brown {
116c82b4e47SJed Brown   PetscFunctionBegin;
117c82b4e47SJed Brown   PetscFunctionReturn(0);
118c82b4e47SJed Brown }
119c82b4e47SJed Brown 
120c82b4e47SJed Brown #  endif
12115681b3cSBarry Smith #endif
12215681b3cSBarry Smith 
1237d5f7e0cSShri Abhyankar PetscErrorCode PetscStackCreate(void)
12474b43855SShri Abhyankar {
12574b43855SShri Abhyankar   PetscStack *petscstack_in;
126dbf62e16SBarry Smith   if (PetscStackActive()) return 0;
12774b43855SShri Abhyankar 
12874b43855SShri Abhyankar   petscstack_in              = (PetscStack*)malloc(sizeof(PetscStack));
12974b43855SShri Abhyankar   petscstack_in->currentsize = 0;
130*a2f94806SJed Brown   petscstack_in->hotdepth    = 0;
131047240e1SBarry Smith   PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in);
13215681b3cSBarry Smith 
13315681b3cSBarry Smith #if defined(PETSC_HAVE_AMS)
13415681b3cSBarry Smith   {
13515681b3cSBarry Smith   PetscBool flg = PETSC_FALSE;
13615681b3cSBarry Smith   PetscOptionsHasName(NULL,"-stack_view",&flg);
13715681b3cSBarry Smith   if (flg) PetscStackViewAMS();
13815681b3cSBarry Smith   }
13915681b3cSBarry Smith #endif
14074b43855SShri Abhyankar   return 0;
14174b43855SShri Abhyankar }
14274b43855SShri Abhyankar 
14315681b3cSBarry Smith 
144d9262e54SJed Brown #undef __FUNCT__
145d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
146639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
147d9262e54SJed Brown {
148d9262e54SJed Brown   int        i;
1491f46d60fSShri Abhyankar   PetscStack *petscstackp;
150d9262e54SJed Brown 
1511f46d60fSShri Abhyankar   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
152639ff905SBarry Smith   if (!file) file = PETSC_STDOUT;
153d9262e54SJed Brown 
154d9262e54SJed Brown   if (file == PETSC_STDOUT) {
155d9262e54SJed Brown     (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n");
156d9262e54SJed Brown     (*PetscErrorPrintf)("      INSTEAD the line number of the start of the function\n");
157d9262e54SJed Brown     (*PetscErrorPrintf)("      is given.\n");
158a297a907SKarl 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]);
159d9262e54SJed Brown   } else {
160d9262e54SJed Brown     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
161d9262e54SJed Brown     fprintf(file,"      INSTEAD the line number of the start of the function\n");
162d9262e54SJed Brown     fprintf(file,"      is given.\n");
163a297a907SKarl 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]);
164d9262e54SJed Brown   }
165d9262e54SJed Brown   return 0;
166d9262e54SJed Brown }
167d9262e54SJed Brown 
1687d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void)
16974b43855SShri Abhyankar {
170dbf62e16SBarry Smith   if (PetscStackActive()) {
1711f46d60fSShri Abhyankar     PetscStack *petscstack_in;
1721f46d60fSShri Abhyankar     petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack);
17374b43855SShri Abhyankar     free(petscstack_in);
17476386721SLisandro Dalcin     PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,NULL);
1757d5f7e0cSShri Abhyankar   }
176d9262e54SJed Brown   return 0;
177d9262e54SJed Brown }
178d9262e54SJed Brown 
179d9262e54SJed Brown #undef __FUNCT__
180d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy"
181d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1827087cfbeSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack *sint,PetscStack *sout)
183d9262e54SJed Brown {
184d9262e54SJed Brown   int i;
185d9262e54SJed Brown 
186a297a907SKarl Rupp   if (!sint) sout->currentsize = 0;
187a297a907SKarl Rupp   else {
188d9262e54SJed Brown     for (i=0; i<sint->currentsize; i++) {
189d9262e54SJed Brown       sout->function[i]     = sint->function[i];
190d9262e54SJed Brown       sout->file[i]         = sint->file[i];
191d9262e54SJed Brown       sout->directory[i]    = sint->directory[i];
192d9262e54SJed Brown       sout->line[i]         = sint->line[i];
193a8d2bbe5SBarry Smith       sout->petscroutine[i] = sint->petscroutine[i];
194d9262e54SJed Brown     }
195d9262e54SJed Brown     sout->currentsize = sint->currentsize;
196d9262e54SJed Brown   }
197d9262e54SJed Brown   return 0;
198d9262e54SJed Brown }
199d9262e54SJed Brown 
200d9262e54SJed Brown #undef __FUNCT__
201d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint"
202d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
2037087cfbeSBarry Smith PetscErrorCode  PetscStackPrint(PetscStack *sint,FILE *fp)
204d9262e54SJed Brown {
205d9262e54SJed Brown   int i;
206d9262e54SJed Brown 
207d9262e54SJed Brown   if (!sint) return(0);
208a297a907SKarl 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]);
209d9262e54SJed Brown   return 0;
210d9262e54SJed Brown }
211d9262e54SJed Brown 
212