38 #include <sys/types.h>
39 #include <sys/syscall.h>
41 #include <sys/resource.h>
43 namespace rp{
namespace hal{
50 assert(
sizeof(newborn.
_handle) >=
sizeof(pthread_t));
52 pthread_create((pthread_t *)&newborn.
_handle, NULL, (
void * (*)(
void *))proc,
data);
67 pid_t selfTid = syscall(SYS_gettid);
70 int current_policy = SCHED_OTHER;
71 struct sched_param current_param;
75 if (sched_getparam(selfTid, ¤t_param))
81 int pthread_priority_min;
84 pthread_priority_min = sched_get_priority_min(SCHED_RR);
86 pthread_priority_min = 1;
88 int pthread_priority = 0 ;
94 current_policy = SCHED_RR;
95 pthread_priority = pthread_priority_min + 1;
100 current_policy = SCHED_RR;
101 pthread_priority = pthread_priority_min;
105 pthread_priority = 0;
106 current_policy = SCHED_OTHER;
110 pthread_priority = 0;
111 current_policy = SCHED_OTHER;
115 pthread_priority = 0;
116 current_policy = SCHED_IDLE;
121 current_policy |= SCHED_RESET_ON_FORK;
123 current_param.__sched_priority = pthread_priority;
129 if ( (ans = sched_setscheduler(selfTid, current_policy , ¤t_param)) )
139 if ((current_policy == SCHED_OTHER) || (current_policy == SCHED_BATCH))
141 if (setpriority(PRIO_PROCESS, selfTid, nice)) {
155 struct sched_param current_param;
156 if (pthread_getschedparam( (pthread_t) this->
_handle, ¤t_policy, ¤t_param))
162 int pthread_priority_max = sched_get_priority_max(SCHED_RR);
163 int pthread_priority_min = sched_get_priority_min(SCHED_RR);
165 if (current_param.__sched_priority ==(pthread_priority_max ))
169 if (current_param.__sched_priority >=(pthread_priority_max + pthread_priority_min)/2)
180 pthread_join((pthread_t)(this->
_handle), NULL);