Enable normal user to create a thread for the service

Default scheduling policy for a service thread is
a real time SCHED_RR which requires superuser privilege
to be set.
To allow for creating task when invoked by normal user
on Linux, apply policy depending on root or not root.

Signed-off-by: Zbigniew Bodek <zbigniew.bodek@huawei.com>
Change-Id: Ia0bdf9c3225e118b662f817c5d53c93092a33348
This commit is contained in:
Zbigniew Bodek 2020-12-08 02:35:01 +08:00
parent 996939cacc
commit a6456b24ed
1 changed files with 14 additions and 1 deletions

View File

@ -73,10 +73,23 @@ ThreadId THREAD_Create(Runnable run, void *argv, const ThreadAttr *attr)
pthread_attr_setinheritsched(&threadAttr, PTHREAD_EXPLICIT_SCHED);
#ifdef SAMGR_LINUX_ADAPTER
struct sched_param sched = {attr->priority};
int policy = SCHED_OTHER;
const int ROOT_UID = 0;
if (geteuid() == ROOT_UID) {
/*
* Real-time scheduling policy requires superuser privileges.
* Note: additionally, real-time thread can be scheduled before
* normal thread even if it yields CPU using sched_yield().
* To actually yield real-time thread one could
* sleep() rather than yield().
*/
policy = SCHED_RR;
}
#else
struct sched_param sched = {PRI_BUTT - attr->priority};
int policy = SCHED_RR;
#endif
pthread_attr_setschedpolicy(&threadAttr, SCHED_RR);
pthread_attr_setschedpolicy(&threadAttr, policy);
pthread_attr_setschedparam(&threadAttr, &sched);
(void) pthread_once(&g_localKeyOnce, KeyCreate);
pthread_t threadId = 0;