Actual source code: pstack.c

petsc-3.4.2 2013-07-02
  2: #include <petscsys.h>        /*I  "petscsys.h"   I*/

  4: #if defined(PETSC_USE_DEBUG)

  6: #if defined(PETSC_HAVE_PTHREADCLASSES)
  7: #if defined(PETSC_PTHREAD_LOCAL)
  8: PETSC_PTHREAD_LOCAL PetscStack *petscstack = 0;
  9: #endif
 10: #else
 11: PetscStack *petscstack = 0;
 12: #endif


 15: #if defined(PETSC_HAVE_AMS)
 16: #include <petscviewerams.h>

 18: static AMS_Memory amsmemstack = -1;

 22: /*@C
 23:    PetscStackAMSGrantAccess - Grants access of the PETSc stack frames to the AMS publisher

 25:    Collective on PETSC_COMM_WORLD?

 27:    Level: developer

 29:    Concepts: publishing object


 33: .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess()

 35: @*/
 36: void  PetscStackAMSGrantAccess(void)
 37: {
 38:   if (amsmemstack != -1) {
 39:     AMS_Memory_grant_access(amsmemstack);
 40:   }
 41: }

 45: /*@C
 46:    PetscStackAMSTakeAccess - Takes access of the PETSc stack frames to the AMS publisher

 48:    Collective on PETSC_COMM_WORLD?

 50:    Level: developer

 52:    Concepts: publishing object


 56: .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess()

 58: @*/
 59: void  PetscStackAMSTakeAccess(void)
 60: {
 61:   if (amsmemstack != -1) {
 62:     AMS_Memory_take_access(amsmemstack);
 63:   }
 64: }

 66: PetscErrorCode PetscStackViewAMS(void)
 67: {
 68:   AMS_Comm       acomm;
 70:   AMS_Memory     mem;
 71:   PetscStack*    petscstackp;

 73:   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
 74:   PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_WORLD,&acomm);
 75:   PetscStackCallAMS(AMS_Memory_create,(acomm,"Stack",&mem));
 76:   PetscStackCallAMS(AMS_Memory_take_access,(mem));
 77:   PetscStackCallAMS(AMS_Memory_add_field,(mem,"functions",petscstackp->function,10,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
 78:   PetscStackCallAMS(AMS_Memory_add_field,(mem,"current size",&petscstackp->currentsize,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
 79:   PetscStackCallAMS(AMS_Memory_publish,(mem));
 80:   PetscStackCallAMS(AMS_Memory_grant_access,(mem));
 81:   amsmemstack = mem;
 82:   return 0;
 83: }

 87: PetscErrorCode PetscStackAMSViewOff(void)
 88: {

 92:   if (amsmemstack == -1) return(0);
 93:   AMS_Memory_destroy(amsmemstack);
 94:   amsmemstack = -1;
 95:   return(0);
 96: }

 98: #endif

100: PetscErrorCode PetscStackCreate(void)
101: {
102:   PetscStack *petscstack_in;
103:   if (PetscStackActive()) return 0;

105:   petscstack_in              = (PetscStack*)malloc(sizeof(PetscStack));
106:   petscstack_in->currentsize = 0;
107:   PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in);

109: #if defined(PETSC_HAVE_AMS)
110:   {
111:   PetscBool flg = PETSC_FALSE;
112:   PetscOptionsHasName(NULL,"-stack_view",&flg);
113:   if (flg) PetscStackViewAMS();
114:   }
115: #endif
116:   return 0;
117: }


122: PetscErrorCode  PetscStackView(FILE *file)
123: {
124:   int        i;
125:   PetscStack *petscstackp;

127:   petscstackp = (PetscStack*)PetscThreadLocalGetValue(petscstack);
128:   if (!file) file = PETSC_STDOUT;

130:   if (file == PETSC_STDOUT) {
131:     (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n");
132:     (*PetscErrorPrintf)("      INSTEAD the line number of the start of the function\n");
133:     (*PetscErrorPrintf)("      is given.\n");
134:     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]);
135:   } else {
136:     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
137:     fprintf(file,"      INSTEAD the line number of the start of the function\n");
138:     fprintf(file,"      is given.\n");
139:     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]);
140:   }
141:   return 0;
142: }

144: PetscErrorCode PetscStackDestroy(void)
145: {
146:   if (PetscStackActive()) {
147:     PetscStack *petscstack_in;
148:     petscstack_in = (PetscStack*)PetscThreadLocalGetValue(petscstack);
149:     free(petscstack_in);
150:     PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,(PetscStack*)0);
151:     PetscThreadLocalDestroy(petscstack); /* Deletes pthread_key if it was used */
152:   }
153:   return 0;
154: }

159: PetscErrorCode  PetscStackCopy(PetscStack *sint,PetscStack *sout)
160: {
161:   int i;

163:   if (!sint) sout->currentsize = 0;
164:   else {
165:     for (i=0; i<sint->currentsize; i++) {
166:       sout->function[i]     = sint->function[i];
167:       sout->file[i]         = sint->file[i];
168:       sout->directory[i]    = sint->directory[i];
169:       sout->line[i]         = sint->line[i];
170:       sout->petscroutine[i] = sint->petscroutine[i];
171:     }
172:     sout->currentsize = sint->currentsize;
173:   }
174:   return 0;
175: }

180: PetscErrorCode  PetscStackPrint(PetscStack *sint,FILE *fp)
181: {
182:   int i;

184:   if (!sint) return(0);
185:   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]);
186:   return 0;
187: }

189: #else

193: PetscErrorCode  PetscStackCreate(void)
194: {
196:   return(0);
197: }
200: PetscErrorCode  PetscStackView(FILE *file)
201: {
203:   return(0);
204: }
207: PetscErrorCode  PetscStackDestroy(void)
208: {
210:   return(0);
211: }

213: #if defined(PETSC_HAVE_AMS)     /* AMS stack functions do nothing in optimized mode */
214: void PetscStackAMSGrantAccess(void) {}
215: void PetscStackAMSTakeAccess(void) {}

217: PetscErrorCode PetscStackViewAMS(void)
218: {
219:   return 0;
220: }

224: PetscErrorCode  PetscStackAMSViewOff(void)
225: {
227:   return(0);
228: }
229: #endif

231: #endif