You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.5 KiB
79 lines
2.5 KiB
#include "RkHwcProxyAidl.h"
|
|
|
|
#include <log/log.h>
|
|
#include <DrmApi.h>
|
|
|
|
namespace aidl {
|
|
namespace rockchip {
|
|
namespace hwc {
|
|
namespace proxy {
|
|
namespace aidl {
|
|
namespace impl {
|
|
|
|
RkHwcProxyAidl::RkHwcProxyAidl() {
|
|
ALOGI("Initial RkHwcProxyAidl class.");
|
|
}
|
|
|
|
void RkHwcProxyAidl::internalLoop() {
|
|
while (true) {
|
|
usleep(1000000);
|
|
if (callbacks_.size() == 0) continue;
|
|
|
|
std::unique_lock<decltype(callbacks_lock_)> lock(callbacks_lock_);
|
|
for (auto cb : callbacks_) {
|
|
std::lock_guard<decltype(results_lock_)> lock(results_lock_);
|
|
for (auto ret : results_) {
|
|
cb->asyncDone(ret);
|
|
}
|
|
}
|
|
lock.unlock();
|
|
}
|
|
}
|
|
|
|
::ndk::ScopedAStatus RkHwcProxyAidl::run(const RkHwcProxyAidlRequest& request, RkHwcProxyAidlResponse* response) {
|
|
std::unique_lock<decltype(callbacks_lock_)> lock(callbacks_lock_);
|
|
for (auto cb : callbacks_) {
|
|
cb->onCallback(request, response);
|
|
}
|
|
return ::ndk::ScopedAStatus::ok();
|
|
}
|
|
|
|
::ndk::ScopedAStatus RkHwcProxyAidl::registerCallback(const std::shared_ptr<IRkHwcProxyAidlCallback>& callback) {
|
|
ALOGI("registerCallback...");
|
|
if (callback == nullptr) {
|
|
ALOGI("registerCallback failed, nullptr!");
|
|
return ndk::ScopedAStatus::fromExceptionCode(EX_NULL_POINTER);
|
|
}
|
|
|
|
{
|
|
std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
|
|
callbacks_.emplace_back(callback);
|
|
// unlock
|
|
}
|
|
ALOGI("registerCallback OK!");
|
|
return ndk::ScopedAStatus::ok();
|
|
}
|
|
::ndk::ScopedAStatus RkHwcProxyAidl::unregisterCallback(const std::shared_ptr<IRkHwcProxyAidlCallback>& callback) {
|
|
if (callback == nullptr) {
|
|
// For now, this shouldn't happen because argument is not nullable.
|
|
return ndk::ScopedAStatus::fromExceptionCode(EX_NULL_POINTER);
|
|
}
|
|
|
|
std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
|
|
|
|
auto matches = [callback](const auto& list) {
|
|
return list->asBinder() == callback->asBinder(); // compares binder object
|
|
};
|
|
auto it = std::remove_if(callbacks_.begin(), callbacks_.end(), matches);
|
|
bool removed = (it != callbacks_.end());
|
|
callbacks_.erase(it, callbacks_.end()); // calls unlinkToDeath on deleted callbacks.
|
|
return removed ? ndk::ScopedAStatus::ok()
|
|
: ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
|
|
}
|
|
} // namespace impl
|
|
} // namespace aidl
|
|
} // namespace proxy
|
|
} // namespace hwc
|
|
} // namespace rockchip
|
|
} // namespace aidl
|