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