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