equal
deleted
inserted
replaced
1 /* |
1 /* |
2 * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
568 Thread* t = Thread::current(); |
568 Thread* t = Thread::current(); |
569 |
569 |
570 if (!t->is_VM_thread()) { |
570 if (!t->is_VM_thread()) { |
571 SkipGCALot sgcalot(t); // avoid re-entrant attempts to gc-a-lot |
571 SkipGCALot sgcalot(t); // avoid re-entrant attempts to gc-a-lot |
572 // JavaThread or WatcherThread |
572 // JavaThread or WatcherThread |
573 t->check_for_valid_safepoint_state(true); |
573 bool concurrent = op->evaluate_concurrently(); |
|
574 // only blocking VM operations need to verify the caller's safepoint state: |
|
575 if (!concurrent) { |
|
576 t->check_for_valid_safepoint_state(true); |
|
577 } |
574 |
578 |
575 // New request from Java thread, evaluate prologue |
579 // New request from Java thread, evaluate prologue |
576 if (!op->doit_prologue()) { |
580 if (!op->doit_prologue()) { |
577 return; // op was cancelled |
581 return; // op was cancelled |
578 } |
582 } |
580 // Setup VM_operations for execution |
584 // Setup VM_operations for execution |
581 op->set_calling_thread(t, Thread::get_priority(t)); |
585 op->set_calling_thread(t, Thread::get_priority(t)); |
582 |
586 |
583 // It does not make sense to execute the epilogue, if the VM operation object is getting |
587 // It does not make sense to execute the epilogue, if the VM operation object is getting |
584 // deallocated by the VM thread. |
588 // deallocated by the VM thread. |
585 bool concurrent = op->evaluate_concurrently(); |
|
586 bool execute_epilog = !op->is_cheap_allocated(); |
589 bool execute_epilog = !op->is_cheap_allocated(); |
587 assert(!concurrent || op->is_cheap_allocated(), "concurrent => cheap_allocated"); |
590 assert(!concurrent || op->is_cheap_allocated(), "concurrent => cheap_allocated"); |
588 |
591 |
589 // Get ticket number for non-concurrent VM operations |
592 // Get ticket number for non-concurrent VM operations |
590 int ticket = 0; |
593 int ticket = 0; |