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