Skip to content
This repository has been archived by the owner on Nov 3, 2021. It is now read-only.

Commit

Permalink
am f59a4b3: fix scheduling policy service death detection
Browse files Browse the repository at this point in the history
* commit 'f59a4b393f4844c5bbc8d6212364bdddea33d232':
  fix scheduling policy service death detection
  • Loading branch information
Eric Laurent authored and Android Git Automerger committed Jul 3, 2013
2 parents f64bd47 + f59a4b3 commit ace2378
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 13 deletions.
16 changes: 12 additions & 4 deletions services/audioflinger/ISchedulingPolicyService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

#define LOG_TAG "SchedulingPolicyService"
#define LOG_TAG "ISchedulingPolicyService"
//#define LOG_NDEBUG 0

#include <binder/Parcel.h>
Expand Down Expand Up @@ -45,9 +45,17 @@ class BpSchedulingPolicyService : public BpInterface<ISchedulingPolicyService>
data.writeInt32(tid);
data.writeInt32(prio);
uint32_t flags = asynchronous ? IBinder::FLAG_ONEWAY : 0;
remote()->transact(REQUEST_PRIORITY_TRANSACTION, data, &reply, flags);
// fail on exception
if (reply.readExceptionCode() != 0) return -1;
status_t status = remote()->transact(REQUEST_PRIORITY_TRANSACTION, data, &reply, flags);
if (status != NO_ERROR) {
return status;
}
if (asynchronous) {
return NO_ERROR;
}
// fail on exception: force binder reconnection
if (reply.readExceptionCode() != 0) {
return DEAD_OBJECT;
}
return reply.readInt32();
}
};
Expand Down
28 changes: 19 additions & 9 deletions services/audioflinger/SchedulingPolicyService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
* limitations under the License.
*/

#define LOG_TAG "SchedulingPolicyService"
//#define LOG_NDEBUG 0

#include <binder/IServiceManager.h>
#include <utils/Mutex.h>
#include "ISchedulingPolicyService.h"
Expand All @@ -28,25 +31,32 @@ static Mutex sMutex;
int requestPriority(pid_t pid, pid_t tid, int32_t prio, bool asynchronous)
{
// FIXME merge duplicated code related to service lookup, caching, and error recovery
sp<ISchedulingPolicyService> sps;
int ret;
for (;;) {
sMutex.lock();
sps = sSchedulingPolicyService;
sp<ISchedulingPolicyService> sps = sSchedulingPolicyService;
sMutex.unlock();
if (sps != 0) {
break;
}
sp<IBinder> binder = defaultServiceManager()->checkService(_scheduling_policy);
if (binder != 0) {
if (sps == 0) {
sp<IBinder> binder = defaultServiceManager()->checkService(_scheduling_policy);
if (binder == 0) {
sleep(1);
continue;
}
sps = interface_cast<ISchedulingPolicyService>(binder);
sMutex.lock();
sSchedulingPolicyService = sps;
sMutex.unlock();
}
ret = sps->requestPriority(pid, tid, prio, asynchronous);
if (ret != DEAD_OBJECT) {
break;
}
sleep(1);
ALOGW("SchedulingPolicyService died");
sMutex.lock();
sSchedulingPolicyService.clear();
sMutex.unlock();
}
return sps->requestPriority(pid, tid, prio, asynchronous);
return ret;
}

} // namespace android

0 comments on commit ace2378

Please sign in to comment.