xref: /petsc/src/sys/error/pstack.c (revision 61d886c9ff648f610b62ee858c86f3a43514a549)
1d9262e54SJed Brown 
2c6db04a5SJed Brown #include <petscsys.h>        /*I  "petscsys.h"   I*/
3d9262e54SJed Brown 
48bf1f09cSShri Abhyankar #if defined(PETSC_USE_DEBUG)
5d9262e54SJed Brown 
6997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL)
7997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack  *petscstack = 0;
8fe89fe5aSShri Abhyankar #else
97087cfbeSBarry Smith PetscStack *petscstack = 0;
10fe89fe5aSShri Abhyankar #endif
11d9262e54SJed Brown 
12d9262e54SJed Brown #undef __FUNCT__
13d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish"
147087cfbeSBarry Smith PetscErrorCode  PetscStackPublish(void)
15d9262e54SJed Brown {
16d9262e54SJed Brown   PetscFunctionBegin;
17d9262e54SJed Brown   PetscFunctionReturn(0);
18d9262e54SJed Brown }
19d9262e54SJed Brown 
20d9262e54SJed Brown #undef __FUNCT__
21d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish"
227087cfbeSBarry Smith PetscErrorCode  PetscStackDepublish(void)
23d9262e54SJed Brown {
24d9262e54SJed Brown   PetscFunctionBegin;
25d9262e54SJed Brown   PetscFunctionReturn(0);
26d9262e54SJed Brown }
27d9262e54SJed Brown 
28d9262e54SJed Brown #undef __FUNCT__
29d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
307087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
31d9262e54SJed Brown {
32d9262e54SJed Brown   PetscErrorCode ierr;
33d9262e54SJed Brown 
34d9262e54SJed Brown   PetscStack *petscstack_in;
35d9262e54SJed Brown   if (petscstack) return 0;
36d9262e54SJed Brown 
37d9262e54SJed Brown   ierr = PetscNew(PetscStack,&petscstack_in);CHKERRQ(ierr);
38d9262e54SJed Brown   petscstack_in->currentsize = 0;
39d9262e54SJed Brown   petscstack = petscstack_in;
40*61d886c9SShri Abhyankar   PetscThreadLocalSetValue(petscstack,petscstack); /* Sets the value for the pthread_key_t if it is used */
41d9262e54SJed Brown   return 0;
42d9262e54SJed Brown }
43d9262e54SJed Brown 
44d9262e54SJed Brown #undef __FUNCT__
45d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
467087cfbeSBarry Smith PetscErrorCode  PetscStackView(PetscViewer viewer)
47d9262e54SJed Brown {
48d9262e54SJed Brown   PetscErrorCode ierr;
49d9262e54SJed Brown   int  i;
50d9262e54SJed Brown   FILE *file;
51d9262e54SJed Brown 
52d9262e54SJed Brown   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
53d9262e54SJed Brown   ierr = PetscViewerASCIIGetPointer(viewer,&file);CHKERRQ(ierr);
54d9262e54SJed Brown 
55d9262e54SJed Brown   if (file == PETSC_STDOUT) {
56d9262e54SJed Brown     (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n");
57d9262e54SJed Brown     (*PetscErrorPrintf)("      INSTEAD the line number of the start of the function\n");
58d9262e54SJed Brown     (*PetscErrorPrintf)("      is given.\n");
59d9262e54SJed Brown     for (i=petscstack->currentsize-1; i>=0; i--) {
60d9262e54SJed Brown       (*PetscErrorPrintf)("[%d] %s line %d %s%s\n",PetscGlobalRank,
61d9262e54SJed Brown                                                    petscstack->function[i],
62d9262e54SJed Brown                                                    petscstack->line[i],
63d9262e54SJed Brown                                                    petscstack->directory[i],
64d9262e54SJed Brown                                                    petscstack->file[i]);
65d9262e54SJed Brown     }
66d9262e54SJed Brown   } else {
67d9262e54SJed Brown     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
68d9262e54SJed Brown     fprintf(file,"      INSTEAD the line number of the start of the function\n");
69d9262e54SJed Brown     fprintf(file,"      is given.\n");
70d9262e54SJed Brown     for (i=petscstack->currentsize-1; i>=0; i--) {
71d9262e54SJed Brown       fprintf(file,"[%d] %s line %d %s%s\n",PetscGlobalRank,
72d9262e54SJed Brown                                             petscstack->function[i],
73d9262e54SJed Brown                                             petscstack->line[i],
74d9262e54SJed Brown                                             petscstack->directory[i],
75d9262e54SJed Brown                                             petscstack->file[i]);
76d9262e54SJed Brown     }
77d9262e54SJed Brown   }
78d9262e54SJed Brown   return 0;
79d9262e54SJed Brown }
80d9262e54SJed Brown 
81d9262e54SJed Brown #undef __FUNCT__
82d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
83d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
847087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
85d9262e54SJed Brown {
86d9262e54SJed Brown   PetscErrorCode ierr;
87d9262e54SJed Brown   if (petscstack){
88d9262e54SJed Brown     PetscStack *petscstack_in = petscstack;
89d9262e54SJed Brown     petscstack = 0;
90d9262e54SJed Brown     ierr = PetscFree(petscstack_in);CHKERRQ(ierr);
91*61d886c9SShri Abhyankar     PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */
92d9262e54SJed Brown   }
93d9262e54SJed Brown   return 0;
94d9262e54SJed Brown }
95d9262e54SJed Brown 
96d9262e54SJed Brown #undef __FUNCT__
97d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy"
98d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
997087cfbeSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack* sint,PetscStack* sout)
100d9262e54SJed Brown {
101d9262e54SJed Brown   int i;
102d9262e54SJed Brown 
103d9262e54SJed Brown   if (!sint) {
104d9262e54SJed Brown     sout->currentsize = 0;
105d9262e54SJed Brown   } else {
106d9262e54SJed Brown     for (i=0; i<sint->currentsize; i++) {
107d9262e54SJed Brown       sout->function[i]  = sint->function[i];
108d9262e54SJed Brown       sout->file[i]      = sint->file[i];
109d9262e54SJed Brown       sout->directory[i] = sint->directory[i];
110d9262e54SJed Brown       sout->line[i]      = sint->line[i];
111d9262e54SJed Brown     }
112d9262e54SJed Brown     sout->currentsize = sint->currentsize;
113d9262e54SJed Brown   }
114d9262e54SJed Brown   return 0;
115d9262e54SJed Brown }
116d9262e54SJed Brown 
117d9262e54SJed Brown #undef __FUNCT__
118d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint"
119d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1207087cfbeSBarry Smith PetscErrorCode  PetscStackPrint(PetscStack* sint,FILE *fp)
121d9262e54SJed Brown {
122d9262e54SJed Brown   int i;
123d9262e54SJed Brown 
124d9262e54SJed Brown   if (!sint) return(0);
125d9262e54SJed Brown   for (i=sint->currentsize-3; i>=0; i--) {
126d9262e54SJed Brown     fprintf(fp,"      [%d]  %s() line %d in %s%s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->directory[i],sint->file[i]);
127d9262e54SJed Brown   }
128d9262e54SJed Brown   return 0;
129d9262e54SJed Brown }
130d9262e54SJed Brown 
131d9262e54SJed Brown #else
132d9262e54SJed Brown #undef __FUNCT__
133d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish"
1347087cfbeSBarry Smith PetscErrorCode  PetscStackPublish(void)
135d9262e54SJed Brown {
136d9262e54SJed Brown   PetscFunctionBegin;
137d9262e54SJed Brown   PetscFunctionReturn(0);
138d9262e54SJed Brown }
139d9262e54SJed Brown #undef __FUNCT__
140d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish"
1417087cfbeSBarry Smith PetscErrorCode  PetscStackDepublish(void)
142d9262e54SJed Brown {
143d9262e54SJed Brown   PetscFunctionBegin;
144d9262e54SJed Brown   PetscFunctionReturn(0);
145d9262e54SJed Brown }
146d9262e54SJed Brown #undef __FUNCT__
147d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
1487087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
149d9262e54SJed Brown {
150d9262e54SJed Brown   PetscFunctionBegin;
151d9262e54SJed Brown   PetscFunctionReturn(0);
152d9262e54SJed Brown }
153d9262e54SJed Brown #undef __FUNCT__
154d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
1557087cfbeSBarry Smith PetscErrorCode  PetscStackView(PetscViewer viewer)
156d9262e54SJed Brown {
157d9262e54SJed Brown   PetscFunctionBegin;
158d9262e54SJed Brown   PetscFunctionReturn(0);
159d9262e54SJed Brown }
160d9262e54SJed Brown #undef __FUNCT__
161d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
1627087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
163d9262e54SJed Brown {
164d9262e54SJed Brown   PetscFunctionBegin;
165d9262e54SJed Brown   PetscFunctionReturn(0);
166d9262e54SJed Brown }
167d9262e54SJed Brown 
168d9262e54SJed Brown #endif
169d9262e54SJed Brown 
170