]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/tools/build/src/engine/boehm_gc/new_hblk.c
2 * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
3 * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
4 * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved.
6 * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
7 * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
9 * Permission is hereby granted to use or copy this program
10 * for any purpose, provided the above notices are retained on all copies.
11 * Permission to modify the code and to distribute modified code is granted,
12 * provided the above notices are retained, and a notice that the code was
13 * modified is included with the above copyright notice.
15 * This file contains the functions:
16 * ptr_t GC_build_flXXX(h, old_fl)
17 * void GC_new_hblk(size)
19 /* Boehm, May 19, 1994 2:09 pm PDT */
23 # include "private/gc_priv.h"
27 * Build a free list for size 2 (words) cleared objects inside hblk h.
28 * Set the last link to
29 * be ofl. Return a pointer tpo the first free list entry.
31 ptr_t
GC_build_fl_clear2(struct hblk
*h
, ptr_t ofl
)
33 word
* p
= (word
*)(h
-> hb_body
);
34 word
* lim
= (word
*)(h
+ 1);
41 for (; p
< lim
; p
+= 4) {
50 /* The same for size 4 cleared objects */
51 ptr_t
GC_build_fl_clear4(struct hblk
*h
, ptr_t ofl
)
53 word
* p
= (word
*)(h
-> hb_body
);
54 word
* lim
= (word
*)(h
+ 1);
61 for (; p
< lim
; p
+= 4) {
62 PREFETCH_FOR_WRITE((ptr_t
)(p
+64));
70 /* The same for size 2 uncleared objects */
71 ptr_t
GC_build_fl2(struct hblk
*h
, ptr_t ofl
)
73 word
* p
= (word
*)(h
-> hb_body
);
74 word
* lim
= (word
*)(h
+ 1);
79 for (; p
< lim
; p
+= 4) {
86 /* The same for size 4 uncleared objects */
87 ptr_t
GC_build_fl4(struct hblk
*h
, ptr_t ofl
)
89 word
* p
= (word
*)(h
-> hb_body
);
90 word
* lim
= (word
*)(h
+ 1);
95 for (; p
< lim
; p
+= 8) {
96 PREFETCH_FOR_WRITE((ptr_t
)(p
+64));
100 return((ptr_t
)(p
-4));
103 #endif /* !SMALL_CONFIG */
106 /* Build a free list for objects of size sz inside heap block h. */
107 /* Clear objects inside h if clear is set. Add list to the end of */
108 /* the free list we build. Return the new free list. */
109 /* This could be called without the main GC lock, if we ensure that */
110 /* there is no concurrent collection which might reclaim objects that */
111 /* we have not yet allocated. */
112 ptr_t
GC_build_fl(struct hblk
*h
, size_t sz
, GC_bool clear
, ptr_t list
)
115 word
*last_object
; /* points to last object in new hblk */
117 /* Do a few prefetches here, just because its cheap. */
118 /* If we were more serious about it, these should go inside */
119 /* the loops. But write prefetches usually don't seem to */
121 PREFETCH_FOR_WRITE((ptr_t
)h
);
122 PREFETCH_FOR_WRITE((ptr_t
)h
+ 128);
123 PREFETCH_FOR_WRITE((ptr_t
)h
+ 256);
124 PREFETCH_FOR_WRITE((ptr_t
)h
+ 378);
125 /* Handle small objects sizes more efficiently. For larger objects */
126 /* the difference is less significant. */
127 # ifndef SMALL_CONFIG
130 return GC_build_fl_clear2(h
, list
);
132 return GC_build_fl2(h
, list
);
135 return GC_build_fl_clear4(h
, list
);
137 return GC_build_fl4(h
, list
);
142 # endif /* !SMALL_CONFIG */
144 /* Clear the page if necessary. */
145 if (clear
) BZERO(h
, HBLKSIZE
);
147 /* Add objects to free list */
148 p
= (word
*)(h
-> hb_body
) + sz
; /* second object in *h */
149 prev
= (word
*)(h
-> hb_body
); /* One object behind p */
150 last_object
= (word
*)((char *)h
+ HBLKSIZE
);
152 /* Last place for last object to start */
154 /* make a list of all objects in *h with head as last object */
155 while (p
<= last_object
) {
156 /* current object's link points to last object */
157 obj_link(p
) = (ptr_t
)prev
;
161 p
-= sz
; /* p now points to last object */
164 * put p (which is now head of list of objects in *h) as first
165 * pointer in the appropriate free list for this size.
167 obj_link(h
-> hb_body
) = list
;
173 * Allocate a new heapblock for small objects of size gran granules.
174 * Add all of the heapblock's objects to the free list for objects
176 * Set all mark bits if objects are uncollectable.
177 * Will fail to do anything if we are out of memory.
179 void GC_new_hblk(size_t gran
, int kind
)
181 struct hblk
*h
; /* the new heap block */
182 GC_bool clear
= GC_obj_kinds
[kind
].ok_init
;
184 /* Ignore gcc "no effect" warning on the following: */
185 GC_STATIC_ASSERT((sizeof (struct hblk
)) == HBLKSIZE
);
187 if (GC_debugging_started
) clear
= TRUE
;
189 /* Allocate a new heap block */
190 h
= GC_allochblk(GRANULES_TO_BYTES(gran
), kind
, 0);
193 /* Mark all objects if appropriate. */
194 if (IS_UNCOLLECTABLE(kind
)) GC_set_hdr_marks(HDR(h
));
196 /* Build the free list */
197 GC_obj_kinds
[kind
].ok_freelist
[gran
] =
198 GC_build_fl(h
, GRANULES_TO_WORDS(gran
), clear
,
199 GC_obj_kinds
[kind
].ok_freelist
[gran
]);