1d9262e54SJed Brown 2c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 3d9262e54SJed Brown 48bf1f09cSShri Abhyankar #if defined(PETSC_USE_DEBUG) 5d9262e54SJed Brown 61f46d60fSShri Abhyankar #if defined(PETSC_HAVE_PTHREADCLASSES) 7997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL) 8997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack *petscstack = 0; 91f46d60fSShri Abhyankar #endif 10fe89fe5aSShri Abhyankar #else 117087cfbeSBarry Smith PetscStack *petscstack = 0; 12fe89fe5aSShri Abhyankar #endif 13d9262e54SJed Brown 14*15681b3cSBarry Smith 15*15681b3cSBarry Smith #if defined(PETSC_HAVE_AMS) 16*15681b3cSBarry Smith #include <petscviewerams.h> 17*15681b3cSBarry Smith 18*15681b3cSBarry Smith static AMS_Memory amsmemstack = -1; 19*15681b3cSBarry Smith 20d9262e54SJed Brown #undef __FUNCT__ 21*15681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSGrantAccess" 22*15681b3cSBarry Smith /*@C 23*15681b3cSBarry Smith PetscStackAMSGrantAccess - Grants access of the PETSc stack frames to the AMS publisher 24*15681b3cSBarry Smith 25*15681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 26*15681b3cSBarry Smith 27*15681b3cSBarry Smith Level: developer 28*15681b3cSBarry Smith 29*15681b3cSBarry Smith Concepts: publishing object 30*15681b3cSBarry Smith 31*15681b3cSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallAMS() since it may be used within those routines 32*15681b3cSBarry Smith 33*15681b3cSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess() 34*15681b3cSBarry Smith 35*15681b3cSBarry Smith @*/ 36*15681b3cSBarry Smith void PetscStackAMSGrantAccess(void) 37d9262e54SJed Brown { 38*15681b3cSBarry Smith if (amsmemstack != -1) { 39*15681b3cSBarry Smith AMS_Memory_grant_access(amsmemstack); 40*15681b3cSBarry Smith } 41d9262e54SJed Brown } 42d9262e54SJed Brown 43d9262e54SJed Brown #undef __FUNCT__ 44*15681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSTakeAccess" 45*15681b3cSBarry Smith /*@C 46*15681b3cSBarry Smith PetscStackAMSTakeAccess - Takes access of the PETSc stack frames to the AMS publisher 47*15681b3cSBarry Smith 48*15681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 49*15681b3cSBarry Smith 50*15681b3cSBarry Smith Level: developer 51*15681b3cSBarry Smith 52*15681b3cSBarry Smith Concepts: publishing object 53*15681b3cSBarry Smith 54*15681b3cSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallAMS() since it may be used within those routines 55*15681b3cSBarry Smith 56*15681b3cSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess() 57*15681b3cSBarry Smith 58*15681b3cSBarry Smith @*/ 59*15681b3cSBarry Smith void PetscStackAMSTakeAccess(void) 60d9262e54SJed Brown { 61*15681b3cSBarry Smith if (amsmemstack != -1) { 62*15681b3cSBarry Smith AMS_Memory_take_access(amsmemstack); 63*15681b3cSBarry Smith } 64*15681b3cSBarry Smith } 65*15681b3cSBarry Smith 66*15681b3cSBarry Smith PetscErrorCode PetscStackViewAMS(void) 67*15681b3cSBarry Smith { 68*15681b3cSBarry Smith AMS_Comm acomm; 69*15681b3cSBarry Smith PetscErrorCode ierr; 70*15681b3cSBarry Smith AMS_Memory mem; 71*15681b3cSBarry Smith PetscStack* petscstackp; 72*15681b3cSBarry Smith 73*15681b3cSBarry Smith petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); 74*15681b3cSBarry Smith ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_WORLD,&acomm);CHKERRQ(ierr); 75*15681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_create,(acomm,"Stack",&mem)); 76*15681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_take_access,(mem)); 77*15681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_add_field,(mem,"functions",petscstackp->function,10,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF)); 78*15681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_add_field,(mem,"current size",&petscstackp->currentsize,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF)); 79*15681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_publish,(mem)); 80*15681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_grant_access,(mem)); 81*15681b3cSBarry Smith amsmemstack = mem; 82*15681b3cSBarry Smith return 0; 83*15681b3cSBarry Smith } 84*15681b3cSBarry Smith 85*15681b3cSBarry Smith #undef __FUNCT__ 86*15681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSViewOff" 87*15681b3cSBarry Smith PetscErrorCode PetscStackAMSViewOff(void) 88*15681b3cSBarry Smith { 89*15681b3cSBarry Smith PetscErrorCode ierr; 90*15681b3cSBarry Smith 91d9262e54SJed Brown PetscFunctionBegin; 92*15681b3cSBarry Smith if (amsmemstack == -1) PetscFunctionReturn(0); 93*15681b3cSBarry Smith ierr = AMS_Memory_destroy(amsmemstack);CHKERRQ(ierr); 94*15681b3cSBarry Smith amsmemstack = -1; 95d9262e54SJed Brown PetscFunctionReturn(0); 96d9262e54SJed Brown } 97d9262e54SJed Brown 98*15681b3cSBarry Smith #endif 99*15681b3cSBarry Smith 1007d5f7e0cSShri Abhyankar PetscErrorCode PetscStackCreate(void) 10174b43855SShri Abhyankar { 10274b43855SShri Abhyankar PetscStack *petscstack_in; 103dbf62e16SBarry Smith if (PetscStackActive()) return 0; 10474b43855SShri Abhyankar 10574b43855SShri Abhyankar petscstack_in = (PetscStack*)malloc(sizeof(PetscStack)); 10674b43855SShri Abhyankar petscstack_in->currentsize = 0; 107047240e1SBarry Smith PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in); 108*15681b3cSBarry Smith 109*15681b3cSBarry Smith #if defined(PETSC_HAVE_AMS) 110*15681b3cSBarry Smith { 111*15681b3cSBarry Smith PetscBool flg = PETSC_FALSE; 112*15681b3cSBarry Smith PetscOptionsHasName(NULL,"-stack_view",&flg); 113*15681b3cSBarry Smith if (flg) PetscStackViewAMS(); 114*15681b3cSBarry Smith } 115*15681b3cSBarry Smith #endif 11674b43855SShri Abhyankar return 0; 11774b43855SShri Abhyankar } 11874b43855SShri Abhyankar 119*15681b3cSBarry Smith 120d9262e54SJed Brown #undef __FUNCT__ 121d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 122639ff905SBarry Smith PetscErrorCode PetscStackView(FILE *file) 123d9262e54SJed Brown { 124d9262e54SJed Brown int i; 1251f46d60fSShri Abhyankar PetscStack *petscstackp; 126d9262e54SJed Brown 1271f46d60fSShri Abhyankar petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); 128639ff905SBarry Smith if (!file) file = PETSC_STDOUT; 129d9262e54SJed Brown 130d9262e54SJed Brown if (file == PETSC_STDOUT) { 131d9262e54SJed Brown (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n"); 132d9262e54SJed Brown (*PetscErrorPrintf)(" INSTEAD the line number of the start of the function\n"); 133d9262e54SJed Brown (*PetscErrorPrintf)(" is given.\n"); 134a297a907SKarl 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]); 135d9262e54SJed Brown } else { 136d9262e54SJed Brown fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n"); 137d9262e54SJed Brown fprintf(file," INSTEAD the line number of the start of the function\n"); 138d9262e54SJed Brown fprintf(file," is given.\n"); 139a297a907SKarl 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]); 140d9262e54SJed Brown } 141d9262e54SJed Brown return 0; 142d9262e54SJed Brown } 143d9262e54SJed Brown 1447d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void) 14574b43855SShri Abhyankar { 146dbf62e16SBarry Smith if (PetscStackActive()) { 1471f46d60fSShri Abhyankar PetscStack *petscstack_in; 1481f46d60fSShri Abhyankar petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack); 14974b43855SShri Abhyankar free(petscstack_in); 150047240e1SBarry Smith PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,(PetscStack*)0); 15161d886c9SShri Abhyankar PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */ 1527d5f7e0cSShri Abhyankar } 153d9262e54SJed Brown return 0; 154d9262e54SJed Brown } 155d9262e54SJed Brown 156d9262e54SJed Brown #undef __FUNCT__ 157d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy" 158d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1597087cfbeSBarry Smith PetscErrorCode PetscStackCopy(PetscStack *sint,PetscStack *sout) 160d9262e54SJed Brown { 161d9262e54SJed Brown int i; 162d9262e54SJed Brown 163a297a907SKarl Rupp if (!sint) sout->currentsize = 0; 164a297a907SKarl Rupp else { 165d9262e54SJed Brown for (i=0; i<sint->currentsize; i++) { 166d9262e54SJed Brown sout->function[i] = sint->function[i]; 167d9262e54SJed Brown sout->file[i] = sint->file[i]; 168d9262e54SJed Brown sout->directory[i] = sint->directory[i]; 169d9262e54SJed Brown sout->line[i] = sint->line[i]; 170a8d2bbe5SBarry Smith sout->petscroutine[i] = sint->petscroutine[i]; 171d9262e54SJed Brown } 172d9262e54SJed Brown sout->currentsize = sint->currentsize; 173d9262e54SJed Brown } 174d9262e54SJed Brown return 0; 175d9262e54SJed Brown } 176d9262e54SJed Brown 177d9262e54SJed Brown #undef __FUNCT__ 178d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint" 179d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1807087cfbeSBarry Smith PetscErrorCode PetscStackPrint(PetscStack *sint,FILE *fp) 181d9262e54SJed Brown { 182d9262e54SJed Brown int i; 183d9262e54SJed Brown 184d9262e54SJed Brown if (!sint) return(0); 185a297a907SKarl 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]); 186d9262e54SJed Brown return 0; 187d9262e54SJed Brown } 188d9262e54SJed Brown 189d9262e54SJed Brown #else 190*15681b3cSBarry Smith 191d9262e54SJed Brown #undef __FUNCT__ 192d9262e54SJed Brown #define __FUNCT__ "PetscStackCreate" 1937087cfbeSBarry Smith PetscErrorCode PetscStackCreate(void) 194d9262e54SJed Brown { 195d9262e54SJed Brown PetscFunctionBegin; 196d9262e54SJed Brown PetscFunctionReturn(0); 197d9262e54SJed Brown } 198d9262e54SJed Brown #undef __FUNCT__ 199d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 200639ff905SBarry Smith PetscErrorCode PetscStackView(FILE *file) 201d9262e54SJed Brown { 202d9262e54SJed Brown PetscFunctionBegin; 203d9262e54SJed Brown PetscFunctionReturn(0); 204d9262e54SJed Brown } 205d9262e54SJed Brown #undef __FUNCT__ 206d9262e54SJed Brown #define __FUNCT__ "PetscStackDestroy" 2077087cfbeSBarry Smith PetscErrorCode PetscStackDestroy(void) 208d9262e54SJed Brown { 209d9262e54SJed Brown PetscFunctionBegin; 210d9262e54SJed Brown PetscFunctionReturn(0); 211d9262e54SJed Brown } 212d9262e54SJed Brown 213d9262e54SJed Brown #endif 214d9262e54SJed Brown 215