Loading include/input/InputTransport.h +0 −4 Original line number Diff line number Diff line Loading @@ -246,8 +246,6 @@ public: /* Return a new object that has a duplicate of this channel's fd. */ std::unique_ptr<InputChannel> dup() const; void copyTo(InputChannel& outChannel) const; status_t readFromParcel(const android::Parcel* parcel) override; status_t writeToParcel(android::Parcel* parcel) const override; Loading Loading @@ -279,8 +277,6 @@ public: } private: base::unique_fd dupFd() const; std::string mName; android::base::unique_fd mFd; Loading libs/gui/tests/EndToEndNativeInputTest.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -68,10 +68,12 @@ class InputSurface { public: InputSurface(const sp<SurfaceControl> &sc, int width, int height) { mSurfaceControl = sc; std::unique_ptr<InputChannel> clientChannel; InputChannel::openInputChannelPair("testchannels", mServerChannel, clientChannel); mClientChannel = std::move(clientChannel); mInputFlinger = getInputFlinger(); mClientChannel = std::make_shared<InputChannel>(); mInputFlinger->createInputChannel("testchannels", mClientChannel.get()); mInputFlinger->registerInputChannel(*mServerChannel); populateInputInfo(width, height); Loading Loading @@ -153,7 +155,7 @@ public: EXPECT_EQ(0, mev->getFlags() & VERIFIED_MOTION_EVENT_FLAGS); } ~InputSurface() { mInputFlinger->removeInputChannel(mClientChannel->getConnectionToken()); } ~InputSurface() { mInputFlinger->unregisterInputChannel(mServerChannel->getConnectionToken()); } void doTransaction(std::function<void(SurfaceComposerClient::Transaction&, const sp<SurfaceControl>&)> transactionBody) { Loading Loading @@ -190,7 +192,7 @@ private: } void populateInputInfo(int width, int height) { mInputInfo.token = mClientChannel->getConnectionToken(); mInputInfo.token = mServerChannel->getConnectionToken(); mInputInfo.name = "Test info"; mInputInfo.flags = InputWindowInfo::Flag::NOT_TOUCH_MODAL; mInputInfo.type = InputWindowInfo::Type::BASE_APPLICATION; Loading @@ -217,6 +219,7 @@ private: } public: sp<SurfaceControl> mSurfaceControl; std::unique_ptr<InputChannel> mServerChannel; std::shared_ptr<InputChannel> mClientChannel; sp<IInputFlinger> mInputFlinger; Loading libs/input/InputTransport.cpp +13 −24 Original line number Diff line number Diff line Loading @@ -377,14 +377,20 @@ status_t InputChannel::receiveMessage(InputMessage* msg) { } std::unique_ptr<InputChannel> InputChannel::dup() const { base::unique_fd newFd(dupFd()); return InputChannel::create(getName(), std::move(newFd), getConnectionToken()); android::base::unique_fd newFd(::dup(getFd())); if (!newFd.ok()) { ALOGE("Could not duplicate fd %i for channel %s: %s", getFd().get(), getName().c_str(), strerror(errno)); const bool hitFdLimit = errno == EMFILE || errno == ENFILE; // If this process is out of file descriptors, then throwing that might end up exploding // on the other side of a binder call, which isn't really helpful. // Better to just crash here and hope that the FD leak is slow. // Other failures could be client errors, so we still propagate those back to the caller. LOG_ALWAYS_FATAL_IF(hitFdLimit, "Too many open files, could not duplicate input channel %s", getName().c_str()); return nullptr; } void InputChannel::copyTo(InputChannel& outChannel) const { outChannel.mName = getName(); outChannel.mFd = dupFd(); outChannel.mToken = getConnectionToken(); return InputChannel::create(getName(), std::move(newFd), getConnectionToken()); } status_t InputChannel::writeToParcel(android::Parcel* parcel) const { Loading @@ -409,23 +415,6 @@ sp<IBinder> InputChannel::getConnectionToken() const { return mToken; } base::unique_fd InputChannel::dupFd() const { android::base::unique_fd newFd(::dup(getFd())); if (!newFd.ok()) { ALOGE("Could not duplicate fd %i for channel %s: %s", getFd().get(), getName().c_str(), strerror(errno)); const bool hitFdLimit = errno == EMFILE || errno == ENFILE; // If this process is out of file descriptors, then throwing that might end up exploding // on the other side of a binder call, which isn't really helpful. // Better to just crash here and hope that the FD leak is slow. // Other failures could be client errors, so we still propagate those back to the caller. LOG_ALWAYS_FATAL_IF(hitFdLimit, "Too many open files, could not duplicate input channel %s", getName().c_str()); return {}; } return newFd; } // --- InputPublisher --- InputPublisher::InputPublisher(const std::shared_ptr<InputChannel>& channel) : mChannel(channel) {} Loading libs/input/android/os/IInputFlinger.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -30,8 +30,8 @@ interface IInputFlinger // shouldn't be a concern. oneway void setInputWindows(in InputWindowInfo[] inputHandles, in @nullable ISetInputWindowsListener setInputWindowsListener); InputChannel createInputChannel(in @utf8InCpp String name); void removeInputChannel(in IBinder connectionToken); void registerInputChannel(in InputChannel channel); void unregisterInputChannel(in IBinder connectionToken); /** * Sets focus to the window identified by the token. This must be called * after updating any input window handles. Loading services/inputflinger/InputManager.cpp +4 −28 Original line number Diff line number Diff line Loading @@ -31,25 +31,6 @@ namespace android { static int32_t exceptionCodeFromStatusT(status_t status) { switch (status) { case OK: return binder::Status::EX_NONE; case INVALID_OPERATION: return binder::Status::EX_UNSUPPORTED_OPERATION; case BAD_VALUE: case BAD_TYPE: case NAME_NOT_FOUND: return binder::Status::EX_ILLEGAL_ARGUMENT; case NO_INIT: return binder::Status::EX_ILLEGAL_STATE; case PERMISSION_DENIED: return binder::Status::EX_SECURITY; default: return binder::Status::EX_TRANSACTION_FAILED; } } InputManager::InputManager( const sp<InputReaderPolicyInterface>& readerPolicy, const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) { Loading Loading @@ -138,7 +119,7 @@ binder::Status InputManager::setInputWindows( } // Used by tests only. binder::Status InputManager::createInputChannel(const std::string& name, InputChannel* outChannel) { binder::Status InputManager::registerInputChannel(const InputChannel& channel) { IPCThreadState* ipc = IPCThreadState::self(); const int uid = ipc->getCallingUid(); if (uid != AID_SHELL && uid != AID_ROOT) { Loading @@ -147,17 +128,12 @@ binder::Status InputManager::createInputChannel(const std::string& name, InputCh return binder::Status::ok(); } base::Result<std::unique_ptr<InputChannel>> channel = mDispatcher->createInputChannel(name); if (!channel) { return binder::Status::fromExceptionCode(exceptionCodeFromStatusT(channel.error().code()), channel.error().message().c_str()); } (*channel)->copyTo(*outChannel); mDispatcher->registerInputChannel(channel.dup()); return binder::Status::ok(); } binder::Status InputManager::removeInputChannel(const sp<IBinder>& connectionToken) { mDispatcher->removeInputChannel(connectionToken); binder::Status InputManager::unregisterInputChannel(const sp<IBinder>& connectionToken) { mDispatcher->unregisterInputChannel(connectionToken); return binder::Status::ok(); } Loading Loading
include/input/InputTransport.h +0 −4 Original line number Diff line number Diff line Loading @@ -246,8 +246,6 @@ public: /* Return a new object that has a duplicate of this channel's fd. */ std::unique_ptr<InputChannel> dup() const; void copyTo(InputChannel& outChannel) const; status_t readFromParcel(const android::Parcel* parcel) override; status_t writeToParcel(android::Parcel* parcel) const override; Loading Loading @@ -279,8 +277,6 @@ public: } private: base::unique_fd dupFd() const; std::string mName; android::base::unique_fd mFd; Loading
libs/gui/tests/EndToEndNativeInputTest.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -68,10 +68,12 @@ class InputSurface { public: InputSurface(const sp<SurfaceControl> &sc, int width, int height) { mSurfaceControl = sc; std::unique_ptr<InputChannel> clientChannel; InputChannel::openInputChannelPair("testchannels", mServerChannel, clientChannel); mClientChannel = std::move(clientChannel); mInputFlinger = getInputFlinger(); mClientChannel = std::make_shared<InputChannel>(); mInputFlinger->createInputChannel("testchannels", mClientChannel.get()); mInputFlinger->registerInputChannel(*mServerChannel); populateInputInfo(width, height); Loading Loading @@ -153,7 +155,7 @@ public: EXPECT_EQ(0, mev->getFlags() & VERIFIED_MOTION_EVENT_FLAGS); } ~InputSurface() { mInputFlinger->removeInputChannel(mClientChannel->getConnectionToken()); } ~InputSurface() { mInputFlinger->unregisterInputChannel(mServerChannel->getConnectionToken()); } void doTransaction(std::function<void(SurfaceComposerClient::Transaction&, const sp<SurfaceControl>&)> transactionBody) { Loading Loading @@ -190,7 +192,7 @@ private: } void populateInputInfo(int width, int height) { mInputInfo.token = mClientChannel->getConnectionToken(); mInputInfo.token = mServerChannel->getConnectionToken(); mInputInfo.name = "Test info"; mInputInfo.flags = InputWindowInfo::Flag::NOT_TOUCH_MODAL; mInputInfo.type = InputWindowInfo::Type::BASE_APPLICATION; Loading @@ -217,6 +219,7 @@ private: } public: sp<SurfaceControl> mSurfaceControl; std::unique_ptr<InputChannel> mServerChannel; std::shared_ptr<InputChannel> mClientChannel; sp<IInputFlinger> mInputFlinger; Loading
libs/input/InputTransport.cpp +13 −24 Original line number Diff line number Diff line Loading @@ -377,14 +377,20 @@ status_t InputChannel::receiveMessage(InputMessage* msg) { } std::unique_ptr<InputChannel> InputChannel::dup() const { base::unique_fd newFd(dupFd()); return InputChannel::create(getName(), std::move(newFd), getConnectionToken()); android::base::unique_fd newFd(::dup(getFd())); if (!newFd.ok()) { ALOGE("Could not duplicate fd %i for channel %s: %s", getFd().get(), getName().c_str(), strerror(errno)); const bool hitFdLimit = errno == EMFILE || errno == ENFILE; // If this process is out of file descriptors, then throwing that might end up exploding // on the other side of a binder call, which isn't really helpful. // Better to just crash here and hope that the FD leak is slow. // Other failures could be client errors, so we still propagate those back to the caller. LOG_ALWAYS_FATAL_IF(hitFdLimit, "Too many open files, could not duplicate input channel %s", getName().c_str()); return nullptr; } void InputChannel::copyTo(InputChannel& outChannel) const { outChannel.mName = getName(); outChannel.mFd = dupFd(); outChannel.mToken = getConnectionToken(); return InputChannel::create(getName(), std::move(newFd), getConnectionToken()); } status_t InputChannel::writeToParcel(android::Parcel* parcel) const { Loading @@ -409,23 +415,6 @@ sp<IBinder> InputChannel::getConnectionToken() const { return mToken; } base::unique_fd InputChannel::dupFd() const { android::base::unique_fd newFd(::dup(getFd())); if (!newFd.ok()) { ALOGE("Could not duplicate fd %i for channel %s: %s", getFd().get(), getName().c_str(), strerror(errno)); const bool hitFdLimit = errno == EMFILE || errno == ENFILE; // If this process is out of file descriptors, then throwing that might end up exploding // on the other side of a binder call, which isn't really helpful. // Better to just crash here and hope that the FD leak is slow. // Other failures could be client errors, so we still propagate those back to the caller. LOG_ALWAYS_FATAL_IF(hitFdLimit, "Too many open files, could not duplicate input channel %s", getName().c_str()); return {}; } return newFd; } // --- InputPublisher --- InputPublisher::InputPublisher(const std::shared_ptr<InputChannel>& channel) : mChannel(channel) {} Loading
libs/input/android/os/IInputFlinger.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -30,8 +30,8 @@ interface IInputFlinger // shouldn't be a concern. oneway void setInputWindows(in InputWindowInfo[] inputHandles, in @nullable ISetInputWindowsListener setInputWindowsListener); InputChannel createInputChannel(in @utf8InCpp String name); void removeInputChannel(in IBinder connectionToken); void registerInputChannel(in InputChannel channel); void unregisterInputChannel(in IBinder connectionToken); /** * Sets focus to the window identified by the token. This must be called * after updating any input window handles. Loading
services/inputflinger/InputManager.cpp +4 −28 Original line number Diff line number Diff line Loading @@ -31,25 +31,6 @@ namespace android { static int32_t exceptionCodeFromStatusT(status_t status) { switch (status) { case OK: return binder::Status::EX_NONE; case INVALID_OPERATION: return binder::Status::EX_UNSUPPORTED_OPERATION; case BAD_VALUE: case BAD_TYPE: case NAME_NOT_FOUND: return binder::Status::EX_ILLEGAL_ARGUMENT; case NO_INIT: return binder::Status::EX_ILLEGAL_STATE; case PERMISSION_DENIED: return binder::Status::EX_SECURITY; default: return binder::Status::EX_TRANSACTION_FAILED; } } InputManager::InputManager( const sp<InputReaderPolicyInterface>& readerPolicy, const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) { Loading Loading @@ -138,7 +119,7 @@ binder::Status InputManager::setInputWindows( } // Used by tests only. binder::Status InputManager::createInputChannel(const std::string& name, InputChannel* outChannel) { binder::Status InputManager::registerInputChannel(const InputChannel& channel) { IPCThreadState* ipc = IPCThreadState::self(); const int uid = ipc->getCallingUid(); if (uid != AID_SHELL && uid != AID_ROOT) { Loading @@ -147,17 +128,12 @@ binder::Status InputManager::createInputChannel(const std::string& name, InputCh return binder::Status::ok(); } base::Result<std::unique_ptr<InputChannel>> channel = mDispatcher->createInputChannel(name); if (!channel) { return binder::Status::fromExceptionCode(exceptionCodeFromStatusT(channel.error().code()), channel.error().message().c_str()); } (*channel)->copyTo(*outChannel); mDispatcher->registerInputChannel(channel.dup()); return binder::Status::ok(); } binder::Status InputManager::removeInputChannel(const sp<IBinder>& connectionToken) { mDispatcher->removeInputChannel(connectionToken); binder::Status InputManager::unregisterInputChannel(const sp<IBinder>& connectionToken) { mDispatcher->unregisterInputChannel(connectionToken); return binder::Status::ok(); } Loading