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