xref: /petsc/src/sys/logging/utils/stack.c (revision af0996ce37bc06907c37d8d91773840993d61e62)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith      This defines part of the private API for logging performance information. It is intended to be used only by the
45c6c1daeSBarry Smith    PETSc PetscLog...() interface and not elsewhere, nor by users. Hence the prototypes for these functions are NOT
55c6c1daeSBarry Smith    in the public PETSc include files.
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith */
8*af0996ceSBarry Smith #include <petsc/private/logimpl.h> /*I    "petscsys.h"   I*/
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith #undef __FUNCT__
115c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackDestroy"
125c6c1daeSBarry Smith /*@C
135c6c1daeSBarry Smith   PetscIntStackDestroy - This function destroys a stack.
145c6c1daeSBarry Smith 
155c6c1daeSBarry Smith   Not Collective
165c6c1daeSBarry Smith 
175c6c1daeSBarry Smith   Input Parameter:
185c6c1daeSBarry Smith . stack - The stack
195c6c1daeSBarry Smith 
205c6c1daeSBarry Smith   Level: developer
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith .keywords: log, stack, destroy
235c6c1daeSBarry Smith .seealso: PetscIntStackCreate(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackPop(), PetscIntStackTop()
245c6c1daeSBarry Smith @*/
255c6c1daeSBarry Smith PetscErrorCode PetscIntStackDestroy(PetscIntStack stack)
265c6c1daeSBarry Smith {
275c6c1daeSBarry Smith   PetscErrorCode ierr;
285c6c1daeSBarry Smith 
295c6c1daeSBarry Smith   PetscFunctionBegin;
305c6c1daeSBarry Smith   ierr = PetscFree(stack->stack);CHKERRQ(ierr);
315c6c1daeSBarry Smith   ierr = PetscFree(stack);CHKERRQ(ierr);
325c6c1daeSBarry Smith   PetscFunctionReturn(0);
335c6c1daeSBarry Smith }
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith #undef __FUNCT__
365c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackEmpty"
375c6c1daeSBarry Smith /*@C
385c6c1daeSBarry Smith   PetscIntStackEmpty - This function determines whether any items have been pushed.
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith   Not Collective
415c6c1daeSBarry Smith 
425c6c1daeSBarry Smith   Input Parameter:
435c6c1daeSBarry Smith . stack - The stack
445c6c1daeSBarry Smith 
455c6c1daeSBarry Smith   Output Parameter:
465c6c1daeSBarry Smith . empty - PETSC_TRUE if the stack is empty
475c6c1daeSBarry Smith 
485c6c1daeSBarry Smith   Level: developer
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith .keywords: log, stack, empty
515c6c1daeSBarry Smith .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackPush(), PetscIntStackPop(), PetscIntStackTop()
525c6c1daeSBarry Smith @*/
535c6c1daeSBarry Smith PetscErrorCode PetscIntStackEmpty(PetscIntStack stack, PetscBool  *empty)
545c6c1daeSBarry Smith {
555c6c1daeSBarry Smith   PetscFunctionBegin;
565c6c1daeSBarry Smith   PetscValidIntPointer(empty,2);
57a297a907SKarl Rupp   if (stack->top == -1) *empty = PETSC_TRUE;
58a297a907SKarl Rupp   else *empty = PETSC_FALSE;
595c6c1daeSBarry Smith   PetscFunctionReturn(0);
605c6c1daeSBarry Smith }
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith #undef __FUNCT__
635c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackTop"
645c6c1daeSBarry Smith /*@C
655c6c1daeSBarry Smith   PetscIntStackTop - This function returns the top of the stack.
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith   Not Collective
685c6c1daeSBarry Smith 
695c6c1daeSBarry Smith   Input Parameter:
705c6c1daeSBarry Smith . stack - The stack
715c6c1daeSBarry Smith 
725c6c1daeSBarry Smith   Output Parameter:
735c6c1daeSBarry Smith . top - The integer on top of the stack
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith   Level: developer
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith .keywords: log, stack, top
785c6c1daeSBarry Smith .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackPop()
795c6c1daeSBarry Smith @*/
805c6c1daeSBarry Smith PetscErrorCode PetscIntStackTop(PetscIntStack stack, int *top)
815c6c1daeSBarry Smith {
825c6c1daeSBarry Smith   PetscFunctionBegin;
835c6c1daeSBarry Smith   PetscValidIntPointer(top,2);
845c6c1daeSBarry Smith   *top = stack->stack[stack->top];
855c6c1daeSBarry Smith   PetscFunctionReturn(0);
865c6c1daeSBarry Smith }
875c6c1daeSBarry Smith 
885c6c1daeSBarry Smith #undef __FUNCT__
895c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackPush"
905c6c1daeSBarry Smith /*@C
915c6c1daeSBarry Smith   PetscIntStackPush - This function pushes an integer on the stack.
925c6c1daeSBarry Smith 
935c6c1daeSBarry Smith   Not Collective
945c6c1daeSBarry Smith 
955c6c1daeSBarry Smith   Input Parameters:
965c6c1daeSBarry Smith + stack - The stack
975c6c1daeSBarry Smith - item  - The integer to push
985c6c1daeSBarry Smith 
995c6c1daeSBarry Smith   Level: developer
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith .keywords: log, stack, push
1025c6c1daeSBarry Smith .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPop(), PetscIntStackTop()
1035c6c1daeSBarry Smith @*/
1045c6c1daeSBarry Smith PetscErrorCode PetscIntStackPush(PetscIntStack stack, int item)
1055c6c1daeSBarry Smith {
1065c6c1daeSBarry Smith   int            *array;
1075c6c1daeSBarry Smith   PetscErrorCode ierr;
1085c6c1daeSBarry Smith 
1095c6c1daeSBarry Smith   PetscFunctionBegin;
1105c6c1daeSBarry Smith   stack->top++;
1115c6c1daeSBarry Smith   if (stack->top >= stack->max) {
112785e854fSJed Brown     ierr = PetscMalloc1(stack->max*2, &array);CHKERRQ(ierr);
1135c6c1daeSBarry Smith     ierr = PetscMemcpy(array, stack->stack, stack->max * sizeof(int));CHKERRQ(ierr);
1145c6c1daeSBarry Smith     ierr = PetscFree(stack->stack);CHKERRQ(ierr);
115a297a907SKarl Rupp 
1165c6c1daeSBarry Smith     stack->stack = array;
1175c6c1daeSBarry Smith     stack->max  *= 2;
1185c6c1daeSBarry Smith   }
1195c6c1daeSBarry Smith   stack->stack[stack->top] = item;
1205c6c1daeSBarry Smith   PetscFunctionReturn(0);
1215c6c1daeSBarry Smith }
1225c6c1daeSBarry Smith 
1235c6c1daeSBarry Smith #undef __FUNCT__
1245c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackPop"
1255c6c1daeSBarry Smith /*@C
1265c6c1daeSBarry Smith   PetscIntStackPop - This function pops an integer from the stack.
1275c6c1daeSBarry Smith 
1285c6c1daeSBarry Smith   Not Collective
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith   Input Parameter:
1315c6c1daeSBarry Smith . stack - The stack
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith   Output Parameter:
1345c6c1daeSBarry Smith . item  - The integer popped
1355c6c1daeSBarry Smith 
1365c6c1daeSBarry Smith   Level: developer
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith .keywords: log, stack, pop
1395c6c1daeSBarry Smith .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackTop()
1405c6c1daeSBarry Smith @*/
1415c6c1daeSBarry Smith PetscErrorCode PetscIntStackPop(PetscIntStack stack, int *item)
1425c6c1daeSBarry Smith {
1435c6c1daeSBarry Smith   PetscFunctionBegin;
1445c6c1daeSBarry Smith   PetscValidPointer(item,2);
1455c6c1daeSBarry Smith   if (stack->top == -1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE, "Stack is empty");
1465c6c1daeSBarry Smith   *item = stack->stack[stack->top--];
1475c6c1daeSBarry Smith   PetscFunctionReturn(0);
1485c6c1daeSBarry Smith }
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith #undef __FUNCT__
1515c6c1daeSBarry Smith #define __FUNCT__ "PetscIntStackCreate"
1525c6c1daeSBarry Smith /*@C
1535c6c1daeSBarry Smith   PetscIntStackCreate - This function creates a stack.
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith   Not Collective
1565c6c1daeSBarry Smith 
1575c6c1daeSBarry Smith   Output Parameter:
1585c6c1daeSBarry Smith . stack - The stack
1595c6c1daeSBarry Smith 
1605c6c1daeSBarry Smith   Level: developer
1615c6c1daeSBarry Smith 
1625c6c1daeSBarry Smith .keywords: log, stack, pop
1635c6c1daeSBarry Smith .seealso: PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackPop(), PetscIntStackTop()
1645c6c1daeSBarry Smith @*/
1655c6c1daeSBarry Smith PetscErrorCode PetscIntStackCreate(PetscIntStack *stack)
1665c6c1daeSBarry Smith {
1675c6c1daeSBarry Smith   PetscIntStack  s;
1685c6c1daeSBarry Smith   PetscErrorCode ierr;
1695c6c1daeSBarry Smith 
1705c6c1daeSBarry Smith   PetscFunctionBegin;
1715c6c1daeSBarry Smith   PetscValidPointer(stack,1);
172b00a9115SJed Brown   ierr = PetscNew(&s);CHKERRQ(ierr);
173a297a907SKarl Rupp 
1745c6c1daeSBarry Smith   s->top = -1;
1755c6c1daeSBarry Smith   s->max = 128;
176a297a907SKarl Rupp 
1771795a4d1SJed Brown   ierr = PetscCalloc1(s->max, &s->stack);CHKERRQ(ierr);
1785c6c1daeSBarry Smith   *stack = s;
1795c6c1daeSBarry Smith   PetscFunctionReturn(0);
1805c6c1daeSBarry Smith }
181