53 lines
1.6 KiB
C++
53 lines
1.6 KiB
C++
|
#include <uds/channel_manager.h>
|
||
|
|
||
|
#include <log/log.h>
|
||
|
|
||
|
namespace android {
|
||
|
namespace pdx {
|
||
|
namespace uds {
|
||
|
|
||
|
ChannelManager& ChannelManager::Get() {
|
||
|
static ChannelManager instance;
|
||
|
return instance;
|
||
|
}
|
||
|
|
||
|
void ChannelManager::CloseHandle(int32_t handle) {
|
||
|
std::lock_guard<std::mutex> autolock(mutex_);
|
||
|
auto channel = channels_.find(handle);
|
||
|
if (channel == channels_.end()) {
|
||
|
ALOGE("Invalid channel handle: %d", handle);
|
||
|
} else {
|
||
|
channels_.erase(channel);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
LocalChannelHandle ChannelManager::CreateHandle(LocalHandle data_fd,
|
||
|
LocalHandle pollin_event_fd,
|
||
|
LocalHandle pollhup_event_fd) {
|
||
|
if (data_fd && pollin_event_fd && pollhup_event_fd) {
|
||
|
std::lock_guard<std::mutex> autolock(mutex_);
|
||
|
const int32_t handle = data_fd.Get();
|
||
|
channels_.emplace(
|
||
|
handle,
|
||
|
ChannelEventReceiver{std::move(data_fd), std::move(pollin_event_fd),
|
||
|
std::move(pollhup_event_fd)});
|
||
|
return LocalChannelHandle(this, handle);
|
||
|
} else {
|
||
|
ALOGE(
|
||
|
"ChannelManager::CreateHandle: Invalid arguments: data_fd=%d "
|
||
|
"pollin_event_fd=%d pollhup_event_fd=%d",
|
||
|
data_fd.Get(), pollin_event_fd.Get(), pollhup_event_fd.Get());
|
||
|
return LocalChannelHandle(nullptr, -1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ChannelEventReceiver* ChannelManager::GetChannelData(int32_t handle) {
|
||
|
std::lock_guard<std::mutex> autolock(mutex_);
|
||
|
auto channel = channels_.find(handle);
|
||
|
return channel != channels_.end() ? &channel->second : nullptr;
|
||
|
}
|
||
|
|
||
|
} // namespace uds
|
||
|
} // namespace pdx
|
||
|
} // namespace android
|