xref: /petsc/src/sys/error/pstack.c (revision dbf62e16cdc1d232b534ec244cc0f4d44d5069e2)
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;
34*dbf62e16SBarry Smith   if (PetscStackActive()) return 0;
3574b43855SShri Abhyankar 
3674b43855SShri Abhyankar   petscstack_in              = (PetscStack*)malloc(sizeof(PetscStack));
3774b43855SShri Abhyankar   petscstack_in->currentsize = 0;
38bb9aae2fSBarry Smith   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"
55639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
56d9262e54SJed Brown {
57d9262e54SJed Brown   int        i;
581f46d60fSShri Abhyankar   PetscStack *petscstackp;
59d9262e54SJed Brown 
601f46d60fSShri Abhyankar   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
61639ff905SBarry 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");
67a297a907SKarl Rupp     for (i=petscstackp->currentsize-1; i>=0; i--) (*PetscErrorPrintf)("[%d] %s line %d %s%s\n",PetscGlobalRank,petscstackp->function[i],petscstackp->line[i],petscstackp->directory[i],petscstackp->file[i]);
68d9262e54SJed Brown   } else {
69d9262e54SJed Brown     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
70d9262e54SJed Brown     fprintf(file,"      INSTEAD the line number of the start of the function\n");
71d9262e54SJed Brown     fprintf(file,"      is given.\n");
72a297a907SKarl Rupp     for (i=petscstackp->currentsize-1; i>=0; i--) fprintf(file,"[%d] %s line %d %s%s\n",PetscGlobalRank,petscstackp->function[i],petscstackp->line[i],petscstackp->directory[i],petscstackp->file[i]);
73d9262e54SJed Brown   }
74d9262e54SJed Brown   return 0;
75d9262e54SJed Brown }
76d9262e54SJed Brown 
7774b43855SShri Abhyankar PetscErrorCode PetscStackDestroy_kernel(PetscInt trank)
7874b43855SShri Abhyankar {
79*dbf62e16SBarry Smith   if (PetscStackActive()) {
801f46d60fSShri Abhyankar     PetscStack *petscstack_in;
811f46d60fSShri Abhyankar     petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack);
8274b43855SShri Abhyankar     free(petscstack_in);
83bb9aae2fSBarry Smith     PetscThreadLocalSetValue(&petscstack,(PetscStack*)0);
8474b43855SShri Abhyankar   }
8574b43855SShri Abhyankar   return 0;
8674b43855SShri Abhyankar }
8774b43855SShri Abhyankar 
88d9262e54SJed Brown #undef __FUNCT__
89d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
90d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
917087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
92d9262e54SJed Brown {
93d9262e54SJed Brown   PetscErrorCode ierr;
9474b43855SShri Abhyankar   ierr = PetscThreadCommRunKernel0(PETSC_COMM_SELF,(PetscThreadKernel)PetscStackDestroy_kernel);CHKERRQ(ierr);
9574b43855SShri Abhyankar   ierr = PetscThreadCommBarrier(PETSC_COMM_SELF);CHKERRQ(ierr);
9661d886c9SShri Abhyankar   PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */
97d9262e54SJed Brown   return 0;
98d9262e54SJed Brown }
99d9262e54SJed Brown 
100d9262e54SJed Brown #undef __FUNCT__
101d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy"
102d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1037087cfbeSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack *sint,PetscStack *sout)
104d9262e54SJed Brown {
105d9262e54SJed Brown   int i;
106d9262e54SJed Brown 
107a297a907SKarl Rupp   if (!sint) sout->currentsize = 0;
108a297a907SKarl Rupp   else {
109d9262e54SJed Brown     for (i=0; i<sint->currentsize; i++) {
110d9262e54SJed Brown       sout->function[i]     = sint->function[i];
111d9262e54SJed Brown       sout->file[i]         = sint->file[i];
112d9262e54SJed Brown       sout->directory[i]    = sint->directory[i];
113d9262e54SJed Brown       sout->line[i]         = sint->line[i];
114a8d2bbe5SBarry Smith       sout->petscroutine[i] = sint->petscroutine[i];
115d9262e54SJed Brown     }
116d9262e54SJed Brown     sout->currentsize = sint->currentsize;
117d9262e54SJed Brown   }
118d9262e54SJed Brown   return 0;
119d9262e54SJed Brown }
120d9262e54SJed Brown 
121d9262e54SJed Brown #undef __FUNCT__
122d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint"
123d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1247087cfbeSBarry Smith PetscErrorCode  PetscStackPrint(PetscStack *sint,FILE *fp)
125d9262e54SJed Brown {
126d9262e54SJed Brown   int i;
127d9262e54SJed Brown 
128d9262e54SJed Brown   if (!sint) return(0);
129a297a907SKarl Rupp   for (i=sint->currentsize-2; i>=0; i--) fprintf(fp,"      [%d]  %s() line %d in %s%s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->directory[i],sint->file[i]);
130d9262e54SJed Brown   return 0;
131d9262e54SJed Brown }
132d9262e54SJed Brown 
133d9262e54SJed Brown #else
134d9262e54SJed Brown #undef __FUNCT__
135d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish"
1367087cfbeSBarry Smith PetscErrorCode  PetscStackPublish(void)
137d9262e54SJed Brown {
138d9262e54SJed Brown   PetscFunctionBegin;
139d9262e54SJed Brown   PetscFunctionReturn(0);
140d9262e54SJed Brown }
141d9262e54SJed Brown #undef __FUNCT__
142d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish"
1437087cfbeSBarry Smith PetscErrorCode  PetscStackDepublish(void)
144d9262e54SJed Brown {
145d9262e54SJed Brown   PetscFunctionBegin;
146d9262e54SJed Brown   PetscFunctionReturn(0);
147d9262e54SJed Brown }
148d9262e54SJed Brown #undef __FUNCT__
149d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
1507087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
151d9262e54SJed Brown {
152d9262e54SJed Brown   PetscFunctionBegin;
153d9262e54SJed Brown   PetscFunctionReturn(0);
154d9262e54SJed Brown }
155d9262e54SJed Brown #undef __FUNCT__
156d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
157639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
158d9262e54SJed Brown {
159d9262e54SJed Brown   PetscFunctionBegin;
160d9262e54SJed Brown   PetscFunctionReturn(0);
161d9262e54SJed Brown }
162d9262e54SJed Brown #undef __FUNCT__
163d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
1647087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
165d9262e54SJed Brown {
166d9262e54SJed Brown   PetscFunctionBegin;
167d9262e54SJed Brown   PetscFunctionReturn(0);
168d9262e54SJed Brown }
169d9262e54SJed Brown 
170d9262e54SJed Brown #endif
171d9262e54SJed Brown 
172