xref: /petsc/src/sys/error/pstack.c (revision 639ff905112582a9e6dc1ff56f68c17e6a78d3ed)
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 
71f46d60fSShri Abhyankar #if defined(PETSC_HAVE_PTHREADCLASSES)
8997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL)
9997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack  *petscstack = 0;
101f46d60fSShri 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;
341f46d60fSShri Abhyankar   if (PetscStackActive) return 0;
3574b43855SShri Abhyankar 
3674b43855SShri Abhyankar   petscstack_in = (PetscStack*)malloc(sizeof(PetscStack));
3774b43855SShri Abhyankar   petscstack_in->currentsize = 0;
381f46d60fSShri 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"
55*639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
56d9262e54SJed Brown {
57d9262e54SJed Brown   int            i;
581f46d60fSShri Abhyankar   PetscStack     *petscstackp;
59d9262e54SJed Brown 
601f46d60fSShri Abhyankar   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
61*639ff905SBarry Smith   if (!file) file = PETSC_STDOUT;
62d9262e54SJed Brown 
63d9262e54SJed Brown   if (file == PETSC_STDOUT) {
64d9262e54SJed Brown     (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n");
65d9262e54SJed Brown     (*PetscErrorPrintf)("      INSTEAD the line number of the start of the function\n");
66d9262e54SJed Brown     (*PetscErrorPrintf)("      is given.\n");
671f46d60fSShri Abhyankar     for (i=petscstackp->currentsize-1; i>=0; i--) {
68*639ff905SBarry Smith       (*PetscErrorPrintf)("[%d] %s line %d %s%s\n",PetscGlobalRank,petscstackp->function[i],petscstackp->line[i],petscstackp->directory[i],petscstackp->file[i]);
69d9262e54SJed Brown     }
70d9262e54SJed Brown   } else {
71d9262e54SJed Brown     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
72d9262e54SJed Brown     fprintf(file,"      INSTEAD the line number of the start of the function\n");
73d9262e54SJed Brown     fprintf(file,"      is given.\n");
741f46d60fSShri Abhyankar     for (i=petscstackp->currentsize-1; i>=0; i--) {
75*639ff905SBarry Smith       fprintf(file,"[%d] %s line %d %s%s\n",PetscGlobalRank,petscstackp->function[i],petscstackp->line[i],petscstackp->directory[i],petscstackp->file[i]);
76d9262e54SJed Brown     }
77d9262e54SJed Brown   }
78d9262e54SJed Brown   return 0;
79d9262e54SJed Brown }
80d9262e54SJed Brown 
8174b43855SShri Abhyankar PetscErrorCode PetscStackDestroy_kernel(PetscInt trank)
8274b43855SShri Abhyankar {
831f46d60fSShri Abhyankar   if (PetscStackActive) {
841f46d60fSShri Abhyankar     PetscStack *petscstack_in;
851f46d60fSShri Abhyankar     petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack);
8674b43855SShri Abhyankar     free(petscstack_in);
871f46d60fSShri Abhyankar     PetscThreadLocalSetValue(petscstack,(PetscStack*)0);
8874b43855SShri Abhyankar   }
8974b43855SShri Abhyankar   return 0;
9074b43855SShri Abhyankar }
9174b43855SShri Abhyankar 
92d9262e54SJed Brown #undef __FUNCT__
93d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
94d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
957087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
96d9262e54SJed Brown {
97d9262e54SJed Brown   PetscErrorCode ierr;
9874b43855SShri Abhyankar   ierr = PetscThreadCommRunKernel0(PETSC_COMM_SELF,(PetscThreadKernel)PetscStackDestroy_kernel);CHKERRQ(ierr);
9974b43855SShri Abhyankar   ierr = PetscThreadCommBarrier(PETSC_COMM_SELF);CHKERRQ(ierr);
10061d886c9SShri Abhyankar   PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */
101d9262e54SJed Brown   return 0;
102d9262e54SJed Brown }
103d9262e54SJed Brown 
104d9262e54SJed Brown #undef __FUNCT__
105d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy"
106d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1077087cfbeSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack* sint,PetscStack* sout)
108d9262e54SJed Brown {
109d9262e54SJed Brown   int i;
110d9262e54SJed Brown 
111d9262e54SJed Brown   if (!sint) {
112d9262e54SJed Brown     sout->currentsize = 0;
113d9262e54SJed Brown   } else {
114d9262e54SJed Brown     for (i=0; i<sint->currentsize; i++) {
115d9262e54SJed Brown       sout->function[i]     = sint->function[i];
116d9262e54SJed Brown       sout->file[i]         = sint->file[i];
117d9262e54SJed Brown       sout->directory[i]    = sint->directory[i];
118d9262e54SJed Brown       sout->line[i]         = sint->line[i];
119a8d2bbe5SBarry Smith       sout->petscroutine[i] = sint->petscroutine[i];
120d9262e54SJed Brown     }
121d9262e54SJed Brown     sout->currentsize = sint->currentsize;
122d9262e54SJed Brown   }
123d9262e54SJed Brown   return 0;
124d9262e54SJed Brown }
125d9262e54SJed Brown 
126d9262e54SJed Brown #undef __FUNCT__
127d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint"
128d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1297087cfbeSBarry Smith PetscErrorCode  PetscStackPrint(PetscStack* sint,FILE *fp)
130d9262e54SJed Brown {
131d9262e54SJed Brown   int i;
132d9262e54SJed Brown 
133d9262e54SJed Brown   if (!sint) return(0);
134a64a8e02SBarry Smith   for (i=sint->currentsize-2; i>=0; i--) {
135d9262e54SJed Brown     fprintf(fp,"      [%d]  %s() line %d in %s%s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->directory[i],sint->file[i]);
136d9262e54SJed Brown   }
137d9262e54SJed Brown   return 0;
138d9262e54SJed Brown }
139d9262e54SJed Brown 
140d9262e54SJed Brown #else
141d9262e54SJed Brown #undef __FUNCT__
142d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish"
1437087cfbeSBarry Smith PetscErrorCode  PetscStackPublish(void)
144d9262e54SJed Brown {
145d9262e54SJed Brown   PetscFunctionBegin;
146d9262e54SJed Brown   PetscFunctionReturn(0);
147d9262e54SJed Brown }
148d9262e54SJed Brown #undef __FUNCT__
149d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish"
1507087cfbeSBarry Smith PetscErrorCode  PetscStackDepublish(void)
151d9262e54SJed Brown {
152d9262e54SJed Brown   PetscFunctionBegin;
153d9262e54SJed Brown   PetscFunctionReturn(0);
154d9262e54SJed Brown }
155d9262e54SJed Brown #undef __FUNCT__
156d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
1577087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
158d9262e54SJed Brown {
159d9262e54SJed Brown   PetscFunctionBegin;
160d9262e54SJed Brown   PetscFunctionReturn(0);
161d9262e54SJed Brown }
162d9262e54SJed Brown #undef __FUNCT__
163d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
164*639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
165d9262e54SJed Brown {
166d9262e54SJed Brown   PetscFunctionBegin;
167d9262e54SJed Brown   PetscFunctionReturn(0);
168d9262e54SJed Brown }
169d9262e54SJed Brown #undef __FUNCT__
170d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
1717087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
172d9262e54SJed Brown {
173d9262e54SJed Brown   PetscFunctionBegin;
174d9262e54SJed Brown   PetscFunctionReturn(0);
175d9262e54SJed Brown }
176d9262e54SJed Brown 
177d9262e54SJed Brown #endif
178d9262e54SJed Brown 
179