51 static size_t _compiler_thread_min_stack_allowed; |
51 static size_t _compiler_thread_min_stack_allowed; |
52 static size_t _java_thread_min_stack_allowed; |
52 static size_t _java_thread_min_stack_allowed; |
53 static size_t _vm_internal_thread_min_stack_allowed; |
53 static size_t _vm_internal_thread_min_stack_allowed; |
54 |
54 |
55 public: |
55 public: |
|
56 static void init(void); // early initialization - no logging available |
|
57 static void init_2(void);// later initialization - logging available |
|
58 |
56 // Return default stack size for the specified thread type |
59 // Return default stack size for the specified thread type |
57 static size_t default_stack_size(os::ThreadType thr_type); |
60 static size_t default_stack_size(os::ThreadType thr_type); |
58 // Check and sets minimum stack sizes |
61 // Check and sets minimum stack sizes |
59 static jint set_minimum_stack_sizes(); |
62 static jint set_minimum_stack_sizes(); |
60 static size_t get_initial_stack_size(ThreadType thr_type, size_t req_stack_size); |
63 static size_t get_initial_stack_size(ThreadType thr_type, size_t req_stack_size); |
100 // is longer than PATH_MAX. |
103 // is longer than PATH_MAX. |
101 // On success, returns 'outbuf', which now contains the path. |
104 // On success, returns 'outbuf', which now contains the path. |
102 // On error, it will return NULL and set errno. The content of 'outbuf' is undefined. |
105 // On error, it will return NULL and set errno. The content of 'outbuf' is undefined. |
103 // On truncation error ('outbuf' too small), it will return NULL and set errno to ENAMETOOLONG. |
106 // On truncation error ('outbuf' too small), it will return NULL and set errno to ENAMETOOLONG. |
104 static char* realpath(const char* filename, char* outbuf, size_t outbuflen); |
107 static char* realpath(const char* filename, char* outbuf, size_t outbuflen); |
105 |
|
106 }; |
108 }; |
107 |
109 |
108 /* |
110 /* |
109 * Crash protection for the watcher thread. Wrap the callback |
111 * Crash protection for the watcher thread. Wrap the callback |
110 * with a sigsetjmp and in case of a SIGSEGV/SIGBUS we siglongjmp |
112 * with a sigsetjmp and in case of a SIGSEGV/SIGBUS we siglongjmp |
123 private: |
125 private: |
124 void restore(); |
126 void restore(); |
125 sigjmp_buf _jmpbuf; |
127 sigjmp_buf _jmpbuf; |
126 }; |
128 }; |
127 |
129 |
|
130 #ifndef SOLARIS |
|
131 |
|
132 /* |
|
133 * This is the platform-specific implementation underpinning |
|
134 * the ParkEvent class, which itself underpins Java-level monitor |
|
135 * operations. See park.hpp for details. |
|
136 * These event objects are type-stable and immortal - we never delete them. |
|
137 * Events are associated with a thread for the lifetime of the thread. |
|
138 */ |
|
139 class PlatformEvent : public CHeapObj<mtInternal> { |
|
140 private: |
|
141 double cachePad[4]; // Increase odds that _mutex is sole occupant of cache line |
|
142 volatile int _event; // Event count/permit: -1, 0 or 1 |
|
143 volatile int _nParked; // Indicates if associated thread is blocked: 0 or 1 |
|
144 pthread_mutex_t _mutex[1]; // Native mutex for locking |
|
145 pthread_cond_t _cond[1]; // Native condition variable for blocking |
|
146 double postPad[2]; |
|
147 |
|
148 protected: // TODO-FIXME: make dtor private |
|
149 ~PlatformEvent() { guarantee(false, "invariant"); } // immortal so can't delete |
|
150 |
|
151 public: |
|
152 PlatformEvent(); |
|
153 void park(); |
|
154 int park(jlong millis); |
|
155 void unpark(); |
|
156 |
|
157 // Use caution with reset() and fired() -- they may require MEMBARs |
|
158 void reset() { _event = 0; } |
|
159 int fired() { return _event; } |
|
160 }; |
|
161 |
|
162 // JSR166 support |
|
163 // PlatformParker provides the platform dependent base class for the |
|
164 // Parker class. It basically provides the internal data structures: |
|
165 // - mutex and convars |
|
166 // which are then used directly by the Parker methods defined in the OS |
|
167 // specific implementation files. |
|
168 // There is significant overlap between the funcionality supported in the |
|
169 // combination of Parker+PlatformParker and PlatformEvent (above). If Parker |
|
170 // were more like ObjectMonitor we could use PlatformEvent in both (with some |
|
171 // API updates of course). But Parker methods use fastpaths that break that |
|
172 // level of encapsulation - so combining the two remains a future project. |
|
173 |
|
174 class PlatformParker : public CHeapObj<mtInternal> { |
|
175 protected: |
|
176 enum { |
|
177 REL_INDEX = 0, |
|
178 ABS_INDEX = 1 |
|
179 }; |
|
180 int _cur_index; // which cond is in use: -1, 0, 1 |
|
181 pthread_mutex_t _mutex[1]; |
|
182 pthread_cond_t _cond[2]; // one for relative times and one for absolute |
|
183 |
|
184 public: // TODO-FIXME: make dtor private |
|
185 ~PlatformParker() { guarantee(false, "invariant"); } |
|
186 |
|
187 public: |
|
188 PlatformParker(); |
|
189 }; |
|
190 |
|
191 #endif // !SOLARIS |
|
192 |
128 #endif // OS_POSIX_VM_OS_POSIX_HPP |
193 #endif // OS_POSIX_VM_OS_POSIX_HPP |