xref: /petsc/src/sys/error/pstack.c (revision 1f46d60f66d2379a7cf045b103b4a98b2ddbb736)
1d9262e54SJed Brown 
2c6db04a5SJed Brown #include <petscsys.h>        /*I  "petscsys.h"   I*/
374b43855SShri Abhyankar #include <petscthreadcomm.h>
4d9262e54SJed Brown 
58bf1f09cSShri Abhyankar #if defined(PETSC_USE_DEBUG)
6d9262e54SJed Brown 
7*1f46d60fSShri Abhyankar #if defined(PETSC_HAVE_PTHREADCLASSES)
8997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL)
9997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack  *petscstack = 0;
10*1f46d60fSShri Abhyankar #endif
11fe89fe5aSShri Abhyankar #else
127087cfbeSBarry Smith PetscStack *petscstack = 0;
13fe89fe5aSShri Abhyankar #endif
14d9262e54SJed Brown 
15d9262e54SJed Brown #undef __FUNCT__
16d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish"
177087cfbeSBarry Smith PetscErrorCode  PetscStackPublish(void)
18d9262e54SJed Brown {
19d9262e54SJed Brown   PetscFunctionBegin;
20d9262e54SJed Brown   PetscFunctionReturn(0);
21d9262e54SJed Brown }
22d9262e54SJed Brown 
23d9262e54SJed Brown #undef __FUNCT__
24d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish"
257087cfbeSBarry Smith PetscErrorCode  PetscStackDepublish(void)
26d9262e54SJed Brown {
27d9262e54SJed Brown   PetscFunctionBegin;
28d9262e54SJed Brown   PetscFunctionReturn(0);
29d9262e54SJed Brown }
30d9262e54SJed Brown 
3174b43855SShri Abhyankar PetscErrorCode PetscStackCreate_kernel(PetscInt trank)
3274b43855SShri Abhyankar {
3374b43855SShri Abhyankar   PetscStack *petscstack_in;
34*1f46d60fSShri Abhyankar   if(PetscStackActive) return 0;
3574b43855SShri Abhyankar 
3674b43855SShri Abhyankar   petscstack_in = (PetscStack*)malloc(sizeof(PetscStack));
3774b43855SShri Abhyankar   petscstack_in->currentsize = 0;
38*1f46d60fSShri Abhyankar   PetscThreadLocalSetValue(petscstack,petscstack_in);
3974b43855SShri Abhyankar   return 0;
4074b43855SShri Abhyankar }
4174b43855SShri Abhyankar 
42d9262e54SJed Brown #undef __FUNCT__
43d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
447087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
45d9262e54SJed Brown {
46d9262e54SJed Brown   PetscErrorCode ierr;
47d9262e54SJed Brown 
4874b43855SShri Abhyankar   ierr = PetscThreadCommRunKernel0(PETSC_COMM_SELF,(PetscThreadKernel)PetscStackCreate_kernel);CHKERRQ(ierr);
4974b43855SShri 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;
60*1f46d60fSShri Abhyankar   PetscStack* petscstackp;
61d9262e54SJed Brown 
62*1f46d60fSShri Abhyankar   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
63d9262e54SJed Brown   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
64d9262e54SJed Brown   ierr = PetscViewerASCIIGetPointer(viewer,&file);CHKERRQ(ierr);
65d9262e54SJed Brown 
66d9262e54SJed Brown   if (file == PETSC_STDOUT) {
67d9262e54SJed Brown     (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n");
68d9262e54SJed Brown     (*PetscErrorPrintf)("      INSTEAD the line number of the start of the function\n");
69d9262e54SJed Brown     (*PetscErrorPrintf)("      is given.\n");
70*1f46d60fSShri Abhyankar     for (i=petscstackp->currentsize-1; i>=0; i--) {
71d9262e54SJed Brown       (*PetscErrorPrintf)("[%d] %s line %d %s%s\n",PetscGlobalRank,
72*1f46d60fSShri Abhyankar                                                    petscstackp->function[i],
73*1f46d60fSShri Abhyankar                                                    petscstackp->line[i],
74*1f46d60fSShri Abhyankar                                                    petscstackp->directory[i],
75*1f46d60fSShri Abhyankar                                                    petscstackp->file[i]);
76d9262e54SJed Brown     }
77d9262e54SJed Brown   } else {
78d9262e54SJed Brown     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
79d9262e54SJed Brown     fprintf(file,"      INSTEAD the line number of the start of the function\n");
80d9262e54SJed Brown     fprintf(file,"      is given.\n");
81*1f46d60fSShri Abhyankar     for (i=petscstackp->currentsize-1; i>=0; i--) {
82d9262e54SJed Brown       fprintf(file,"[%d] %s line %d %s%s\n",PetscGlobalRank,
83*1f46d60fSShri Abhyankar                                             petscstackp->function[i],
84*1f46d60fSShri Abhyankar                                             petscstackp->line[i],
85*1f46d60fSShri Abhyankar                                             petscstackp->directory[i],
86*1f46d60fSShri Abhyankar                                             petscstackp->file[i]);
87d9262e54SJed Brown     }
88d9262e54SJed Brown   }
89d9262e54SJed Brown   return 0;
90d9262e54SJed Brown }
91d9262e54SJed Brown 
9274b43855SShri Abhyankar PetscErrorCode PetscStackDestroy_kernel(PetscInt trank)
9374b43855SShri Abhyankar {
94*1f46d60fSShri Abhyankar   if(PetscStackActive) {
95*1f46d60fSShri Abhyankar     PetscStack *petscstack_in;
96*1f46d60fSShri Abhyankar     petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack);
9774b43855SShri Abhyankar     free(petscstack_in);
98*1f46d60fSShri Abhyankar     PetscThreadLocalSetValue(petscstack,(PetscStack*)0);
9974b43855SShri Abhyankar   }
10074b43855SShri Abhyankar   return 0;
10174b43855SShri Abhyankar }
10274b43855SShri Abhyankar 
103d9262e54SJed Brown #undef __FUNCT__
104d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
105d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1067087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
107d9262e54SJed Brown {
108d9262e54SJed Brown   PetscErrorCode ierr;
10974b43855SShri Abhyankar   ierr = PetscThreadCommRunKernel0(PETSC_COMM_SELF,(PetscThreadKernel)PetscStackDestroy_kernel);CHKERRQ(ierr);
11074b43855SShri Abhyankar   ierr = PetscThreadCommBarrier(PETSC_COMM_SELF);CHKERRQ(ierr);
11161d886c9SShri Abhyankar   PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */
112d9262e54SJed Brown   return 0;
113d9262e54SJed Brown }
114d9262e54SJed Brown 
115d9262e54SJed Brown #undef __FUNCT__
116d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy"
117d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1187087cfbeSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack* sint,PetscStack* sout)
119d9262e54SJed Brown {
120d9262e54SJed Brown   int i;
121d9262e54SJed Brown 
122d9262e54SJed Brown   if (!sint) {
123d9262e54SJed Brown     sout->currentsize = 0;
124d9262e54SJed Brown   } else {
125d9262e54SJed Brown     for (i=0; i<sint->currentsize; i++) {
126d9262e54SJed Brown       sout->function[i]  = sint->function[i];
127d9262e54SJed Brown       sout->file[i]      = sint->file[i];
128d9262e54SJed Brown       sout->directory[i] = sint->directory[i];
129d9262e54SJed Brown       sout->line[i]      = sint->line[i];
130d9262e54SJed Brown     }
131d9262e54SJed Brown     sout->currentsize = sint->currentsize;
132d9262e54SJed Brown   }
133d9262e54SJed Brown   return 0;
134d9262e54SJed Brown }
135d9262e54SJed Brown 
136d9262e54SJed Brown #undef __FUNCT__
137d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint"
138d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1397087cfbeSBarry Smith PetscErrorCode  PetscStackPrint(PetscStack* sint,FILE *fp)
140d9262e54SJed Brown {
141d9262e54SJed Brown   int i;
142d9262e54SJed Brown 
143d9262e54SJed Brown   if (!sint) return(0);
144d9262e54SJed Brown   for (i=sint->currentsize-3; i>=0; i--) {
145d9262e54SJed Brown     fprintf(fp,"      [%d]  %s() line %d in %s%s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->directory[i],sint->file[i]);
146d9262e54SJed Brown   }
147d9262e54SJed Brown   return 0;
148d9262e54SJed Brown }
149d9262e54SJed Brown 
150d9262e54SJed Brown #else
151d9262e54SJed Brown #undef __FUNCT__
152d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish"
1537087cfbeSBarry Smith PetscErrorCode  PetscStackPublish(void)
154d9262e54SJed Brown {
155d9262e54SJed Brown   PetscFunctionBegin;
156d9262e54SJed Brown   PetscFunctionReturn(0);
157d9262e54SJed Brown }
158d9262e54SJed Brown #undef __FUNCT__
159d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish"
1607087cfbeSBarry Smith PetscErrorCode  PetscStackDepublish(void)
161d9262e54SJed Brown {
162d9262e54SJed Brown   PetscFunctionBegin;
163d9262e54SJed Brown   PetscFunctionReturn(0);
164d9262e54SJed Brown }
165d9262e54SJed Brown #undef __FUNCT__
166d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
1677087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
168d9262e54SJed Brown {
169d9262e54SJed Brown   PetscFunctionBegin;
170d9262e54SJed Brown   PetscFunctionReturn(0);
171d9262e54SJed Brown }
172d9262e54SJed Brown #undef __FUNCT__
173d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
1747087cfbeSBarry Smith PetscErrorCode  PetscStackView(PetscViewer viewer)
175d9262e54SJed Brown {
176d9262e54SJed Brown   PetscFunctionBegin;
177d9262e54SJed Brown   PetscFunctionReturn(0);
178d9262e54SJed Brown }
179d9262e54SJed Brown #undef __FUNCT__
180d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
1817087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
182d9262e54SJed Brown {
183d9262e54SJed Brown   PetscFunctionBegin;
184d9262e54SJed Brown   PetscFunctionReturn(0);
185d9262e54SJed Brown }
186d9262e54SJed Brown 
187d9262e54SJed Brown #endif
188d9262e54SJed Brown 
189