1 /*
2 * Copyright (c) 1998, 2007, 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
25 class BasicLock VALUE_OBJ_CLASS_SPEC {
26 friend class VMStructs;
27 private:
28 volatile markOop _displaced_header;
29 public:
30 markOop displaced_header() const { return _displaced_header; }
31 void set_displaced_header(markOop header) { _displaced_header = header; }
32
33 void print_on(outputStream* st) const;
34
35 // move a basic lock (used during deoptimization
36 void move_to(oop obj, BasicLock* dest);
37
38 static int displaced_header_offset_in_bytes() { return offset_of(BasicLock, _displaced_header); }
39 };
40
41 // A BasicObjectLock associates a specific Java object with a BasicLock.
42 // It is currently embedded in an interpreter frame.
43
44 // Because some machines have alignment restrictions on the control stack,
205 // requires flag based choice of locking the classloader lock.
206 class ObjectLocker : public StackObj {
207 private:
208 Thread* _thread;
209 Handle _obj;
210 BasicLock _lock;
211 bool _dolock; // default true
212 public:
213 ObjectLocker(Handle obj, Thread* thread, bool doLock = true);
214 ~ObjectLocker();
215
216 // Monitor behavior
217 void wait (TRAPS) { ObjectSynchronizer::wait (_obj, 0, CHECK); } // wait forever
218 void notify_all(TRAPS) { ObjectSynchronizer::notifyall(_obj, CHECK); }
219 void waitUninterruptibly (TRAPS) { ObjectSynchronizer::waitUninterruptibly (_obj, 0, CHECK);}
220 // complete_exit gives up lock completely, returning recursion count
221 // reenter reclaims lock with original recursion count
222 intptr_t complete_exit(TRAPS) { return ObjectSynchronizer::complete_exit(_obj, CHECK_0); }
223 void reenter(intptr_t recursion, TRAPS) { ObjectSynchronizer::reenter(_obj, recursion, CHECK); }
224 };
|
1 /*
2 * Copyright (c) 1998, 2010, 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
25 #ifndef SHARE_VM_RUNTIME_SYNCHRONIZER_HPP
26 #define SHARE_VM_RUNTIME_SYNCHRONIZER_HPP
27
28 #include "oops/markOop.hpp"
29 #include "runtime/handles.hpp"
30 #include "runtime/perfData.hpp"
31 #include "utilities/top.hpp"
32
33 class BasicLock VALUE_OBJ_CLASS_SPEC {
34 friend class VMStructs;
35 private:
36 volatile markOop _displaced_header;
37 public:
38 markOop displaced_header() const { return _displaced_header; }
39 void set_displaced_header(markOop header) { _displaced_header = header; }
40
41 void print_on(outputStream* st) const;
42
43 // move a basic lock (used during deoptimization
44 void move_to(oop obj, BasicLock* dest);
45
46 static int displaced_header_offset_in_bytes() { return offset_of(BasicLock, _displaced_header); }
47 };
48
49 // A BasicObjectLock associates a specific Java object with a BasicLock.
50 // It is currently embedded in an interpreter frame.
51
52 // Because some machines have alignment restrictions on the control stack,
213 // requires flag based choice of locking the classloader lock.
214 class ObjectLocker : public StackObj {
215 private:
216 Thread* _thread;
217 Handle _obj;
218 BasicLock _lock;
219 bool _dolock; // default true
220 public:
221 ObjectLocker(Handle obj, Thread* thread, bool doLock = true);
222 ~ObjectLocker();
223
224 // Monitor behavior
225 void wait (TRAPS) { ObjectSynchronizer::wait (_obj, 0, CHECK); } // wait forever
226 void notify_all(TRAPS) { ObjectSynchronizer::notifyall(_obj, CHECK); }
227 void waitUninterruptibly (TRAPS) { ObjectSynchronizer::waitUninterruptibly (_obj, 0, CHECK);}
228 // complete_exit gives up lock completely, returning recursion count
229 // reenter reclaims lock with original recursion count
230 intptr_t complete_exit(TRAPS) { return ObjectSynchronizer::complete_exit(_obj, CHECK_0); }
231 void reenter(intptr_t recursion, TRAPS) { ObjectSynchronizer::reenter(_obj, recursion, CHECK); }
232 };
233
234 #endif // SHARE_VM_RUNTIME_SYNCHRONIZER_HPP
|