blob: 7368064ea31cbc0a31d9472e38a22e520193571e [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "VehicleMonitor"
#include <assert.h>
#include <binder/PermissionCache.h>
#include <utils/Errors.h>
#include <utils/SystemClock.h>
#include "VehicleMonitorService.h"
//#define DBG_VERBOSE
#ifdef DBG_VERBOSE
#define LOG_VERBOSE(x...) ALOGD(x)
#else
#define LOG_VERBOSE(x...)
#endif
namespace android {
const nsecs_t monitorInterval = 15000000000; // 15s
VehicleMonitorMessageHandler::VehicleMonitorMessageHandler(const sp<Looper>& looper,
VehicleMonitorService& service)
: mLooper(looper),
mService(service),
mLastDispatchTime(0) {
mLooper->sendMessageDelayed(monitorInterval, this, Message(COLLECT_DATA));
}
VehicleMonitorMessageHandler::~VehicleMonitorMessageHandler() {
}
void VehicleMonitorMessageHandler::dump(String8& msg) {
msg.appendFormat("mLastDispatchTime:%" PRId64 "\n", mLastDispatchTime);
mProcessMonitor.dump(msg);
}
void VehicleMonitorMessageHandler::doHandleCollectData() {
{
std::lock_guard<std::mutex> autoLock(mLock);
mLastDispatchTime = elapsedRealtime();
mProcessMonitor.process();
}
// TODO: do better timing for sendMessage
mLooper->sendMessageDelayed(monitorInterval, this, Message(COLLECT_DATA));
}
void VehicleMonitorMessageHandler::handleMessage(const Message& message) {
switch (message.what) {
case COLLECT_DATA:
doHandleCollectData();
break;
default:
// TODO?
break;
}
}
// ----------------------------------------------------
VehicleMonitorService* VehicleMonitorService::sInstance = NULL;
status_t VehicleMonitorService::dump(int fd, const Vector<String16>& /*args*/) {
static const String16 sDump("android.permission.DUMP");
String8 msg;
if (!PermissionCache::checkCallingPermission(sDump)) {
msg.appendFormat("Permission Denial: "
"can't dump VMS from pid=%d, uid=%d\n",
IPCThreadState::self()->getCallingPid(),
IPCThreadState::self()->getCallingUid());
write(fd, msg.string(), msg.size());
return NO_ERROR;
}
msg.appendFormat("*Handler, now in ms:%" PRId64 "\n", elapsedRealtime());
mHandler->dump(msg);
write(fd, msg.string(), msg.size());
return NO_ERROR;
}
VehicleMonitorService::VehicleMonitorService() {
sInstance = this;
}
VehicleMonitorService::~VehicleMonitorService() {
sInstance = NULL;
}
void VehicleMonitorService::binderDied(const wp<IBinder>& who) {
std::lock_guard<std::mutex> autoLock(mLock);
sp<IBinder> ibinder = who.promote();
ibinder->unlinkToDeath(this);
// TODO: reset all priorities set by CarService.
}
void VehicleMonitorService::release() {
std::lock_guard<std::mutex> autoLock(mLock);
mHandlerThread->quit();
}
void VehicleMonitorService::onFirstRef() {
std::lock_guard<std::mutex> autoLock(mLock);
mHandlerThread = new HandlerThread();
status_t r = mHandlerThread->start("VMS.NATIVE_LOOP");
if (r != NO_ERROR) {
ALOGE("cannot start handler thread, error:%d", r);
return;
}
sp<VehicleMonitorMessageHandler> handler(
new VehicleMonitorMessageHandler(mHandlerThread->getLooper(), *this));
assert(handler.get() != NULL);
mHandler = handler;
}
status_t VehicleMonitorService::setAppPriority(uint32_t, uint32_t, vehicle_app_priority) {
//TODO
return NO_ERROR;
}
status_t VehicleMonitorService::setMonitorListener(
const sp<IVehicleMonitorListener> &listener) {
sp<IBinder> ibinder = IInterface::asBinder(listener);
LOG_VERBOSE("setMonitorListener, binder 0x%x", ibinder.get());
//TODO
return NO_ERROR;
}
}; // namespace android