xref: /petsc/src/sys/error/pstack.c (revision 74b43855c84902f9769613ba74e50feff6557f3a) !
1d9262e54SJed Brown 
2c6db04a5SJed Brown #include <petscsys.h>        /*I  "petscsys.h"   I*/
3*74b43855SShri Abhyankar #include <petscthreadcomm.h>
4d9262e54SJed Brown 
58bf1f09cSShri Abhyankar #if defined(PETSC_USE_DEBUG)
6d9262e54SJed Brown 
7997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL)
8997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack  *petscstack = 0;
9fe89fe5aSShri Abhyankar #else
107087cfbeSBarry Smith PetscStack *petscstack = 0;
11fe89fe5aSShri Abhyankar #endif
12d9262e54SJed Brown 
13d9262e54SJed Brown #undef __FUNCT__
14d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish"
157087cfbeSBarry Smith PetscErrorCode  PetscStackPublish(void)
16d9262e54SJed Brown {
17d9262e54SJed Brown   PetscFunctionBegin;
18d9262e54SJed Brown   PetscFunctionReturn(0);
19d9262e54SJed Brown }
20d9262e54SJed Brown 
21d9262e54SJed Brown #undef __FUNCT__
22d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish"
237087cfbeSBarry Smith PetscErrorCode  PetscStackDepublish(void)
24d9262e54SJed Brown {
25d9262e54SJed Brown   PetscFunctionBegin;
26d9262e54SJed Brown   PetscFunctionReturn(0);
27d9262e54SJed Brown }
28d9262e54SJed Brown 
29*74b43855SShri Abhyankar PetscErrorCode PetscStackCreate_kernel(PetscInt trank)
30*74b43855SShri Abhyankar {
31*74b43855SShri Abhyankar   PetscStack *petscstack_in;
32*74b43855SShri Abhyankar   if(petscstack) return 0;
33*74b43855SShri Abhyankar 
34*74b43855SShri Abhyankar   petscstack_in = (PetscStack*)malloc(sizeof(PetscStack));
35*74b43855SShri Abhyankar   petscstack_in->currentsize = 0;
36*74b43855SShri Abhyankar   petscstack = petscstack_in;
37*74b43855SShri Abhyankar   PetscThreadLocalSetValue(petscstack,petscstack);
38*74b43855SShri Abhyankar   PetscThreadLocalSetValue(petscstack,petscstack); /* Sets the value for the pthread_key_t if it is used */
39*74b43855SShri Abhyankar   return 0;
40*74b43855SShri Abhyankar }
41*74b43855SShri Abhyankar 
42d9262e54SJed Brown #undef __FUNCT__
43d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
447087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
45d9262e54SJed Brown {
46d9262e54SJed Brown   PetscErrorCode ierr;
47d9262e54SJed Brown 
48*74b43855SShri Abhyankar   ierr = PetscThreadCommRunKernel0(PETSC_COMM_SELF,(PetscThreadKernel)PetscStackCreate_kernel);CHKERRQ(ierr);
49*74b43855SShri Abhyankar   ierr = PetscThreadCommBarrier(PETSC_COMM_SELF);CHKERRQ(ierr);
50d9262e54SJed Brown   return 0;
51d9262e54SJed Brown }
52d9262e54SJed Brown 
53d9262e54SJed Brown #undef __FUNCT__
54d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
557087cfbeSBarry Smith PetscErrorCode  PetscStackView(PetscViewer viewer)
56d9262e54SJed Brown {
57d9262e54SJed Brown   PetscErrorCode ierr;
58d9262e54SJed Brown   int  i;
59d9262e54SJed Brown   FILE *file;
60d9262e54SJed Brown 
61d9262e54SJed Brown   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
62d9262e54SJed Brown   ierr = PetscViewerASCIIGetPointer(viewer,&file);CHKERRQ(ierr);
63d9262e54SJed Brown 
64d9262e54SJed Brown   if (file == PETSC_STDOUT) {
65d9262e54SJed Brown     (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n");
66d9262e54SJed Brown     (*PetscErrorPrintf)("      INSTEAD the line number of the start of the function\n");
67d9262e54SJed Brown     (*PetscErrorPrintf)("      is given.\n");
68d9262e54SJed Brown     for (i=petscstack->currentsize-1; i>=0; i--) {
69d9262e54SJed Brown       (*PetscErrorPrintf)("[%d] %s line %d %s%s\n",PetscGlobalRank,
70d9262e54SJed Brown                                                    petscstack->function[i],
71d9262e54SJed Brown                                                    petscstack->line[i],
72d9262e54SJed Brown                                                    petscstack->directory[i],
73d9262e54SJed Brown                                                    petscstack->file[i]);
74d9262e54SJed Brown     }
75d9262e54SJed Brown   } else {
76d9262e54SJed Brown     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
77d9262e54SJed Brown     fprintf(file,"      INSTEAD the line number of the start of the function\n");
78d9262e54SJed Brown     fprintf(file,"      is given.\n");
79d9262e54SJed Brown     for (i=petscstack->currentsize-1; i>=0; i--) {
80d9262e54SJed Brown       fprintf(file,"[%d] %s line %d %s%s\n",PetscGlobalRank,
81d9262e54SJed Brown                                             petscstack->function[i],
82d9262e54SJed Brown                                             petscstack->line[i],
83d9262e54SJed Brown                                             petscstack->directory[i],
84d9262e54SJed Brown                                             petscstack->file[i]);
85d9262e54SJed Brown     }
86d9262e54SJed Brown   }
87d9262e54SJed Brown   return 0;
88d9262e54SJed Brown }
89d9262e54SJed Brown 
90*74b43855SShri Abhyankar PetscErrorCode PetscStackDestroy_kernel(PetscInt trank)
91*74b43855SShri Abhyankar {
92*74b43855SShri Abhyankar   if(petscstack) {
93*74b43855SShri Abhyankar     PetscStack *petscstack_in = petscstack;
94*74b43855SShri Abhyankar     petscstack = 0;
95*74b43855SShri Abhyankar     free(petscstack_in);
96*74b43855SShri Abhyankar   }
97*74b43855SShri Abhyankar   return 0;
98*74b43855SShri Abhyankar }
99*74b43855SShri Abhyankar 
100d9262e54SJed Brown #undef __FUNCT__
101d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
102d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1037087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
104d9262e54SJed Brown {
105d9262e54SJed Brown   PetscErrorCode ierr;
106*74b43855SShri Abhyankar   ierr = PetscThreadCommRunKernel0(PETSC_COMM_SELF,(PetscThreadKernel)PetscStackDestroy_kernel);CHKERRQ(ierr);
107*74b43855SShri Abhyankar   ierr = PetscThreadCommBarrier(PETSC_COMM_SELF);CHKERRQ(ierr);
10861d886c9SShri Abhyankar   PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */
109d9262e54SJed Brown   return 0;
110d9262e54SJed Brown }
111d9262e54SJed Brown 
112d9262e54SJed Brown #undef __FUNCT__
113d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy"
114d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1157087cfbeSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack* sint,PetscStack* sout)
116d9262e54SJed Brown {
117d9262e54SJed Brown   int i;
118d9262e54SJed Brown 
119d9262e54SJed Brown   if (!sint) {
120d9262e54SJed Brown     sout->currentsize = 0;
121d9262e54SJed Brown   } else {
122d9262e54SJed Brown     for (i=0; i<sint->currentsize; i++) {
123d9262e54SJed Brown       sout->function[i]  = sint->function[i];
124d9262e54SJed Brown       sout->file[i]      = sint->file[i];
125d9262e54SJed Brown       sout->directory[i] = sint->directory[i];
126d9262e54SJed Brown       sout->line[i]      = sint->line[i];
127d9262e54SJed Brown     }
128d9262e54SJed Brown     sout->currentsize = sint->currentsize;
129d9262e54SJed Brown   }
130d9262e54SJed Brown   return 0;
131d9262e54SJed Brown }
132d9262e54SJed Brown 
133d9262e54SJed Brown #undef __FUNCT__
134d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint"
135d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1367087cfbeSBarry Smith PetscErrorCode  PetscStackPrint(PetscStack* sint,FILE *fp)
137d9262e54SJed Brown {
138d9262e54SJed Brown   int i;
139d9262e54SJed Brown 
140d9262e54SJed Brown   if (!sint) return(0);
141d9262e54SJed Brown   for (i=sint->currentsize-3; i>=0; i--) {
142d9262e54SJed Brown     fprintf(fp,"      [%d]  %s() line %d in %s%s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->directory[i],sint->file[i]);
143d9262e54SJed Brown   }
144d9262e54SJed Brown   return 0;
145d9262e54SJed Brown }
146d9262e54SJed Brown 
147d9262e54SJed Brown #else
148d9262e54SJed Brown #undef __FUNCT__
149d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish"
1507087cfbeSBarry Smith PetscErrorCode  PetscStackPublish(void)
151d9262e54SJed Brown {
152d9262e54SJed Brown   PetscFunctionBegin;
153d9262e54SJed Brown   PetscFunctionReturn(0);
154d9262e54SJed Brown }
155d9262e54SJed Brown #undef __FUNCT__
156d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish"
1577087cfbeSBarry Smith PetscErrorCode  PetscStackDepublish(void)
158d9262e54SJed Brown {
159d9262e54SJed Brown   PetscFunctionBegin;
160d9262e54SJed Brown   PetscFunctionReturn(0);
161d9262e54SJed Brown }
162d9262e54SJed Brown #undef __FUNCT__
163d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
1647087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
165d9262e54SJed Brown {
166d9262e54SJed Brown   PetscFunctionBegin;
167d9262e54SJed Brown   PetscFunctionReturn(0);
168d9262e54SJed Brown }
169d9262e54SJed Brown #undef __FUNCT__
170d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
1717087cfbeSBarry Smith PetscErrorCode  PetscStackView(PetscViewer viewer)
172d9262e54SJed Brown {
173d9262e54SJed Brown   PetscFunctionBegin;
174d9262e54SJed Brown   PetscFunctionReturn(0);
175d9262e54SJed Brown }
176d9262e54SJed Brown #undef __FUNCT__
177d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
1787087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
179d9262e54SJed Brown {
180d9262e54SJed Brown   PetscFunctionBegin;
181d9262e54SJed Brown   PetscFunctionReturn(0);
182d9262e54SJed Brown }
183d9262e54SJed Brown 
184d9262e54SJed Brown #endif
185d9262e54SJed Brown 
186