#include #include namespace android { namespace pdx { namespace uds { ChannelManager& ChannelManager::Get() { static ChannelManager instance; return instance; } void ChannelManager::CloseHandle(int32_t handle) { std::lock_guard 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 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 autolock(mutex_); auto channel = channels_.find(handle); return channel != channels_.end() ? &channel->second : nullptr; } } // namespace uds } // namespace pdx } // namespace android