/* * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. * */ #include "precompiled.hpp" #include "runtime/orderAccess.hpp" #include "runtime/stubRoutines.hpp" #include "runtime/thread.hpp" void OrderAccess::StubRoutines_fence() { // Use a stub if it exists. It may not exist during bootstrap so do // nothing in that case but assert if no fence code exists after threads have been created void (*func)() = CAST_TO_FN_PTR(void (*)(), StubRoutines::fence_entry()); if (func != NULL) { (*func)(); return; } assert(Threads::number_of_threads() == 0, "for bootstrap only"); } void OrderAccess::general_global_fence() { Thread *thread = Thread::current(); volatile int *serialization_page = (volatile int*)thread->get_serialization_page(); *serialization_page = 0; os::protect_memory((char *)serialization_page, os::vm_page_size(), os::MEM_PROT_READ); os::protect_memory((char *)serialization_page, os::vm_page_size(), os::MEM_PROT_RW); }