annotate src/os/solaris/vm/osThread_solaris.hpp @ 4582:b24386206122

Made all vm builds go into subdirectories, even product builds to simplify building the various types of VMs (server, client and graal). Made HotSpot build jobs use the number of CPUs on the host machine.
author Doug Simon <doug.simon@oracle.com>
date Mon, 13 Feb 2012 23:13:37 +0100
parents f95d63e2154a
children de268c8a8075
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1624
diff changeset
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1624
diff changeset
25 #ifndef OS_SOLARIS_VM_OSTHREAD_SOLARIS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1624
diff changeset
26 #define OS_SOLARIS_VM_OSTHREAD_SOLARIS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1624
diff changeset
27
0
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // This is embedded via include into the class OSThread
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 thread_t _thread_id; // Solaris thread id
a61af66fc99e Initial load
duke
parents:
diff changeset
33 unsigned int _lwp_id; // lwp ID, only used with bound threads
a61af66fc99e Initial load
duke
parents:
diff changeset
34 sigset_t _caller_sigmask; // Caller's signal mask
a61af66fc99e Initial load
duke
parents:
diff changeset
35 bool _vm_created_thread; // true if the VM create this thread
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // false if primary thread or attached thread
a61af66fc99e Initial load
duke
parents:
diff changeset
37 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 thread_t thread_id() const { return _thread_id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 unsigned int lwp_id() const { return _lwp_id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // Set and get state of _vm_created_thread flag
a61af66fc99e Initial load
duke
parents:
diff changeset
44 void set_vm_created() { _vm_created_thread = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
45 bool is_vm_created() { return _vm_created_thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // Methods to save/restore caller's signal mask
a61af66fc99e Initial load
duke
parents:
diff changeset
48 sigset_t caller_sigmask() const { return _caller_sigmask; }
a61af66fc99e Initial load
duke
parents:
diff changeset
49 void set_caller_sigmask(sigset_t sigmask) { _caller_sigmask = sigmask; }
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // Used for debugging, return a unique integer for each thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
53 int thread_identifier() const { return _thread_id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
54 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
55 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // On solaris reposition can fail in two ways:
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // 1: a mismatched pc, because signal is delivered too late, target thread
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // is resumed.
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // 2: on a timeout where signal is lost, target thread is resumed.
a61af66fc99e Initial load
duke
parents:
diff changeset
60 bool valid_reposition_failure() {
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // only 1 and 2 can happen and we can handle both of them
a61af66fc99e Initial load
duke
parents:
diff changeset
62 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 }
a61af66fc99e Initial load
duke
parents:
diff changeset
64 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
65 void set_thread_id(thread_t id) { _thread_id = id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
66 void set_lwp_id(unsigned int id){ _lwp_id = id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // ***************************************************************
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // interrupt support. interrupts (using signals) are used to get
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // the thread context (get_thread_pc), to set the thread context
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // (set_thread_pc), and to implement java.lang.Thread.interrupt.
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // ***************************************************************
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 class InterruptArguments : StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
77 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
78 Thread* _thread; // the thread to signal was dispatched to
a61af66fc99e Initial load
duke
parents:
diff changeset
79 ucontext_t* _ucontext; // the machine context at the time of the signal
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
82 InterruptArguments(Thread* thread, ucontext_t* ucontext) {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 _ucontext = ucontext;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 }
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 Thread* thread() const { return _thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
88 ucontext_t* ucontext() const { return _ucontext; }
a61af66fc99e Initial load
duke
parents:
diff changeset
89 };
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // There are currently no asynchronous callbacks - and we'd better not
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // support them in the future either, as they need to be deallocated from
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // the interrupt handler, which is not safe; they also require locks to
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // protect the callback queue.
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 class Sync_Interrupt_Callback : private StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
98 volatile bool _is_done;
a61af66fc99e Initial load
duke
parents:
diff changeset
99 Monitor* _sync;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 Thread* _target;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
102 Sync_Interrupt_Callback(Monitor * sync) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 _is_done = false; _target = NULL; _sync = sync;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 bool is_done() const { return _is_done; }
a61af66fc99e Initial load
duke
parents:
diff changeset
107 Thread* target() const { return _target; }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 int interrupt(Thread * target, int timeout);
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // override to implement the callback.
a61af66fc99e Initial load
duke
parents:
diff changeset
112 virtual void execute(InterruptArguments *args) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 void leave_callback();
a61af66fc99e Initial load
duke
parents:
diff changeset
115 };
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 Sync_Interrupt_Callback * volatile _current_callback;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 callback_in_progress = 1
a61af66fc99e Initial load
duke
parents:
diff changeset
122 };
a61af66fc99e Initial load
duke
parents:
diff changeset
123 Mutex * _current_callback_lock; // only used on v8
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 int set_interrupt_callback (Sync_Interrupt_Callback * cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 void remove_interrupt_callback(Sync_Interrupt_Callback * cb);
1624
726b40449bd2 6939019: Source code adjustments for parfait compilation of hotspot
zgu
parents: 1552
diff changeset
129 void do_interrupt_callbacks_at_interrupt(InterruptArguments *args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // ***************************************************************
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // java.lang.Thread.interrupt state.
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // ***************************************************************
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 JavaThreadState _saved_interrupt_thread_state; // the thread state before a system call -- restored afterward
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 JavaThreadState saved_interrupt_thread_state() { return _saved_interrupt_thread_state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
143 void set_saved_interrupt_thread_state(JavaThreadState state) { _saved_interrupt_thread_state = state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 static void handle_spinlock_contention(int tries); // Used for thread local eden locking
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // ***************************************************************
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Platform dependent initialization and cleanup
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // ***************************************************************
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 void pd_initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void pd_destroy();
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1624
diff changeset
155
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1624
diff changeset
156 #endif // OS_SOLARIS_VM_OSTHREAD_SOLARIS_HPP