xref: /petsc/src/sys/error/pstack.c (revision 7d5f7e0c2c69ab2af36385a09fab7748470422fa)
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 
31*7d5f7e0cSShri Abhyankar PetscErrorCode PetscStackCreate(void)
3274b43855SShri Abhyankar {
3374b43855SShri Abhyankar   PetscStack *petscstack_in;
34dbf62e16SBarry Smith   if (PetscStackActive()) return 0;
3574b43855SShri Abhyankar 
3674b43855SShri Abhyankar   petscstack_in              = (PetscStack*)malloc(sizeof(PetscStack));
3774b43855SShri Abhyankar   petscstack_in->currentsize = 0;
38047240e1SBarry Smith   PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in);
3974b43855SShri Abhyankar   return 0;
4074b43855SShri Abhyankar }
4174b43855SShri Abhyankar 
42d9262e54SJed Brown #undef __FUNCT__
43d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
44639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
45d9262e54SJed Brown {
46d9262e54SJed Brown   int        i;
471f46d60fSShri Abhyankar   PetscStack *petscstackp;
48d9262e54SJed Brown 
491f46d60fSShri Abhyankar   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
50639ff905SBarry Smith   if (!file) file = PETSC_STDOUT;
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");
56a297a907SKarl 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]);
57d9262e54SJed Brown   } else {
58d9262e54SJed Brown     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
59d9262e54SJed Brown     fprintf(file,"      INSTEAD the line number of the start of the function\n");
60d9262e54SJed Brown     fprintf(file,"      is given.\n");
61a297a907SKarl 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]);
62d9262e54SJed Brown   }
63d9262e54SJed Brown   return 0;
64d9262e54SJed Brown }
65d9262e54SJed Brown 
66*7d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void)
6774b43855SShri Abhyankar {
68dbf62e16SBarry Smith   if (PetscStackActive()) {
691f46d60fSShri Abhyankar     PetscStack *petscstack_in;
701f46d60fSShri Abhyankar     petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack);
7174b43855SShri Abhyankar     free(petscstack_in);
72047240e1SBarry Smith     PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,(PetscStack*)0);
7361d886c9SShri Abhyankar     PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */
74*7d5f7e0cSShri Abhyankar   }
75d9262e54SJed Brown   return 0;
76d9262e54SJed Brown }
77d9262e54SJed Brown 
78d9262e54SJed Brown #undef __FUNCT__
79d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy"
80d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
817087cfbeSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack *sint,PetscStack *sout)
82d9262e54SJed Brown {
83d9262e54SJed Brown   int i;
84d9262e54SJed Brown 
85a297a907SKarl Rupp   if (!sint) sout->currentsize = 0;
86a297a907SKarl Rupp   else {
87d9262e54SJed Brown     for (i=0; i<sint->currentsize; i++) {
88d9262e54SJed Brown       sout->function[i]     = sint->function[i];
89d9262e54SJed Brown       sout->file[i]         = sint->file[i];
90d9262e54SJed Brown       sout->directory[i]    = sint->directory[i];
91d9262e54SJed Brown       sout->line[i]         = sint->line[i];
92a8d2bbe5SBarry Smith       sout->petscroutine[i] = sint->petscroutine[i];
93d9262e54SJed Brown     }
94d9262e54SJed Brown     sout->currentsize = sint->currentsize;
95d9262e54SJed Brown   }
96d9262e54SJed Brown   return 0;
97d9262e54SJed Brown }
98d9262e54SJed Brown 
99d9262e54SJed Brown #undef __FUNCT__
100d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint"
101d9262e54SJed Brown /*  PetscFunctionBegin;  so that make rule checkbadPetscFunctionBegin works */
1027087cfbeSBarry Smith PetscErrorCode  PetscStackPrint(PetscStack *sint,FILE *fp)
103d9262e54SJed Brown {
104d9262e54SJed Brown   int i;
105d9262e54SJed Brown 
106d9262e54SJed Brown   if (!sint) return(0);
107a297a907SKarl 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]);
108d9262e54SJed Brown   return 0;
109d9262e54SJed Brown }
110d9262e54SJed Brown 
111d9262e54SJed Brown #else
112d9262e54SJed Brown #undef __FUNCT__
113d9262e54SJed Brown #define __FUNCT__ "PetscStackPublish"
1147087cfbeSBarry Smith PetscErrorCode  PetscStackPublish(void)
115d9262e54SJed Brown {
116d9262e54SJed Brown   PetscFunctionBegin;
117d9262e54SJed Brown   PetscFunctionReturn(0);
118d9262e54SJed Brown }
119d9262e54SJed Brown #undef __FUNCT__
120d9262e54SJed Brown #define __FUNCT__ "PetscStackDepublish"
1217087cfbeSBarry Smith PetscErrorCode  PetscStackDepublish(void)
122d9262e54SJed Brown {
123d9262e54SJed Brown   PetscFunctionBegin;
124d9262e54SJed Brown   PetscFunctionReturn(0);
125d9262e54SJed Brown }
126d9262e54SJed Brown #undef __FUNCT__
127d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate"
1287087cfbeSBarry Smith PetscErrorCode  PetscStackCreate(void)
129d9262e54SJed Brown {
130d9262e54SJed Brown   PetscFunctionBegin;
131d9262e54SJed Brown   PetscFunctionReturn(0);
132d9262e54SJed Brown }
133d9262e54SJed Brown #undef __FUNCT__
134d9262e54SJed Brown #define __FUNCT__ "PetscStackView"
135639ff905SBarry Smith PetscErrorCode  PetscStackView(FILE *file)
136d9262e54SJed Brown {
137d9262e54SJed Brown   PetscFunctionBegin;
138d9262e54SJed Brown   PetscFunctionReturn(0);
139d9262e54SJed Brown }
140d9262e54SJed Brown #undef __FUNCT__
141d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy"
1427087cfbeSBarry Smith PetscErrorCode  PetscStackDestroy(void)
143d9262e54SJed Brown {
144d9262e54SJed Brown   PetscFunctionBegin;
145d9262e54SJed Brown   PetscFunctionReturn(0);
146d9262e54SJed Brown }
147d9262e54SJed Brown 
148d9262e54SJed Brown #endif
149d9262e54SJed Brown 
150