Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/demo/jvmti/hprof/hprof_stack.c
38829 views
/*1* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions5* are met:6*7* - Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9*10* - Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* - Neither the name of Oracle nor the names of its15* contributors may be used to endorse or promote products derived16* from this software without specific prior written permission.17*18* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS19* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,20* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR21* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR22* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,23* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,24* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR25* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF26* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING27* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS28* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.29*/3031/*32* This source code is provided to illustrate the usage of a given feature33* or technique and has been deliberately simplified. Additional steps34* required for a production-quality application, such as security checks,35* input validation and proper error handling, might not be present in36* this sample code.37*/383940/* Simple stack storage mechanism (or simple List). */4142/*43* Stack is any depth (grows as it needs to), elements are arbitrary44* length but known at stack init time.45*46* Stack elements can be accessed via pointers (be careful, if stack47* moved while you point into stack you have problems)48*49* Pointers to stack elements passed in are copied.50*51* Since the stack can be inspected, it can be used for more than just52* a simple stack.53*54*/5556#include "hprof.h"5758static void59resize(Stack *stack)60{61void *old_elements;62void *new_elements;63int old_size;64int new_size;6566HPROF_ASSERT(stack!=NULL);67HPROF_ASSERT(stack->elements!=NULL);68HPROF_ASSERT(stack->size>0);69HPROF_ASSERT(stack->elem_size>0);70HPROF_ASSERT(stack->incr_size>0);71old_size = stack->size;72old_elements = stack->elements;73if ( (stack->resizes % 10) && stack->incr_size < (old_size >> 2) ) {74stack->incr_size = old_size >> 2; /* 1/4 the old_size */75}76new_size = old_size + stack->incr_size;77new_elements = HPROF_MALLOC(new_size*stack->elem_size);78(void)memcpy(new_elements, old_elements, old_size*stack->elem_size);79stack->size = new_size;80stack->elements = new_elements;81HPROF_FREE(old_elements);82stack->resizes++;83}8485Stack *86stack_init(int init_size, int incr_size, int elem_size)87{88Stack *stack;89void *elements;9091HPROF_ASSERT(init_size>0);92HPROF_ASSERT(elem_size>0);93HPROF_ASSERT(incr_size>0);94stack = (Stack*)HPROF_MALLOC((int)sizeof(Stack));95elements = HPROF_MALLOC(init_size*elem_size);96stack->size = init_size;97stack->incr_size = incr_size;98stack->elem_size = elem_size;99stack->count = 0;100stack->elements = elements;101stack->resizes = 0;102return stack;103}104105void *106stack_element(Stack *stack, int i)107{108HPROF_ASSERT(stack!=NULL);109HPROF_ASSERT(stack->elements!=NULL);110HPROF_ASSERT(stack->count>i);111HPROF_ASSERT(i>=0);112return (void*)(((char*)stack->elements) + i * stack->elem_size);113}114115void *116stack_top(Stack *stack)117{118void *element;119120HPROF_ASSERT(stack!=NULL);121element = NULL;122if ( stack->count > 0 ) {123element = stack_element(stack, (stack->count-1));124}125return element;126}127128int129stack_depth(Stack *stack)130{131HPROF_ASSERT(stack!=NULL);132return stack->count;133}134135void *136stack_pop(Stack *stack)137{138void *element;139140element = stack_top(stack);141if ( element != NULL ) {142stack->count--;143}144return element;145}146147void148stack_push(Stack *stack, void *element)149{150void *top_element;151152HPROF_ASSERT(stack!=NULL);153if ( stack->count >= stack->size ) {154resize(stack);155}156stack->count++;157top_element = stack_top(stack);158(void)memcpy(top_element, element, stack->elem_size);159}160161void162stack_term(Stack *stack)163{164HPROF_ASSERT(stack!=NULL);165if ( stack->elements != NULL ) {166HPROF_FREE(stack->elements);167}168HPROF_FREE(stack);169}170171172