1 /* 2 * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 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 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 #include "precompiled.hpp" 25 #include "classfile/vmClasses.hpp" 26 #include "memory/resourceArea.hpp" 27 #include "memory/universe.hpp" 28 #include "oops/instanceKlass.hpp" 29 #include "oops/oop.inline.hpp" 30 #include "runtime/atomic.hpp" 31 #include "runtime/interfaceSupport.inline.hpp" 32 #include "runtime/orderAccess.hpp" 33 #include "runtime/os.hpp" 34 #include "runtime/semaphore.inline.hpp" 35 #include "runtime/synchronizer.hpp" 36 #include "threadHelper.inline.hpp" 37 #include "unittest.hpp" 38 #include "utilities/globalDefinitions.hpp" 39 #include "utilities/ostream.hpp" 40 41 // The test doesn't work for PRODUCT because it needs WizardMode 42 #ifndef PRODUCT 43 44 static void assert_test_pattern(Handle object, const char* pattern) { 45 stringStream st; 46 object->print_on(&st); 47 ASSERT_THAT(st.base(), testing::HasSubstr(pattern)); 48 } 49 50 class LockerThread : public JavaTestThread { 51 oop _obj; 52 public: 53 LockerThread(Semaphore* post, oop obj) : JavaTestThread(post), _obj(obj) {} 54 virtual ~LockerThread() {} 55 56 void main_run() { 57 JavaThread* THREAD = JavaThread::current(); 58 HandleMark hm(THREAD); 59 Handle h_obj(THREAD, _obj); 60 ResourceMark rm(THREAD); 61 62 // Wait gets the lock inflated. 63 // The object will stay locked for the context of 'ol' so the lock will 64 // still be inflated after the notify_all() call. Deflation can't happen 65 // while an ObjectMonitor is "busy" and being locked is the most "busy" 66 // state we have... 67 ObjectLocker ol(h_obj, THREAD); 68 ol.notify_all(THREAD); 69 assert_test_pattern(h_obj, "monitor"); 70 } 71 }; 72 73 74 TEST_VM(markWord, printing) { 75 JavaThread* THREAD = JavaThread::current(); 76 ThreadInVMfromNative invm(THREAD); 77 ResourceMark rm(THREAD); 78 79 oop obj = vmClasses::Byte_klass()->allocate_instance(THREAD); 80 81 FlagSetting fs(WizardMode, true); 82 83 HandleMark hm(THREAD); 84 Handle h_obj(THREAD, obj); 85 86 // Thread tries to lock it. 87 { 88 ObjectLocker ol(h_obj, THREAD); 89 assert_test_pattern(h_obj, "locked"); 90 } 91 assert_test_pattern(h_obj, "is_unlocked no_hash"); 92 93 // Hash the object then print it. 94 intx hash = h_obj->identity_hash(); 95 assert_test_pattern(h_obj, "is_unlocked hash=0x"); 96 97 // Wait gets the lock inflated. 98 { 99 ObjectLocker ol(h_obj, THREAD); 100 101 Semaphore done(0); 102 LockerThread* st; 103 st = new LockerThread(&done, h_obj()); 104 st->doit(); 105 106 ol.wait(THREAD); 107 assert_test_pattern(h_obj, "monitor"); 108 done.wait_with_safepoint_check(THREAD); // wait till the thread is done. 109 } 110 } 111 #endif // PRODUCT