From 8dfa77780fe1e3944a5b63b453e7a25b11ca25c4 Mon Sep 17 00:00:00 2001 From: Ethan Yonker Date: Thu, 4 Sep 2014 21:48:41 -0500 Subject: MTP: Use fork instead of pthread Change-Id: I95cf6f4def0c86f40c775738f0712323f0a0f146 --- mtp/twrpMtp.cpp | 17 ++++++++++++++++- mtp/twrpMtp.hpp | 3 ++- partitionmanager.cpp | 19 ++++++++++++------- partitions.hpp | 2 +- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/mtp/twrpMtp.cpp b/mtp/twrpMtp.cpp index 6fe0ee3e8..e7c3f2cda 100755 --- a/mtp/twrpMtp.cpp +++ b/mtp/twrpMtp.cpp @@ -82,7 +82,7 @@ int twrpMtp::start(void) { return 0; } -pthread_t twrpMtp::runserver(void) { +pthread_t twrpMtp::threadserver(void) { pthread_t thread; ThreadPtr mtpptr = &twrpMtp::start; PThreadPtr p = *(PThreadPtr*)&mtpptr; @@ -90,6 +90,21 @@ pthread_t twrpMtp::runserver(void) { return thread; } +pid_t twrpMtp::forkserver(void) { + pid_t pid; + if ((pid = fork()) == -1) { + MTPE("MTP fork failed.\n"); + return 0; + } + if (pid == 0) { + // Child process + start(); + } else { + return pid; + } + return 0; +} + void twrpMtp::addStorage(std::string display, std::string path, int mtpid) { s = new storage; s->display = display; diff --git a/mtp/twrpMtp.hpp b/mtp/twrpMtp.hpp index bed81c0e9..f0d8f4bfd 100755 --- a/mtp/twrpMtp.hpp +++ b/mtp/twrpMtp.hpp @@ -34,7 +34,8 @@ class twrpMtp { public: twrpMtp(int debug_enabled /* = 0 */); - pthread_t runserver(void); + pthread_t threadserver(void); + pid_t forkserver(void); void addStorage(std::string display, std::string path, int mtpid); private: int start(void); diff --git a/partitionmanager.cpp b/partitionmanager.cpp index a8b61c3fc..bc27ccbcb 100644 --- a/partitionmanager.cpp +++ b/partitionmanager.cpp @@ -2153,7 +2153,7 @@ TWPartition *TWPartitionManager::Get_Default_Storage_Partition() bool TWPartitionManager::Enable_MTP(void) { #ifdef TW_HAS_MTP - if (mtpthread) { + if (mtppid) { LOGERR("MTP already enabled\n"); return true; } @@ -2183,9 +2183,14 @@ bool TWPartitionManager::Enable_MTP(void) { } } if (count) { - mtpthread = mtp->runserver(); - DataManager::SetValue("tw_mtp_enabled", 1); - return true; + mtppid = mtp->forkserver(); + if (mtppid) { + DataManager::SetValue("tw_mtp_enabled", 1); + return true; + } else { + LOGERR("Failed to enable MTP\n"); + return false; + } } LOGERR("No valid storage partitions found for MTP.\n"); #else @@ -2206,9 +2211,9 @@ bool TWPartitionManager::Disable_MTP(void) { string productstr = product; TWFunc::write_file("/sys/class/android_usb/android0/idVendor", vendorstr); TWFunc::write_file("/sys/class/android_usb/android0/idProduct", productstr); - if (mtpthread) { - pthread_kill(mtpthread, 0); - mtpthread = NULL; + if (mtppid) { + kill(mtppid, SIGTERM); + mtppid = 0; } property_set("sys.usb.config", "adb"); DataManager::SetValue("tw_mtp_enabled", 0); diff --git a/partitions.hpp b/partitions.hpp index 00f435a79..4fe155ec5 100644 --- a/partitions.hpp +++ b/partitions.hpp @@ -239,7 +239,7 @@ private: TWPartition* Find_Next_Storage(string Path, string Exclude); int Open_Lun_File(string Partition_Path, string Lun_File); int mtpid; - pthread_t mtpthread; + pid_t mtppid; bool mtp_was_enabled; private: -- cgit v1.2.3