1*e82f7db8SAndroid Build Coastguard Worker /*
2*e82f7db8SAndroid Build Coastguard Worker * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved.
3*e82f7db8SAndroid Build Coastguard Worker * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*e82f7db8SAndroid Build Coastguard Worker *
5*e82f7db8SAndroid Build Coastguard Worker * This code is free software; you can redistribute it and/or modify it
6*e82f7db8SAndroid Build Coastguard Worker * under the terms of the GNU General Public License version 2 only, as
7*e82f7db8SAndroid Build Coastguard Worker * published by the Free Software Foundation. Oracle designates this
8*e82f7db8SAndroid Build Coastguard Worker * particular file as subject to the "Classpath" exception as provided
9*e82f7db8SAndroid Build Coastguard Worker * by Oracle in the LICENSE file that accompanied this code.
10*e82f7db8SAndroid Build Coastguard Worker *
11*e82f7db8SAndroid Build Coastguard Worker * This code is distributed in the hope that it will be useful, but WITHOUT
12*e82f7db8SAndroid Build Coastguard Worker * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*e82f7db8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14*e82f7db8SAndroid Build Coastguard Worker * version 2 for more details (a copy is included in the LICENSE file that
15*e82f7db8SAndroid Build Coastguard Worker * accompanied this code).
16*e82f7db8SAndroid Build Coastguard Worker *
17*e82f7db8SAndroid Build Coastguard Worker * You should have received a copy of the GNU General Public License version
18*e82f7db8SAndroid Build Coastguard Worker * 2 along with this work; if not, write to the Free Software Foundation,
19*e82f7db8SAndroid Build Coastguard Worker * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20*e82f7db8SAndroid Build Coastguard Worker *
21*e82f7db8SAndroid Build Coastguard Worker * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22*e82f7db8SAndroid Build Coastguard Worker * or visit www.oracle.com if you need additional information or have any
23*e82f7db8SAndroid Build Coastguard Worker * questions.
24*e82f7db8SAndroid Build Coastguard Worker */
25*e82f7db8SAndroid Build Coastguard Worker
26*e82f7db8SAndroid Build Coastguard Worker /* General routines for manipulating a bag data structure */
27*e82f7db8SAndroid Build Coastguard Worker
28*e82f7db8SAndroid Build Coastguard Worker #include "util.h"
29*e82f7db8SAndroid Build Coastguard Worker #include "bag.h"
30*e82f7db8SAndroid Build Coastguard Worker
31*e82f7db8SAndroid Build Coastguard Worker struct bag {
32*e82f7db8SAndroid Build Coastguard Worker void *items; /* hold items in bag, must align on itemSize */
33*e82f7db8SAndroid Build Coastguard Worker int used; /* number of items in bag */
34*e82f7db8SAndroid Build Coastguard Worker int allocated; /* space reserved */
35*e82f7db8SAndroid Build Coastguard Worker int itemSize; /* size of each item, should init to sizeof item */
36*e82f7db8SAndroid Build Coastguard Worker };
37*e82f7db8SAndroid Build Coastguard Worker
38*e82f7db8SAndroid Build Coastguard Worker struct bag *
bagCreateBag(int itemSize,int initialAllocation)39*e82f7db8SAndroid Build Coastguard Worker bagCreateBag(int itemSize, int initialAllocation) {
40*e82f7db8SAndroid Build Coastguard Worker struct bag *theBag = (struct bag *)jvmtiAllocate(sizeof(struct bag));
41*e82f7db8SAndroid Build Coastguard Worker if (theBag == NULL) {
42*e82f7db8SAndroid Build Coastguard Worker return NULL;
43*e82f7db8SAndroid Build Coastguard Worker }
44*e82f7db8SAndroid Build Coastguard Worker itemSize = (itemSize + 7) & ~7; /* fit 8 byte boundary */
45*e82f7db8SAndroid Build Coastguard Worker theBag->items = jvmtiAllocate(initialAllocation * itemSize);
46*e82f7db8SAndroid Build Coastguard Worker if (theBag->items == NULL) {
47*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(theBag);
48*e82f7db8SAndroid Build Coastguard Worker return NULL;
49*e82f7db8SAndroid Build Coastguard Worker }
50*e82f7db8SAndroid Build Coastguard Worker theBag->used = 0;
51*e82f7db8SAndroid Build Coastguard Worker theBag->allocated = initialAllocation;
52*e82f7db8SAndroid Build Coastguard Worker theBag->itemSize = itemSize;
53*e82f7db8SAndroid Build Coastguard Worker return theBag;
54*e82f7db8SAndroid Build Coastguard Worker }
55*e82f7db8SAndroid Build Coastguard Worker
56*e82f7db8SAndroid Build Coastguard Worker struct bag *
bagDup(struct bag * oldBag)57*e82f7db8SAndroid Build Coastguard Worker bagDup(struct bag *oldBag)
58*e82f7db8SAndroid Build Coastguard Worker {
59*e82f7db8SAndroid Build Coastguard Worker struct bag *newBag = bagCreateBag(oldBag->itemSize,
60*e82f7db8SAndroid Build Coastguard Worker oldBag->allocated);
61*e82f7db8SAndroid Build Coastguard Worker if (newBag != NULL) {
62*e82f7db8SAndroid Build Coastguard Worker newBag->used = oldBag->used;
63*e82f7db8SAndroid Build Coastguard Worker (void)memcpy(newBag->items, oldBag->items, newBag->used * newBag->itemSize);
64*e82f7db8SAndroid Build Coastguard Worker }
65*e82f7db8SAndroid Build Coastguard Worker return newBag;
66*e82f7db8SAndroid Build Coastguard Worker }
67*e82f7db8SAndroid Build Coastguard Worker
68*e82f7db8SAndroid Build Coastguard Worker void
bagDestroyBag(struct bag * theBag)69*e82f7db8SAndroid Build Coastguard Worker bagDestroyBag(struct bag *theBag)
70*e82f7db8SAndroid Build Coastguard Worker {
71*e82f7db8SAndroid Build Coastguard Worker if (theBag != NULL) {
72*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(theBag->items);
73*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(theBag);
74*e82f7db8SAndroid Build Coastguard Worker }
75*e82f7db8SAndroid Build Coastguard Worker }
76*e82f7db8SAndroid Build Coastguard Worker
77*e82f7db8SAndroid Build Coastguard Worker void *
bagFind(struct bag * theBag,void * key)78*e82f7db8SAndroid Build Coastguard Worker bagFind(struct bag *theBag, void *key)
79*e82f7db8SAndroid Build Coastguard Worker {
80*e82f7db8SAndroid Build Coastguard Worker char *items = theBag->items;
81*e82f7db8SAndroid Build Coastguard Worker int itemSize = theBag->itemSize;
82*e82f7db8SAndroid Build Coastguard Worker char *itemsEnd = items + (itemSize * theBag->used);
83*e82f7db8SAndroid Build Coastguard Worker
84*e82f7db8SAndroid Build Coastguard Worker for (; items < itemsEnd; items += itemSize) {
85*e82f7db8SAndroid Build Coastguard Worker /*LINTED*/
86*e82f7db8SAndroid Build Coastguard Worker if (*((void**)items) == key) {
87*e82f7db8SAndroid Build Coastguard Worker return items;
88*e82f7db8SAndroid Build Coastguard Worker }
89*e82f7db8SAndroid Build Coastguard Worker }
90*e82f7db8SAndroid Build Coastguard Worker return NULL;
91*e82f7db8SAndroid Build Coastguard Worker }
92*e82f7db8SAndroid Build Coastguard Worker
93*e82f7db8SAndroid Build Coastguard Worker void *
bagAdd(struct bag * theBag)94*e82f7db8SAndroid Build Coastguard Worker bagAdd(struct bag *theBag)
95*e82f7db8SAndroid Build Coastguard Worker {
96*e82f7db8SAndroid Build Coastguard Worker int allocated = theBag->allocated;
97*e82f7db8SAndroid Build Coastguard Worker int itemSize = theBag->itemSize;
98*e82f7db8SAndroid Build Coastguard Worker void *items = theBag->items;
99*e82f7db8SAndroid Build Coastguard Worker void *ret;
100*e82f7db8SAndroid Build Coastguard Worker
101*e82f7db8SAndroid Build Coastguard Worker /* if there are no unused slots reallocate */
102*e82f7db8SAndroid Build Coastguard Worker if (theBag->used >= allocated) {
103*e82f7db8SAndroid Build Coastguard Worker void *new_items;
104*e82f7db8SAndroid Build Coastguard Worker allocated *= 2;
105*e82f7db8SAndroid Build Coastguard Worker new_items = jvmtiAllocate(allocated * itemSize);
106*e82f7db8SAndroid Build Coastguard Worker if (new_items == NULL) {
107*e82f7db8SAndroid Build Coastguard Worker return NULL;
108*e82f7db8SAndroid Build Coastguard Worker }
109*e82f7db8SAndroid Build Coastguard Worker (void)memcpy(new_items, items, (theBag->used) * itemSize);
110*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(items);
111*e82f7db8SAndroid Build Coastguard Worker items = new_items;
112*e82f7db8SAndroid Build Coastguard Worker theBag->allocated = allocated;
113*e82f7db8SAndroid Build Coastguard Worker theBag->items = items;
114*e82f7db8SAndroid Build Coastguard Worker }
115*e82f7db8SAndroid Build Coastguard Worker ret = ((char *)items) + (itemSize * (theBag->used)++);
116*e82f7db8SAndroid Build Coastguard Worker (void)memset(ret, 0, itemSize);
117*e82f7db8SAndroid Build Coastguard Worker return ret;
118*e82f7db8SAndroid Build Coastguard Worker }
119*e82f7db8SAndroid Build Coastguard Worker
120*e82f7db8SAndroid Build Coastguard Worker void
bagDelete(struct bag * theBag,void * condemned)121*e82f7db8SAndroid Build Coastguard Worker bagDelete(struct bag *theBag, void *condemned)
122*e82f7db8SAndroid Build Coastguard Worker {
123*e82f7db8SAndroid Build Coastguard Worker int used = --(theBag->used);
124*e82f7db8SAndroid Build Coastguard Worker int itemSize = theBag->itemSize;
125*e82f7db8SAndroid Build Coastguard Worker void *items = theBag->items;
126*e82f7db8SAndroid Build Coastguard Worker void *tailItem = ((char *)items) + (used * itemSize);
127*e82f7db8SAndroid Build Coastguard Worker
128*e82f7db8SAndroid Build Coastguard Worker if (condemned != tailItem) {
129*e82f7db8SAndroid Build Coastguard Worker (void)memcpy(condemned, tailItem, itemSize);
130*e82f7db8SAndroid Build Coastguard Worker }
131*e82f7db8SAndroid Build Coastguard Worker }
132*e82f7db8SAndroid Build Coastguard Worker
133*e82f7db8SAndroid Build Coastguard Worker void
bagDeleteAll(struct bag * theBag)134*e82f7db8SAndroid Build Coastguard Worker bagDeleteAll(struct bag *theBag)
135*e82f7db8SAndroid Build Coastguard Worker {
136*e82f7db8SAndroid Build Coastguard Worker theBag->used = 0;
137*e82f7db8SAndroid Build Coastguard Worker }
138*e82f7db8SAndroid Build Coastguard Worker
139*e82f7db8SAndroid Build Coastguard Worker
140*e82f7db8SAndroid Build Coastguard Worker int
bagSize(struct bag * theBag)141*e82f7db8SAndroid Build Coastguard Worker bagSize(struct bag *theBag)
142*e82f7db8SAndroid Build Coastguard Worker {
143*e82f7db8SAndroid Build Coastguard Worker return theBag->used;
144*e82f7db8SAndroid Build Coastguard Worker }
145*e82f7db8SAndroid Build Coastguard Worker
146*e82f7db8SAndroid Build Coastguard Worker jboolean
bagEnumerateOver(struct bag * theBag,bagEnumerateFunction func,void * arg)147*e82f7db8SAndroid Build Coastguard Worker bagEnumerateOver(struct bag *theBag, bagEnumerateFunction func, void *arg)
148*e82f7db8SAndroid Build Coastguard Worker {
149*e82f7db8SAndroid Build Coastguard Worker char *items = theBag->items;
150*e82f7db8SAndroid Build Coastguard Worker int itemSize = theBag->itemSize;
151*e82f7db8SAndroid Build Coastguard Worker char *itemsEnd = items + (itemSize * theBag->used);
152*e82f7db8SAndroid Build Coastguard Worker
153*e82f7db8SAndroid Build Coastguard Worker for (; items < itemsEnd; items += itemSize) {
154*e82f7db8SAndroid Build Coastguard Worker if (!(func)((void *)items, arg)) {
155*e82f7db8SAndroid Build Coastguard Worker return JNI_FALSE;
156*e82f7db8SAndroid Build Coastguard Worker }
157*e82f7db8SAndroid Build Coastguard Worker }
158*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
159*e82f7db8SAndroid Build Coastguard Worker }
160