1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith /* 3*5c6c1daeSBarry Smith This defines part of the private API for logging performance information. It is intended to be used only by the 4*5c6c1daeSBarry Smith PETSc PetscLog...() interface and not elsewhere, nor by users. Hence the prototypes for these functions are NOT 5*5c6c1daeSBarry Smith in the public PETSc include files. 6*5c6c1daeSBarry Smith 7*5c6c1daeSBarry Smith */ 8*5c6c1daeSBarry Smith #include <petsc-private/logimpl.h> /*I "petscsys.h" I*/ 9*5c6c1daeSBarry Smith 10*5c6c1daeSBarry Smith #undef __FUNCT__ 11*5c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackDestroy" 12*5c6c1daeSBarry Smith /*@C 13*5c6c1daeSBarry Smith PetscIntStackDestroy - This function destroys a stack. 14*5c6c1daeSBarry Smith 15*5c6c1daeSBarry Smith Not Collective 16*5c6c1daeSBarry Smith 17*5c6c1daeSBarry Smith Input Parameter: 18*5c6c1daeSBarry Smith . stack - The stack 19*5c6c1daeSBarry Smith 20*5c6c1daeSBarry Smith Level: developer 21*5c6c1daeSBarry Smith 22*5c6c1daeSBarry Smith .keywords: log, stack, destroy 23*5c6c1daeSBarry Smith .seealso: PetscIntStackCreate(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackPop(), PetscIntStackTop() 24*5c6c1daeSBarry Smith @*/ 25*5c6c1daeSBarry Smith PetscErrorCode PetscIntStackDestroy(PetscIntStack stack) 26*5c6c1daeSBarry Smith { 27*5c6c1daeSBarry Smith PetscErrorCode ierr; 28*5c6c1daeSBarry Smith 29*5c6c1daeSBarry Smith PetscFunctionBegin; 30*5c6c1daeSBarry Smith ierr = PetscFree(stack->stack);CHKERRQ(ierr); 31*5c6c1daeSBarry Smith ierr = PetscFree(stack);CHKERRQ(ierr); 32*5c6c1daeSBarry Smith PetscFunctionReturn(0); 33*5c6c1daeSBarry Smith } 34*5c6c1daeSBarry Smith 35*5c6c1daeSBarry Smith #undef __FUNCT__ 36*5c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackEmpty" 37*5c6c1daeSBarry Smith /*@C 38*5c6c1daeSBarry Smith PetscIntStackEmpty - This function determines whether any items have been pushed. 39*5c6c1daeSBarry Smith 40*5c6c1daeSBarry Smith Not Collective 41*5c6c1daeSBarry Smith 42*5c6c1daeSBarry Smith Input Parameter: 43*5c6c1daeSBarry Smith . stack - The stack 44*5c6c1daeSBarry Smith 45*5c6c1daeSBarry Smith Output Parameter: 46*5c6c1daeSBarry Smith . empty - PETSC_TRUE if the stack is empty 47*5c6c1daeSBarry Smith 48*5c6c1daeSBarry Smith Level: developer 49*5c6c1daeSBarry Smith 50*5c6c1daeSBarry Smith .keywords: log, stack, empty 51*5c6c1daeSBarry Smith .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackPush(), PetscIntStackPop(), PetscIntStackTop() 52*5c6c1daeSBarry Smith @*/ 53*5c6c1daeSBarry Smith PetscErrorCode PetscIntStackEmpty(PetscIntStack stack, PetscBool *empty) 54*5c6c1daeSBarry Smith { 55*5c6c1daeSBarry Smith PetscFunctionBegin; 56*5c6c1daeSBarry Smith PetscValidIntPointer(empty,2); 57*5c6c1daeSBarry Smith if (stack->top == -1) { 58*5c6c1daeSBarry Smith *empty = PETSC_TRUE; 59*5c6c1daeSBarry Smith } else { 60*5c6c1daeSBarry Smith *empty = PETSC_FALSE; 61*5c6c1daeSBarry Smith } 62*5c6c1daeSBarry Smith PetscFunctionReturn(0); 63*5c6c1daeSBarry Smith } 64*5c6c1daeSBarry Smith 65*5c6c1daeSBarry Smith #undef __FUNCT__ 66*5c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackTop" 67*5c6c1daeSBarry Smith /*@C 68*5c6c1daeSBarry Smith PetscIntStackTop - This function returns the top of the stack. 69*5c6c1daeSBarry Smith 70*5c6c1daeSBarry Smith Not Collective 71*5c6c1daeSBarry Smith 72*5c6c1daeSBarry Smith Input Parameter: 73*5c6c1daeSBarry Smith . stack - The stack 74*5c6c1daeSBarry Smith 75*5c6c1daeSBarry Smith Output Parameter: 76*5c6c1daeSBarry Smith . top - The integer on top of the stack 77*5c6c1daeSBarry Smith 78*5c6c1daeSBarry Smith Level: developer 79*5c6c1daeSBarry Smith 80*5c6c1daeSBarry Smith .keywords: log, stack, top 81*5c6c1daeSBarry Smith .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackPop() 82*5c6c1daeSBarry Smith @*/ 83*5c6c1daeSBarry Smith PetscErrorCode PetscIntStackTop(PetscIntStack stack, int *top) 84*5c6c1daeSBarry Smith { 85*5c6c1daeSBarry Smith PetscFunctionBegin; 86*5c6c1daeSBarry Smith PetscValidIntPointer(top,2); 87*5c6c1daeSBarry Smith *top = stack->stack[stack->top]; 88*5c6c1daeSBarry Smith PetscFunctionReturn(0); 89*5c6c1daeSBarry Smith } 90*5c6c1daeSBarry Smith 91*5c6c1daeSBarry Smith #undef __FUNCT__ 92*5c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackPush" 93*5c6c1daeSBarry Smith /*@C 94*5c6c1daeSBarry Smith PetscIntStackPush - This function pushes an integer on the stack. 95*5c6c1daeSBarry Smith 96*5c6c1daeSBarry Smith Not Collective 97*5c6c1daeSBarry Smith 98*5c6c1daeSBarry Smith Input Parameters: 99*5c6c1daeSBarry Smith + stack - The stack 100*5c6c1daeSBarry Smith - item - The integer to push 101*5c6c1daeSBarry Smith 102*5c6c1daeSBarry Smith Level: developer 103*5c6c1daeSBarry Smith 104*5c6c1daeSBarry Smith .keywords: log, stack, push 105*5c6c1daeSBarry Smith .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPop(), PetscIntStackTop() 106*5c6c1daeSBarry Smith @*/ 107*5c6c1daeSBarry Smith PetscErrorCode PetscIntStackPush(PetscIntStack stack, int item) 108*5c6c1daeSBarry Smith { 109*5c6c1daeSBarry Smith int *array; 110*5c6c1daeSBarry Smith PetscErrorCode ierr; 111*5c6c1daeSBarry Smith 112*5c6c1daeSBarry Smith PetscFunctionBegin; 113*5c6c1daeSBarry Smith stack->top++; 114*5c6c1daeSBarry Smith if (stack->top >= stack->max) { 115*5c6c1daeSBarry Smith ierr = PetscMalloc(stack->max*2 * sizeof(int), &array);CHKERRQ(ierr); 116*5c6c1daeSBarry Smith ierr = PetscMemcpy(array, stack->stack, stack->max * sizeof(int));CHKERRQ(ierr); 117*5c6c1daeSBarry Smith ierr = PetscFree(stack->stack);CHKERRQ(ierr); 118*5c6c1daeSBarry Smith stack->stack = array; 119*5c6c1daeSBarry Smith stack->max *= 2; 120*5c6c1daeSBarry Smith } 121*5c6c1daeSBarry Smith stack->stack[stack->top] = item; 122*5c6c1daeSBarry Smith PetscFunctionReturn(0); 123*5c6c1daeSBarry Smith } 124*5c6c1daeSBarry Smith 125*5c6c1daeSBarry Smith #undef __FUNCT__ 126*5c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackPop" 127*5c6c1daeSBarry Smith /*@C 128*5c6c1daeSBarry Smith PetscIntStackPop - This function pops an integer from the stack. 129*5c6c1daeSBarry Smith 130*5c6c1daeSBarry Smith Not Collective 131*5c6c1daeSBarry Smith 132*5c6c1daeSBarry Smith Input Parameter: 133*5c6c1daeSBarry Smith . stack - The stack 134*5c6c1daeSBarry Smith 135*5c6c1daeSBarry Smith Output Parameter: 136*5c6c1daeSBarry Smith . item - The integer popped 137*5c6c1daeSBarry Smith 138*5c6c1daeSBarry Smith Level: developer 139*5c6c1daeSBarry Smith 140*5c6c1daeSBarry Smith .keywords: log, stack, pop 141*5c6c1daeSBarry Smith .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackTop() 142*5c6c1daeSBarry Smith @*/ 143*5c6c1daeSBarry Smith PetscErrorCode PetscIntStackPop(PetscIntStack stack, int *item) 144*5c6c1daeSBarry Smith { 145*5c6c1daeSBarry Smith PetscFunctionBegin; 146*5c6c1daeSBarry Smith PetscValidPointer(item,2); 147*5c6c1daeSBarry Smith if (stack->top == -1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE, "Stack is empty"); 148*5c6c1daeSBarry Smith *item = stack->stack[stack->top--]; 149*5c6c1daeSBarry Smith PetscFunctionReturn(0); 150*5c6c1daeSBarry Smith } 151*5c6c1daeSBarry Smith 152*5c6c1daeSBarry Smith #undef __FUNCT__ 153*5c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackCreate" 154*5c6c1daeSBarry Smith /*@C 155*5c6c1daeSBarry Smith PetscIntStackCreate - This function creates a stack. 156*5c6c1daeSBarry Smith 157*5c6c1daeSBarry Smith Not Collective 158*5c6c1daeSBarry Smith 159*5c6c1daeSBarry Smith Output Parameter: 160*5c6c1daeSBarry Smith . stack - The stack 161*5c6c1daeSBarry Smith 162*5c6c1daeSBarry Smith Level: developer 163*5c6c1daeSBarry Smith 164*5c6c1daeSBarry Smith .keywords: log, stack, pop 165*5c6c1daeSBarry Smith .seealso: PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackPop(), PetscIntStackTop() 166*5c6c1daeSBarry Smith @*/ 167*5c6c1daeSBarry Smith PetscErrorCode PetscIntStackCreate(PetscIntStack *stack) 168*5c6c1daeSBarry Smith { 169*5c6c1daeSBarry Smith PetscIntStack s; 170*5c6c1daeSBarry Smith PetscErrorCode ierr; 171*5c6c1daeSBarry Smith 172*5c6c1daeSBarry Smith PetscFunctionBegin; 173*5c6c1daeSBarry Smith PetscValidPointer(stack,1); 174*5c6c1daeSBarry Smith ierr = PetscNew(struct _n_PetscIntStack, &s);CHKERRQ(ierr); 175*5c6c1daeSBarry Smith s->top = -1; 176*5c6c1daeSBarry Smith s->max = 128; 177*5c6c1daeSBarry Smith ierr = PetscMalloc(s->max * sizeof(int), &s->stack);CHKERRQ(ierr); 178*5c6c1daeSBarry Smith ierr = PetscMemzero(s->stack, s->max * sizeof(int));CHKERRQ(ierr); 179*5c6c1daeSBarry Smith *stack = s; 180*5c6c1daeSBarry Smith PetscFunctionReturn(0); 181*5c6c1daeSBarry Smith } 182