xref: /petsc/src/sys/logging/utils/stack.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
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