diff options
author | Yoann Lopes <yoann.lopes@digia.com> | 2013-06-24 15:32:46 +0200 |
---|---|---|
committer | Eirik Aavitsland <eirik.aavitsland@digia.com> | 2013-08-28 10:33:39 +0300 |
commit | f2228b12e4e4c8a39b9ae242e98c2dc7173f346c (patch) | |
tree | 796373e122aacc3d9e94c5b9af0fb9a572ad4ce9 /src/doppelganger/schedulingpolicyservice.cpp | |
parent | 1862fdee4f25fa0a4c57bcec8ea8568a8d9c4762 (diff) |
Added 'doppelganger' daemon.
It provides the Android permission and scheduling policy services.
These services are normally provided by Zygote.
Change-Id: I11eeba92b6b12e26b45baa5871a6fd7c2058b6c6
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@digia.com>
Diffstat (limited to 'src/doppelganger/schedulingpolicyservice.cpp')
-rw-r--r-- | src/doppelganger/schedulingpolicyservice.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/doppelganger/schedulingpolicyservice.cpp b/src/doppelganger/schedulingpolicyservice.cpp new file mode 100644 index 0000000..641ddc4 --- /dev/null +++ b/src/doppelganger/schedulingpolicyservice.cpp @@ -0,0 +1,61 @@ +#include "schedulingpolicyservice.h" + +#include <binder/IServiceManager.h> +#include <binder/IPCThreadState.h> +#include <cutils/sched_policy.h> +#include <sched.h> + +using namespace android; + +enum { + REQUEST_PRIORITY_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION +}; + +#define PRIORITY_MIN 1 +#define PRIORITY_MAX 2 + +SchedulingPolicyService::SchedulingPolicyService() +{ +} + +void SchedulingPolicyService::instantiate() +{ + defaultServiceManager()->addService(String16("scheduling_policy"), new SchedulingPolicyService); +} + +status_t SchedulingPolicyService::onTransact(uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) +{ + switch (code) { + case REQUEST_PRIORITY_TRANSACTION: { + CHECK_INTERFACE(ISchedulingPolicyService, data, reply); + int32_t pid = data.readInt32(); + int32_t tid = data.readInt32(); + int32_t prio = data.readInt32(); + int res = requestPriority(pid, tid, prio); + reply->writeNoException(); + reply->writeInt32(res); + return NO_ERROR; + } break; + default: + return BBinder::onTransact(code, data, reply, flags); + } +} + +int SchedulingPolicyService::requestPriority(int32_t pid, int32_t tid, int32_t prio) +{ + if (prio < PRIORITY_MIN || prio > PRIORITY_MAX) + return PERMISSION_DENIED; + + int res = set_sched_policy(tid, IPCThreadState::self()->getCallingPid() == pid ? SP_AUDIO_SYS + : SP_AUDIO_APP); + if (res != NO_ERROR) + return PERMISSION_DENIED; + + struct sched_param param; + param.sched_priority = prio; + res = sched_setscheduler(tid, SCHED_FIFO, ¶m); + if (res) + return PERMISSION_DENIED; + + return OK; +} |