1d9262e54SJed Brown 2c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 3d9262e54SJed Brown 4d9262e54SJed Brown 51f46d60fSShri Abhyankar #if defined(PETSC_HAVE_PTHREADCLASSES) 6997ce2baSShri Abhyankar #if defined(PETSC_PTHREAD_LOCAL) 7997ce2baSShri Abhyankar PETSC_PTHREAD_LOCAL PetscStack *petscstack = 0; 876386721SLisandro Dalcin #else 976386721SLisandro Dalcin PetscThreadKey petscstack; 101f46d60fSShri Abhyankar #endif 11fe89fe5aSShri Abhyankar #else 127087cfbeSBarry Smith PetscStack *petscstack = 0; 13fe89fe5aSShri Abhyankar #endif 14d9262e54SJed Brown 15c82b4e47SJed Brown #if defined(PETSC_HAVE_AMS) 16c82b4e47SJed Brown 172d7c6352SJed Brown # if defined(PETSC_USE_DEBUG) 1815681b3cSBarry Smith 1915681b3cSBarry Smith #include <petscviewerams.h> 2015681b3cSBarry Smith 2115681b3cSBarry Smith static AMS_Memory amsmemstack = -1; 2215681b3cSBarry Smith 23d9262e54SJed Brown #undef __FUNCT__ 2415681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSGrantAccess" 2515681b3cSBarry Smith /*@C 2615681b3cSBarry Smith PetscStackAMSGrantAccess - Grants access of the PETSc stack frames to the AMS publisher 2715681b3cSBarry Smith 2815681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 2915681b3cSBarry Smith 3015681b3cSBarry Smith Level: developer 3115681b3cSBarry Smith 3215681b3cSBarry Smith Concepts: publishing object 3315681b3cSBarry Smith 3415681b3cSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallAMS() since it may be used within those routines 3515681b3cSBarry Smith 3615681b3cSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess() 3715681b3cSBarry Smith 3815681b3cSBarry Smith @*/ 3915681b3cSBarry Smith void PetscStackAMSGrantAccess(void) 40d9262e54SJed Brown { 4115681b3cSBarry Smith if (amsmemstack != -1) { 4215681b3cSBarry Smith AMS_Memory_grant_access(amsmemstack); 4315681b3cSBarry Smith } 44d9262e54SJed Brown } 45d9262e54SJed Brown 46d9262e54SJed Brown #undef __FUNCT__ 4715681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSTakeAccess" 4815681b3cSBarry Smith /*@C 4915681b3cSBarry Smith PetscStackAMSTakeAccess - Takes access of the PETSc stack frames to the AMS publisher 5015681b3cSBarry Smith 5115681b3cSBarry Smith Collective on PETSC_COMM_WORLD? 5215681b3cSBarry Smith 5315681b3cSBarry Smith Level: developer 5415681b3cSBarry Smith 5515681b3cSBarry Smith Concepts: publishing object 5615681b3cSBarry Smith 5715681b3cSBarry Smith Developers Note: Cannot use PetscFunctionBegin/Return() or PetscStackCallAMS() since it may be used within those routines 5815681b3cSBarry Smith 5915681b3cSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess() 6015681b3cSBarry Smith 6115681b3cSBarry Smith @*/ 6215681b3cSBarry Smith void PetscStackAMSTakeAccess(void) 63d9262e54SJed Brown { 6415681b3cSBarry Smith if (amsmemstack != -1) { 6515681b3cSBarry Smith AMS_Memory_take_access(amsmemstack); 6615681b3cSBarry Smith } 6715681b3cSBarry Smith } 6815681b3cSBarry Smith 6915681b3cSBarry Smith PetscErrorCode PetscStackViewAMS(void) 7015681b3cSBarry Smith { 7115681b3cSBarry Smith AMS_Comm acomm; 7215681b3cSBarry Smith PetscErrorCode ierr; 7315681b3cSBarry Smith AMS_Memory mem; 7415681b3cSBarry Smith PetscStack* petscstackp; 7515681b3cSBarry Smith 7615681b3cSBarry Smith petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); 7715681b3cSBarry Smith ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_WORLD,&acomm);CHKERRQ(ierr); 7815681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_create,(acomm,"Stack",&mem)); 7915681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_take_access,(mem)); 8015681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_add_field,(mem,"functions",petscstackp->function,10,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF)); 8115681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_add_field,(mem,"current size",&petscstackp->currentsize,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF)); 8215681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_publish,(mem)); 8315681b3cSBarry Smith PetscStackCallAMS(AMS_Memory_grant_access,(mem)); 8415681b3cSBarry Smith amsmemstack = mem; 8515681b3cSBarry Smith return 0; 8615681b3cSBarry Smith } 8715681b3cSBarry Smith 8815681b3cSBarry Smith #undef __FUNCT__ 8915681b3cSBarry Smith #define __FUNCT__ "PetscStackAMSViewOff" 9015681b3cSBarry Smith PetscErrorCode PetscStackAMSViewOff(void) 9115681b3cSBarry Smith { 9215681b3cSBarry Smith PetscErrorCode ierr; 9315681b3cSBarry Smith 94d9262e54SJed Brown PetscFunctionBegin; 9515681b3cSBarry Smith if (amsmemstack == -1) PetscFunctionReturn(0); 9615681b3cSBarry Smith ierr = AMS_Memory_destroy(amsmemstack);CHKERRQ(ierr); 9715681b3cSBarry Smith amsmemstack = -1; 98d9262e54SJed Brown PetscFunctionReturn(0); 99d9262e54SJed Brown } 100d9262e54SJed Brown 101c82b4e47SJed Brown # else 102c82b4e47SJed Brown 103c82b4e47SJed Brown /* AMS stack functions do nothing in optimized mode */ 104c82b4e47SJed Brown void PetscStackAMSGrantAccess(void) {} 105c82b4e47SJed Brown void PetscStackAMSTakeAccess(void) {} 106c82b4e47SJed Brown 107c82b4e47SJed Brown PetscErrorCode PetscStackViewAMS(void) 108c82b4e47SJed Brown { 109c82b4e47SJed Brown return 0; 110c82b4e47SJed Brown } 111c82b4e47SJed Brown 112c82b4e47SJed Brown #undef __FUNCT__ 113c82b4e47SJed Brown #define __FUNCT__ "PetscStackAMSViewOff" 114c82b4e47SJed Brown PetscErrorCode PetscStackAMSViewOff(void) 115c82b4e47SJed Brown { 116c82b4e47SJed Brown PetscFunctionBegin; 117c82b4e47SJed Brown PetscFunctionReturn(0); 118c82b4e47SJed Brown } 119c82b4e47SJed Brown 120c82b4e47SJed Brown # endif 12115681b3cSBarry Smith #endif 12215681b3cSBarry Smith 1237d5f7e0cSShri Abhyankar PetscErrorCode PetscStackCreate(void) 12474b43855SShri Abhyankar { 12574b43855SShri Abhyankar PetscStack *petscstack_in; 126dbf62e16SBarry Smith if (PetscStackActive()) return 0; 12774b43855SShri Abhyankar 12874b43855SShri Abhyankar petscstack_in = (PetscStack*)malloc(sizeof(PetscStack)); 12974b43855SShri Abhyankar petscstack_in->currentsize = 0; 130*a2f94806SJed Brown petscstack_in->hotdepth = 0; 131047240e1SBarry Smith PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in); 13215681b3cSBarry Smith 13315681b3cSBarry Smith #if defined(PETSC_HAVE_AMS) 13415681b3cSBarry Smith { 13515681b3cSBarry Smith PetscBool flg = PETSC_FALSE; 13615681b3cSBarry Smith PetscOptionsHasName(NULL,"-stack_view",&flg); 13715681b3cSBarry Smith if (flg) PetscStackViewAMS(); 13815681b3cSBarry Smith } 13915681b3cSBarry Smith #endif 14074b43855SShri Abhyankar return 0; 14174b43855SShri Abhyankar } 14274b43855SShri Abhyankar 14315681b3cSBarry Smith 144d9262e54SJed Brown #undef __FUNCT__ 145d9262e54SJed Brown #define __FUNCT__ "PetscStackView" 146639ff905SBarry Smith PetscErrorCode PetscStackView(FILE *file) 147d9262e54SJed Brown { 148d9262e54SJed Brown int i; 1491f46d60fSShri Abhyankar PetscStack *petscstackp; 150d9262e54SJed Brown 1511f46d60fSShri Abhyankar petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); 152639ff905SBarry Smith if (!file) file = PETSC_STDOUT; 153d9262e54SJed Brown 154d9262e54SJed Brown if (file == PETSC_STDOUT) { 155d9262e54SJed Brown (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n"); 156d9262e54SJed Brown (*PetscErrorPrintf)(" INSTEAD the line number of the start of the function\n"); 157d9262e54SJed Brown (*PetscErrorPrintf)(" is given.\n"); 158a297a907SKarl 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]); 159d9262e54SJed Brown } else { 160d9262e54SJed Brown fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n"); 161d9262e54SJed Brown fprintf(file," INSTEAD the line number of the start of the function\n"); 162d9262e54SJed Brown fprintf(file," is given.\n"); 163a297a907SKarl 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]); 164d9262e54SJed Brown } 165d9262e54SJed Brown return 0; 166d9262e54SJed Brown } 167d9262e54SJed Brown 1687d5f7e0cSShri Abhyankar PetscErrorCode PetscStackDestroy(void) 16974b43855SShri Abhyankar { 170dbf62e16SBarry Smith if (PetscStackActive()) { 1711f46d60fSShri Abhyankar PetscStack *petscstack_in; 1721f46d60fSShri Abhyankar petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack); 17374b43855SShri Abhyankar free(petscstack_in); 17476386721SLisandro Dalcin PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,NULL); 1757d5f7e0cSShri Abhyankar } 176d9262e54SJed Brown return 0; 177d9262e54SJed Brown } 178d9262e54SJed Brown 179d9262e54SJed Brown #undef __FUNCT__ 180d9262e54SJed Brown #define __FUNCT__ "PetscStackCopy" 181d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 1827087cfbeSBarry Smith PetscErrorCode PetscStackCopy(PetscStack *sint,PetscStack *sout) 183d9262e54SJed Brown { 184d9262e54SJed Brown int i; 185d9262e54SJed Brown 186a297a907SKarl Rupp if (!sint) sout->currentsize = 0; 187a297a907SKarl Rupp else { 188d9262e54SJed Brown for (i=0; i<sint->currentsize; i++) { 189d9262e54SJed Brown sout->function[i] = sint->function[i]; 190d9262e54SJed Brown sout->file[i] = sint->file[i]; 191d9262e54SJed Brown sout->directory[i] = sint->directory[i]; 192d9262e54SJed Brown sout->line[i] = sint->line[i]; 193a8d2bbe5SBarry Smith sout->petscroutine[i] = sint->petscroutine[i]; 194d9262e54SJed Brown } 195d9262e54SJed Brown sout->currentsize = sint->currentsize; 196d9262e54SJed Brown } 197d9262e54SJed Brown return 0; 198d9262e54SJed Brown } 199d9262e54SJed Brown 200d9262e54SJed Brown #undef __FUNCT__ 201d9262e54SJed Brown #define __FUNCT__ "PetscStackPrint" 202d9262e54SJed Brown /* PetscFunctionBegin; so that make rule checkbadPetscFunctionBegin works */ 2037087cfbeSBarry Smith PetscErrorCode PetscStackPrint(PetscStack *sint,FILE *fp) 204d9262e54SJed Brown { 205d9262e54SJed Brown int i; 206d9262e54SJed Brown 207d9262e54SJed Brown if (!sint) return(0); 208a297a907SKarl 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]); 209d9262e54SJed Brown return 0; 210d9262e54SJed Brown } 211d9262e54SJed Brown 212