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