228 : CodeBlob(name, cb, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, 0, NULL) 229 {} 230 231 BufferBlob* BufferBlob::create(const char* name, CodeBuffer* cb) { 232 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock 233 234 BufferBlob* blob = NULL; 235 unsigned int size = allocation_size(cb, sizeof(BufferBlob)); 236 assert(name != NULL, "must provide a name"); 237 { 238 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 239 blob = new (size) BufferBlob(name, size, cb); 240 } 241 // Track memory usage statistic after releasing CodeCache_lock 242 MemoryService::track_code_cache_memory_usage(); 243 244 return blob; 245 } 246 247 248 void* BufferBlob::operator new(size_t s, unsigned size) throw() { 249 void* p = CodeCache::allocate(size); 250 return p; 251 } 252 253 254 void BufferBlob::free( BufferBlob *blob ) { 255 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock 256 { 257 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 258 CodeCache::free((CodeBlob*)blob); 259 } 260 // Track memory usage statistic after releasing CodeCache_lock 261 MemoryService::track_code_cache_memory_usage(); 262 } 263 264 265 //---------------------------------------------------------------------------------------------------- 266 // Implementation of AdapterBlob 267 268 AdapterBlob::AdapterBlob(int size, CodeBuffer* cb) : 269 BufferBlob("I2C/C2I adapters", size, cb) { 270 CodeCache::commit(this); 271 } 272 273 AdapterBlob* AdapterBlob::create(CodeBuffer* cb) { 274 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock 275 276 AdapterBlob* blob = NULL; 277 unsigned int size = allocation_size(cb, sizeof(AdapterBlob)); 278 { 279 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 280 blob = new (size) AdapterBlob(size, cb); 281 } 282 // Track memory usage statistic after releasing CodeCache_lock 283 MemoryService::track_code_cache_memory_usage(); 284 285 return blob; 286 } 287 288 289 //---------------------------------------------------------------------------------------------------- 290 // Implementation of MethodHandlesAdapterBlob 291 292 MethodHandlesAdapterBlob* MethodHandlesAdapterBlob::create(int buffer_size) { 293 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock 294 295 MethodHandlesAdapterBlob* blob = NULL; 296 unsigned int size = sizeof(MethodHandlesAdapterBlob); 297 // align the size to CodeEntryAlignment 298 size = align_code_offset(size); 299 size += round_to(buffer_size, oopSize); 300 { 301 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 302 blob = new (size) MethodHandlesAdapterBlob(size); 303 } 304 // Track memory usage statistic after releasing CodeCache_lock 305 MemoryService::track_code_cache_memory_usage(); 306 307 return blob; 308 } 309 310 311 //---------------------------------------------------------------------------------------------------- 312 // Implementation of RuntimeStub 313 314 RuntimeStub::RuntimeStub( 315 const char* name, 316 CodeBuffer* cb, 317 int size, 318 int frame_complete, 319 int frame_size, 320 OopMapSet* oop_maps, 321 bool caller_must_gc_arguments 322 ) | 228 : CodeBlob(name, cb, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, 0, NULL) 229 {} 230 231 BufferBlob* BufferBlob::create(const char* name, CodeBuffer* cb) { 232 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock 233 234 BufferBlob* blob = NULL; 235 unsigned int size = allocation_size(cb, sizeof(BufferBlob)); 236 assert(name != NULL, "must provide a name"); 237 { 238 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 239 blob = new (size) BufferBlob(name, size, cb); 240 } 241 // Track memory usage statistic after releasing CodeCache_lock 242 MemoryService::track_code_cache_memory_usage(); 243 244 return blob; 245 } 246 247 248 void* BufferBlob::operator new(size_t s, unsigned size, bool is_critical) throw() { 249 void* p = CodeCache::allocate(size, is_critical); 250 return p; 251 } 252 253 254 void BufferBlob::free( BufferBlob *blob ) { 255 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock 256 { 257 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 258 CodeCache::free((CodeBlob*)blob); 259 } 260 // Track memory usage statistic after releasing CodeCache_lock 261 MemoryService::track_code_cache_memory_usage(); 262 } 263 264 265 //---------------------------------------------------------------------------------------------------- 266 // Implementation of AdapterBlob 267 268 AdapterBlob::AdapterBlob(int size, CodeBuffer* cb) : 269 BufferBlob("I2C/C2I adapters", size, cb) { 270 CodeCache::commit(this); 271 } 272 273 AdapterBlob* AdapterBlob::create(CodeBuffer* cb) { 274 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock 275 276 AdapterBlob* blob = NULL; 277 unsigned int size = allocation_size(cb, sizeof(AdapterBlob)); 278 { 279 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 280 // The parameter 'true' indicates a critical memory allocation. 281 // This means that CodeCacheMinimumFreeSpace is used, if necessary 282 blob = new (size, true) AdapterBlob(size, cb); 283 } 284 // Track memory usage statistic after releasing CodeCache_lock 285 MemoryService::track_code_cache_memory_usage(); 286 287 return blob; 288 } 289 290 291 //---------------------------------------------------------------------------------------------------- 292 // Implementation of MethodHandlesAdapterBlob 293 294 MethodHandlesAdapterBlob* MethodHandlesAdapterBlob::create(int buffer_size) { 295 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock 296 297 MethodHandlesAdapterBlob* blob = NULL; 298 unsigned int size = sizeof(MethodHandlesAdapterBlob); 299 // align the size to CodeEntryAlignment 300 size = align_code_offset(size); 301 size += round_to(buffer_size, oopSize); 302 { 303 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 304 // The parameter 'true' indicates a critical memory allocation. 305 // This means that CodeCacheMinimumFreeSpace is used, if necessary 306 blob = new (size, true) MethodHandlesAdapterBlob(size); 307 } 308 // Track memory usage statistic after releasing CodeCache_lock 309 MemoryService::track_code_cache_memory_usage(); 310 311 return blob; 312 } 313 314 315 //---------------------------------------------------------------------------------------------------- 316 // Implementation of RuntimeStub 317 318 RuntimeStub::RuntimeStub( 319 const char* name, 320 CodeBuffer* cb, 321 int size, 322 int frame_complete, 323 int frame_size, 324 OopMapSet* oop_maps, 325 bool caller_must_gc_arguments 326 ) |