1 #include <uds/channel_manager.h> 2 3 #include <log/log.h> 4 5 namespace android { 6 namespace pdx { 7 namespace uds { 8 9 ChannelManager& ChannelManager::Get() { 10 static ChannelManager instance; 11 return instance; 12 } 13 14 void ChannelManager::CloseHandle(int32_t handle) { 15 std::lock_guard<std::mutex> autolock(mutex_); 16 auto channel = channels_.find(handle); 17 if (channel == channels_.end()) { 18 ALOGE("Invalid channel handle: %d", handle); 19 } else { 20 channels_.erase(channel); 21 } 22 } 23 24 LocalChannelHandle ChannelManager::CreateHandle(LocalHandle data_fd, 25 LocalHandle pollin_event_fd, 26 LocalHandle pollhup_event_fd) { 27 if (data_fd && pollin_event_fd && pollhup_event_fd) { 28 std::lock_guard<std::mutex> autolock(mutex_); 29 const int32_t handle = data_fd.Get(); 30 channels_.emplace( 31 handle, 32 ChannelEventReceiver{std::move(data_fd), std::move(pollin_event_fd), 33 std::move(pollhup_event_fd)}); 34 return LocalChannelHandle(this, handle); 35 } else { 36 ALOGE( 37 "ChannelManager::CreateHandle: Invalid arguments: data_fd=%d " 38 "pollin_event_fd=%d pollhup_event_fd=%d", 39 data_fd.Get(), pollin_event_fd.Get(), pollhup_event_fd.Get()); 40 return LocalChannelHandle(nullptr, -1); 41 } 42 } 43 44 ChannelEventReceiver* ChannelManager::GetChannelData(int32_t handle) { 45 std::lock_guard<std::mutex> autolock(mutex_); 46 auto channel = channels_.find(handle); 47 return channel != channels_.end() ? &channel->second : nullptr; 48 } 49 50 } // namespace uds 51 } // namespace pdx 52 } // namespace android 53