Actual source code: pstack.c

  2: #include <petscsys.h>        /*I  "petscsys.h"   I*/

  4: #if defined(PETSC_USE_DEBUG)  && !defined(PETSC_USE_PTHREAD)

  6: PetscStack  *petscstack = 0;

 10: PetscErrorCode  PetscStackPublish(void)
 11: {
 13:   return(0);
 14: }

 18: PetscErrorCode  PetscStackDepublish(void)
 19: {
 21:   return(0);
 22: }
 23: 
 26: PetscErrorCode  PetscStackCreate(void)
 27: {

 30:   PetscStack *petscstack_in;
 31:   if (petscstack) return 0;
 32: 
 33:   PetscNew(PetscStack,&petscstack_in);
 34:   petscstack_in->currentsize = 0;
 35:   petscstack = petscstack_in;

 37:   return 0;
 38: }

 42: PetscErrorCode  PetscStackView(PetscViewer viewer)
 43: {
 45:   int  i;
 46:   FILE *file;

 48:   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
 49:   PetscViewerASCIIGetPointer(viewer,&file);

 51:   if (file == PETSC_STDOUT) {
 52:     (*PetscErrorPrintf)("Note: The EXACT line numbers in the stack are not available,\n");
 53:     (*PetscErrorPrintf)("      INSTEAD the line number of the start of the function\n");
 54:     (*PetscErrorPrintf)("      is given.\n");
 55:     for (i=petscstack->currentsize-1; i>=0; i--) {
 56:       (*PetscErrorPrintf)("[%d] %s line %d %s%s\n",PetscGlobalRank,
 57:                                                    petscstack->function[i],
 58:                                                    petscstack->line[i],
 59:                                                    petscstack->directory[i],
 60:                                                    petscstack->file[i]);
 61:     }
 62:   } else {
 63:     fprintf(file,"Note: The EXACT line numbers in the stack are not available,\n");
 64:     fprintf(file,"      INSTEAD the line number of the start of the function\n");
 65:     fprintf(file,"      is given.\n");
 66:     for (i=petscstack->currentsize-1; i>=0; i--) {
 67:       fprintf(file,"[%d] %s line %d %s%s\n",PetscGlobalRank,
 68:                                             petscstack->function[i],
 69:                                             petscstack->line[i],
 70:                                             petscstack->directory[i],
 71:                                             petscstack->file[i]);
 72:     }
 73:   }
 74:   return 0;
 75: }

 80: PetscErrorCode  PetscStackDestroy(void)
 81: {
 83:   if (petscstack){
 84:     PetscStack *petscstack_in = petscstack;
 85:     petscstack = 0;
 86:     PetscFree(petscstack_in);
 87:   }
 88:   return 0;
 89: }

 94: PetscErrorCode  PetscStackCopy(PetscStack* sint,PetscStack* sout)
 95: {
 96:   int i;

 98:   if (!sint) {
 99:     sout->currentsize = 0;
100:   } else {
101:     for (i=0; i<sint->currentsize; i++) {
102:       sout->function[i]  = sint->function[i];
103:       sout->file[i]      = sint->file[i];
104:       sout->directory[i] = sint->directory[i];
105:       sout->line[i]      = sint->line[i];
106:     }
107:     sout->currentsize = sint->currentsize;
108:   }
109:   return 0;
110: }

115: PetscErrorCode  PetscStackPrint(PetscStack* sint,FILE *fp)
116: {
117:   int i;

119:   if (!sint) return(0);
120:   for (i=sint->currentsize-3; i>=0; i--) {
121:     fprintf(fp,"      [%d]  %s() line %d in %s%s\n",PetscGlobalRank,sint->function[i],sint->line[i],sint->directory[i],sint->file[i]);
122:   }
123:   return 0;
124: }

126: #else
129: PetscErrorCode  PetscStackPublish(void)
130: {
132:   return(0);
133: }
136: PetscErrorCode  PetscStackDepublish(void)
137: {
139:   return(0);
140: }
143: PetscErrorCode  PetscStackCreate(void)
144: {
146:   return(0);
147: }
150: PetscErrorCode  PetscStackView(PetscViewer viewer)
151: {
153:   return(0);
154: }
157: PetscErrorCode  PetscStackDestroy(void)
158: {
160:   return(0);
161: }

163: #endif