Mercurial > hg > graal-jvmci-8
comparison src/os/linux/vm/os_linux.hpp @ 14422:2b8e28fdf503
Merge
author | kvn |
---|---|
date | Tue, 05 Nov 2013 17:38:04 -0800 |
parents | 2e6938dd68f2 |
children | b0133e4187d3 6c9332549827 |
comparison
equal
deleted
inserted
replaced
14421:3068270ba476 | 14422:2b8e28fdf503 |
---|---|
219 return _supports_fast_thread_cpu_time; | 219 return _supports_fast_thread_cpu_time; |
220 } | 220 } |
221 | 221 |
222 static jlong fast_thread_cpu_time(clockid_t clockid); | 222 static jlong fast_thread_cpu_time(clockid_t clockid); |
223 | 223 |
224 // pthread_cond clock suppport | |
225 private: | |
226 static pthread_condattr_t _condattr[1]; | |
227 | |
228 public: | |
229 static pthread_condattr_t* condAttr() { return _condattr; } | |
230 | |
224 // Stack repair handling | 231 // Stack repair handling |
225 | 232 |
226 // none present | 233 // none present |
227 | 234 |
228 // LinuxThreads work-around for 6292965 | 235 // LinuxThreads work-around for 6292965 |
233 typedef int (*numa_node_to_cpus_func_t)(int node, unsigned long *buffer, int bufferlen); | 240 typedef int (*numa_node_to_cpus_func_t)(int node, unsigned long *buffer, int bufferlen); |
234 typedef int (*numa_max_node_func_t)(void); | 241 typedef int (*numa_max_node_func_t)(void); |
235 typedef int (*numa_available_func_t)(void); | 242 typedef int (*numa_available_func_t)(void); |
236 typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node); | 243 typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node); |
237 typedef void (*numa_interleave_memory_func_t)(void *start, size_t size, unsigned long *nodemask); | 244 typedef void (*numa_interleave_memory_func_t)(void *start, size_t size, unsigned long *nodemask); |
245 typedef void (*numa_set_bind_policy_func_t)(int policy); | |
238 | 246 |
239 static sched_getcpu_func_t _sched_getcpu; | 247 static sched_getcpu_func_t _sched_getcpu; |
240 static numa_node_to_cpus_func_t _numa_node_to_cpus; | 248 static numa_node_to_cpus_func_t _numa_node_to_cpus; |
241 static numa_max_node_func_t _numa_max_node; | 249 static numa_max_node_func_t _numa_max_node; |
242 static numa_available_func_t _numa_available; | 250 static numa_available_func_t _numa_available; |
243 static numa_tonode_memory_func_t _numa_tonode_memory; | 251 static numa_tonode_memory_func_t _numa_tonode_memory; |
244 static numa_interleave_memory_func_t _numa_interleave_memory; | 252 static numa_interleave_memory_func_t _numa_interleave_memory; |
253 static numa_set_bind_policy_func_t _numa_set_bind_policy; | |
245 static unsigned long* _numa_all_nodes; | 254 static unsigned long* _numa_all_nodes; |
246 | 255 |
247 static void set_sched_getcpu(sched_getcpu_func_t func) { _sched_getcpu = func; } | 256 static void set_sched_getcpu(sched_getcpu_func_t func) { _sched_getcpu = func; } |
248 static void set_numa_node_to_cpus(numa_node_to_cpus_func_t func) { _numa_node_to_cpus = func; } | 257 static void set_numa_node_to_cpus(numa_node_to_cpus_func_t func) { _numa_node_to_cpus = func; } |
249 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; } | 258 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; } |
250 static void set_numa_available(numa_available_func_t func) { _numa_available = func; } | 259 static void set_numa_available(numa_available_func_t func) { _numa_available = func; } |
251 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; } | 260 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; } |
252 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; } | 261 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; } |
262 static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; } | |
253 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; } | 263 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; } |
254 static int sched_getcpu_syscall(void); | 264 static int sched_getcpu_syscall(void); |
255 public: | 265 public: |
256 static int sched_getcpu() { return _sched_getcpu != NULL ? _sched_getcpu() : -1; } | 266 static int sched_getcpu() { return _sched_getcpu != NULL ? _sched_getcpu() : -1; } |
257 static int numa_node_to_cpus(int node, unsigned long *buffer, int bufferlen) { | 267 static int numa_node_to_cpus(int node, unsigned long *buffer, int bufferlen) { |
263 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1; | 273 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1; |
264 } | 274 } |
265 static void numa_interleave_memory(void *start, size_t size) { | 275 static void numa_interleave_memory(void *start, size_t size) { |
266 if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) { | 276 if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) { |
267 _numa_interleave_memory(start, size, _numa_all_nodes); | 277 _numa_interleave_memory(start, size, _numa_all_nodes); |
278 } | |
279 } | |
280 static void numa_set_bind_policy(int policy) { | |
281 if (_numa_set_bind_policy != NULL) { | |
282 _numa_set_bind_policy(policy); | |
268 } | 283 } |
269 } | 284 } |
270 static int get_node_by_cpu(int cpu_id); | 285 static int get_node_by_cpu(int cpu_id); |
271 }; | 286 }; |
272 | 287 |
285 ~PlatformEvent() { guarantee (0, "invariant") ; } | 300 ~PlatformEvent() { guarantee (0, "invariant") ; } |
286 | 301 |
287 public: | 302 public: |
288 PlatformEvent() { | 303 PlatformEvent() { |
289 int status; | 304 int status; |
290 status = pthread_cond_init (_cond, NULL); | 305 status = pthread_cond_init (_cond, os::Linux::condAttr()); |
291 assert_status(status == 0, status, "cond_init"); | 306 assert_status(status == 0, status, "cond_init"); |
292 status = pthread_mutex_init (_mutex, NULL); | 307 status = pthread_mutex_init (_mutex, NULL); |
293 assert_status(status == 0, status, "mutex_init"); | 308 assert_status(status == 0, status, "mutex_init"); |
294 _Event = 0 ; | 309 _Event = 0 ; |
295 _nParked = 0 ; | 310 _nParked = 0 ; |
300 void reset() { _Event = 0 ; } | 315 void reset() { _Event = 0 ; } |
301 int fired() { return _Event; } | 316 int fired() { return _Event; } |
302 void park () ; | 317 void park () ; |
303 void unpark () ; | 318 void unpark () ; |
304 int TryPark () ; | 319 int TryPark () ; |
305 int park (jlong millis) ; | 320 int park (jlong millis) ; // relative timed-wait only |
306 void SetAssociation (Thread * a) { _Assoc = a ; } | 321 void SetAssociation (Thread * a) { _Assoc = a ; } |
307 } ; | 322 } ; |
308 | 323 |
309 class PlatformParker : public CHeapObj<mtInternal> { | 324 class PlatformParker : public CHeapObj<mtInternal> { |
310 protected: | 325 protected: |
326 enum { | |
327 REL_INDEX = 0, | |
328 ABS_INDEX = 1 | |
329 }; | |
330 int _cur_index; // which cond is in use: -1, 0, 1 | |
311 pthread_mutex_t _mutex [1] ; | 331 pthread_mutex_t _mutex [1] ; |
312 pthread_cond_t _cond [1] ; | 332 pthread_cond_t _cond [2] ; // one for relative times and one for abs. |
313 | 333 |
314 public: // TODO-FIXME: make dtor private | 334 public: // TODO-FIXME: make dtor private |
315 ~PlatformParker() { guarantee (0, "invariant") ; } | 335 ~PlatformParker() { guarantee (0, "invariant") ; } |
316 | 336 |
317 public: | 337 public: |
318 PlatformParker() { | 338 PlatformParker() { |
319 int status; | 339 int status; |
320 status = pthread_cond_init (_cond, NULL); | 340 status = pthread_cond_init (&_cond[REL_INDEX], os::Linux::condAttr()); |
321 assert_status(status == 0, status, "cond_init"); | 341 assert_status(status == 0, status, "cond_init rel"); |
342 status = pthread_cond_init (&_cond[ABS_INDEX], NULL); | |
343 assert_status(status == 0, status, "cond_init abs"); | |
322 status = pthread_mutex_init (_mutex, NULL); | 344 status = pthread_mutex_init (_mutex, NULL); |
323 assert_status(status == 0, status, "mutex_init"); | 345 assert_status(status == 0, status, "mutex_init"); |
346 _cur_index = -1; // mark as unused | |
324 } | 347 } |
325 }; | 348 }; |
326 | 349 |
327 #endif // OS_LINUX_VM_OS_LINUX_HPP | 350 #endif // OS_LINUX_VM_OS_LINUX_HPP |