234 MemoryService::track_code_cache_memory_usage();
235
236 return blob;
237 }
238
239 void* BufferBlob::operator new(size_t s, unsigned size) throw() {
240 return CodeCache::allocate(size, CodeBlobType::NonNMethod);
241 }
242
243 void BufferBlob::free(BufferBlob *blob) {
244 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
245 blob->flush();
246 {
247 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
248 CodeCache::free((CodeBlob*)blob);
249 }
250 // Track memory usage statistic after releasing CodeCache_lock
251 MemoryService::track_code_cache_memory_usage();
252 }
253
254
255 //----------------------------------------------------------------------------------------------------
256 // Implementation of AdapterBlob
257
258 AdapterBlob::AdapterBlob(int size, CodeBuffer* cb) :
259 BufferBlob("I2C/C2I adapters", size, cb) {
260 CodeCache::commit(this);
261 }
262
263 AdapterBlob* AdapterBlob::create(CodeBuffer* cb) {
264 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
265
266 AdapterBlob* blob = NULL;
267 unsigned int size = allocation_size(cb, sizeof(AdapterBlob));
268 {
269 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
270 blob = new (size) AdapterBlob(size, cb);
271 }
272 // Track memory usage statistic after releasing CodeCache_lock
273 MemoryService::track_code_cache_memory_usage();
274
275 return blob;
276 }
277
278
279 //----------------------------------------------------------------------------------------------------
280 // Implementation of MethodHandlesAdapterBlob
281
282 MethodHandlesAdapterBlob* MethodHandlesAdapterBlob::create(int buffer_size) {
283 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
284
285 MethodHandlesAdapterBlob* blob = NULL;
286 unsigned int size = sizeof(MethodHandlesAdapterBlob);
287 CodeCacheExtensions::size_blob("MethodHandles adapters", &buffer_size);
288 // align the size to CodeEntryAlignment
289 size = align_code_offset(size);
290 size += round_to(buffer_size, oopSize);
|
234 MemoryService::track_code_cache_memory_usage();
235
236 return blob;
237 }
238
239 void* BufferBlob::operator new(size_t s, unsigned size) throw() {
240 return CodeCache::allocate(size, CodeBlobType::NonNMethod);
241 }
242
243 void BufferBlob::free(BufferBlob *blob) {
244 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
245 blob->flush();
246 {
247 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
248 CodeCache::free((CodeBlob*)blob);
249 }
250 // Track memory usage statistic after releasing CodeCache_lock
251 MemoryService::track_code_cache_memory_usage();
252 }
253
254 BufferBlob::BufferBlob(const char* name, int size, CodeBuffer* cb, int frame_complete, int frame_size, OopMapSet* oop_maps)
255 : CodeBlob(name, cb, sizeof(BufferBlob), size, frame_complete, frame_size, oop_maps)
256 {}
257
258
259 //----------------------------------------------------------------------------------------------------
260 // Implementation of AdapterBlob
261
262 AdapterBlob::AdapterBlob(int size, CodeBuffer* cb, int frame_complete, int frame_size, OopMapSet* oop_maps) :
263 BufferBlob("I2C/C2I adapters", size, cb, frame_complete, frame_size, oop_maps) {
264 CodeCache::commit(this);
265 }
266
267 AdapterBlob* AdapterBlob::create(CodeBuffer* cb, int frame_complete, int frame_size, OopMapSet* oop_maps) {
268 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
269
270 AdapterBlob* blob = NULL;
271 unsigned int size = allocation_size(cb, sizeof(AdapterBlob));
272 {
273 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
274 blob = new (size) AdapterBlob(size, cb, frame_complete, frame_size, oop_maps);
275 }
276 // Track memory usage statistic after releasing CodeCache_lock
277 MemoryService::track_code_cache_memory_usage();
278
279 return blob;
280 }
281
282
283 //----------------------------------------------------------------------------------------------------
284 // Implementation of MethodHandlesAdapterBlob
285
286 MethodHandlesAdapterBlob* MethodHandlesAdapterBlob::create(int buffer_size) {
287 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
288
289 MethodHandlesAdapterBlob* blob = NULL;
290 unsigned int size = sizeof(MethodHandlesAdapterBlob);
291 CodeCacheExtensions::size_blob("MethodHandles adapters", &buffer_size);
292 // align the size to CodeEntryAlignment
293 size = align_code_offset(size);
294 size += round_to(buffer_size, oopSize);
|