xref: /petsc/src/sys/error/pstack.c (revision 15681b3c230c463e307d75c11a3a8bd005508ceb)
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 
14*15681b3cSBarry Smith 
15*15681b3cSBarry Smith #if defined(PETSC_HAVE_AMS)
16*15681b3cSBarry Smith #include <petscviewerams.h>
17*15681b3cSBarry Smith 
18*15681b3cSBarry Smith static AMS_Memory amsmemstack = -1;
19*15681b3cSBarry Smith 
20d9262e54SJed Brown #undef __FUNCT__
21*15681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSGrantAccess"
22*15681b3cSBarry Smith /*@C
23*15681b3cSBarry Smith    PetscStackAMSGrantAccess - Grants access of the PETSc stack frames to the AMS publisher
24*15681b3cSBarry Smith 
25*15681b3cSBarry Smith    Collective on PETSC_COMM_WORLD?
26*15681b3cSBarry Smith 
27*15681b3cSBarry Smith    Level: developer
28*15681b3cSBarry Smith 
29*15681b3cSBarry Smith    Concepts: publishing object
30*15681b3cSBarry Smith 
31*15681b3cSBarry Smith    Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallAMS() since it may be used within those routines
32*15681b3cSBarry Smith 
33*15681b3cSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess()
34*15681b3cSBarry Smith 
35*15681b3cSBarry Smith @*/
36*15681b3cSBarry Smith void  PetscStackAMSGrantAccess(void)
37d9262e54SJed Brown {
38*15681b3cSBarry Smith   if (amsmemstack != -1) {
39*15681b3cSBarry Smith     AMS_Memory_grant_access(amsmemstack);
40*15681b3cSBarry Smith   }
41d9262e54SJed Brown }
42d9262e54SJed Brown 
43d9262e54SJed Brown #undef __FUNCT__
44*15681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSTakeAccess"
45*15681b3cSBarry Smith /*@C
46*15681b3cSBarry Smith    PetscStackAMSTakeAccess - Takes access of the PETSc stack frames to the AMS publisher
47*15681b3cSBarry Smith 
48*15681b3cSBarry Smith    Collective on PETSC_COMM_WORLD?
49*15681b3cSBarry Smith 
50*15681b3cSBarry Smith    Level: developer
51*15681b3cSBarry Smith 
52*15681b3cSBarry Smith    Concepts: publishing object
53*15681b3cSBarry Smith 
54*15681b3cSBarry Smith    Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallAMS() since it may be used within those routines
55*15681b3cSBarry Smith 
56*15681b3cSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess()
57*15681b3cSBarry Smith 
58*15681b3cSBarry Smith @*/
59*15681b3cSBarry Smith void  PetscStackAMSTakeAccess(void)
60d9262e54SJed Brown {
61*15681b3cSBarry Smith   if (amsmemstack != -1) {
62*15681b3cSBarry Smith     AMS_Memory_take_access(amsmemstack);
63*15681b3cSBarry Smith   }
64*15681b3cSBarry Smith }
65*15681b3cSBarry Smith 
66*15681b3cSBarry Smith PetscErrorCode PetscStackViewAMS(void)
67*15681b3cSBarry Smith {
68*15681b3cSBarry Smith   AMS_Comm       acomm;
69*15681b3cSBarry Smith   PetscErrorCode ierr;
70*15681b3cSBarry Smith   AMS_Memory     mem;
71*15681b3cSBarry Smith   PetscStack*    petscstackp;
72*15681b3cSBarry Smith 
73*15681b3cSBarry Smith   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
74*15681b3cSBarry Smith   ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_WORLD,&acomm);CHKERRQ(ierr);
75*15681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_create,(acomm,"Stack",&mem));
76*15681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_take_access,(mem));
77*15681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_add_field,(mem,"functions",petscstackp->function,10,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
78*15681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_add_field,(mem,"current size",&petscstackp->currentsize,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
79*15681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_publish,(mem));
80*15681b3cSBarry Smith   PetscStackCallAMS(AMS_Memory_grant_access,(mem));
81*15681b3cSBarry Smith   amsmemstack = mem;
82*15681b3cSBarry Smith   return 0;
83*15681b3cSBarry Smith }
84*15681b3cSBarry Smith 
85*15681b3cSBarry Smith #undef __FUNCT__
86*15681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSViewOff"
87*15681b3cSBarry Smith PetscErrorCode PetscStackAMSViewOff(void)
88*15681b3cSBarry Smith {
89*15681b3cSBarry Smith   PetscErrorCode ierr;
90*15681b3cSBarry Smith 
91d9262e54SJed Brown   PetscFunctionBegin;
92*15681b3cSBarry Smith   if (amsmemstack == -1) PetscFunctionReturn(0);
93*15681b3cSBarry Smith   ierr        = AMS_Memory_destroy(amsmemstack);CHKERRQ(ierr);
94*15681b3cSBarry Smith   amsmemstack = -1;
95d9262e54SJed Brown   PetscFunctionReturn(0);
96d9262e54SJed Brown }
97d9262e54SJed Brown 
98*15681b3cSBarry Smith #endif
99*15681b3cSBarry Smith 
1007d5f7e0cSShri Abhyankar PetscErrorCode PetscStackCreate(void)
10174b43855SShri Abhyankar {
10274b43855SShri Abhyankar   PetscStack *petscstack_in;
103dbf62e16SBarry Smith   if (PetscStackActive()) return 0;
10474b43855SShri Abhyankar 
10574b43855SShri Abhyankar   petscstack_in              = (PetscStack*)malloc(sizeof(PetscStack));
10674b43855SShri Abhyankar   petscstack_in->currentsize = 0;
107047240e1SBarry Smith   PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in);
108*15681b3cSBarry Smith 
109*15681b3cSBarry Smith #if defined(PETSC_HAVE_AMS)
110*15681b3cSBarry Smith   {
111*15681b3cSBarry Smith   PetscBool flg = PETSC_FALSE;
112*15681b3cSBarry Smith   PetscOptionsHasName(NULL,"-stack_view",&flg);
113*15681b3cSBarry Smith   if (flg) PetscStackViewAMS();
114*15681b3cSBarry Smith   }
115*15681b3cSBarry Smith #endif
11674b43855SShri Abhyankar   return 0;
11774b43855SShri Abhyankar }
11874b43855SShri Abhyankar 
119*15681b3cSBarry Smith 
120d9262e54SJed Brown #undef __FUNCT__
121d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
122639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
123d9262e54SJed Brown {
124d9262e54SJed Brown   int        i;
1251f46d60fSShri Abhyankar   PetscStack *petscstackp;
126d9262e54SJed Brown 
1271f46d60fSShri Abhyankar   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
128639ff905SBarry Smith   if (!file) file = PETSC_STDOUT;
129d9262e54SJed Brown 
130d9262e54SJed Brown   if (file == PETSC_STDOUT) {
131d9262e54SJed Brown     (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n");
132d9262e54SJed Brown     (*PetscErrorPrintf)("      INSTEAD the line number of the start of the function\n");
133d9262e54SJed Brown     (*PetscErrorPrintf)("      is given.\n");
134a297a907SKarl 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]);
135d9262e54SJed Brown   } else {
136d9262e54SJed Brown     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
137d9262e54SJed Brown     fprintf(file,"      INSTEAD the line number of the start of the function\n");
138d9262e54SJed Brown     fprintf(file,"      is given.\n");
139a297a907SKarl 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]);
140d9262e54SJed Brown   }
141d9262e54SJed Brown   return 0;
142d9262e54SJed Brown }
143d9262e54SJed Brown 
1447d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void)
14574b43855SShri Abhyankar {
146dbf62e16SBarry Smith   if (PetscStackActive()) {
1471f46d60fSShri Abhyankar     PetscStack *petscstack_in;
1481f46d60fSShri Abhyankar     petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack);
14974b43855SShri Abhyankar     free(petscstack_in);
150047240e1SBarry Smith     PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,(PetscStack*)0);
15161d886c9SShri Abhyankar     PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */
1527d5f7e0cSShri Abhyankar   }
153d9262e54SJed Brown   return 0;
154d9262e54SJed Brown }
155d9262e54SJed Brown 
156d9262e54SJed Brown #undef __FUNCT__
157d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy"
158d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1597087cfbeSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack *sint,PetscStack *sout)
160d9262e54SJed Brown {
161d9262e54SJed Brown   int i;
162d9262e54SJed Brown 
163a297a907SKarl Rupp   if (!sint) sout->currentsize = 0;
164a297a907SKarl Rupp   else {
165d9262e54SJed Brown     for (i=0; i<sint->currentsize; i++) {
166d9262e54SJed Brown       sout->function[i]     = sint->function[i];
167d9262e54SJed Brown       sout->file[i]         = sint->file[i];
168d9262e54SJed Brown       sout->directory[i]    = sint->directory[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);
185a297a907SKarl 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]);
186d9262e54SJed Brown   return 0;
187d9262e54SJed Brown }
188d9262e54SJed Brown 
189d9262e54SJed Brown #else
190*15681b3cSBarry Smith 
191d9262e54SJed Brown #undef __FUNCT__
192d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
1937087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
194d9262e54SJed Brown {
195d9262e54SJed Brown   PetscFunctionBegin;
196d9262e54SJed Brown   PetscFunctionReturn(0);
197d9262e54SJed Brown }
198d9262e54SJed Brown #undef __FUNCT__
199d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
200639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
201d9262e54SJed Brown {
202d9262e54SJed Brown   PetscFunctionBegin;
203d9262e54SJed Brown   PetscFunctionReturn(0);
204d9262e54SJed Brown }
205d9262e54SJed Brown #undef __FUNCT__
206d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
2077087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
208d9262e54SJed Brown {
209d9262e54SJed Brown   PetscFunctionBegin;
210d9262e54SJed Brown   PetscFunctionReturn(0);
211d9262e54SJed Brown }
212d9262e54SJed Brown 
213d9262e54SJed Brown #endif
214d9262e54SJed Brown 
215