Author: enrico Date: Tue Aug 9 16:16:58 2016 New Revision: 278166 URL: http://llvm.org/viewvc/llvm-project?rev=278166&view=rev Log: Adjust LLDB's iOS simulator interface for changes in CoreSimulator
rdar://27732333 and rdar://27732377 Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp lldb/trunk/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.h lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp?rev=278166&r1=278165&r2=278166&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp (original) +++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp Tue Aug 9 16:16:58 2016 @@ -52,7 +52,9 @@ PlatformAppleSimulator::Terminate () //------------------------------------------------------------------ PlatformAppleSimulator::PlatformAppleSimulator () : PlatformDarwin (true), - m_core_simulator_framework_path() + m_core_sim_path_mutex (), + m_core_simulator_framework_path(), + m_device () { } @@ -105,7 +107,7 @@ PlatformAppleSimulator::GetStatus (Strea // current simulator PlatformAppleSimulator::LoadCoreSimulator(); - CoreSimulatorSupport::DeviceSet devices = CoreSimulatorSupport::DeviceSet::GetAvailableDevices(); + CoreSimulatorSupport::DeviceSet devices = CoreSimulatorSupport::DeviceSet::GetAvailableDevices(GetDeveloperDirectory()); const size_t num_devices = devices.GetNumDevices(); if (num_devices) { @@ -155,7 +157,7 @@ PlatformAppleSimulator::ConnectRemote (A if (arg_cstr) { std::string arg_str(arg_cstr); - CoreSimulatorSupport::DeviceSet devices = CoreSimulatorSupport::DeviceSet::GetAvailableDevices(); + CoreSimulatorSupport::DeviceSet devices = CoreSimulatorSupport::DeviceSet::GetAvailableDevices(GetDeveloperDirectory()); devices.ForEach([this, &arg_str](const CoreSimulatorSupport::Device &device) -> bool { if (arg_str == device.GetUDID() || arg_str == device.GetName()) { @@ -252,7 +254,7 @@ FileSpec PlatformAppleSimulator::GetCoreSimulatorPath() { #if defined(__APPLE__) - std::lock_guard<std::mutex> guard(m_mutex); + std::lock_guard<std::mutex> guard(m_core_sim_path_mutex); if (!m_core_simulator_framework_path.hasValue()) { const char *developer_dir = GetDeveloperDirectory(); @@ -291,7 +293,7 @@ PlatformAppleSimulator::GetSimulatorDevi if (!m_device.hasValue()) { const CoreSimulatorSupport::DeviceType::ProductFamilyID dev_id = CoreSimulatorSupport::DeviceType::ProductFamilyID::iPhone; - m_device = CoreSimulatorSupport::DeviceSet::GetAvailableDevices().GetFanciest(dev_id); + m_device = CoreSimulatorSupport::DeviceSet::GetAvailableDevices(GetDeveloperDirectory()).GetFanciest(dev_id); } if (m_device.hasValue()) Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h?rev=278166&r1=278165&r2=278166&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h (original) +++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h Tue Aug 9 16:16:58 2016 @@ -12,6 +12,8 @@ // C Includes // C++ Includes +#include <mutex> + // Other libraries and framework includes // Project includes #include "lldb/Host/FileSpec.h" @@ -59,6 +61,7 @@ public: lldb_private::Error &error) override; protected: + std::mutex m_core_sim_path_mutex; llvm::Optional<lldb_private::FileSpec> m_core_simulator_framework_path; llvm::Optional<CoreSimulatorSupport::Device> m_device; Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp?rev=278166&r1=278165&r2=278166&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp (original) +++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp Tue Aug 9 16:16:58 2016 @@ -172,7 +172,9 @@ PlatformiOSSimulator::GetDescriptionStat //------------------------------------------------------------------ PlatformiOSSimulator::PlatformiOSSimulator () : PlatformAppleSimulator (), -m_sdk_directory () +m_sdk_dir_mutex (), +m_sdk_directory (), +m_build_update () { } @@ -308,7 +310,7 @@ EnumerateDirectoryCallback (void *baton, const char * PlatformiOSSimulator::GetSDKDirectoryAsCString() { - std::lock_guard<std::mutex> guard(m_mutex); + std::lock_guard<std::mutex> guard(m_sdk_dir_mutex); if (m_sdk_directory.empty()) { const char *developer_dir = GetDeveloperDirectory(); Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h?rev=278166&r1=278165&r2=278166&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h (original) +++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h Tue Aug 9 16:16:58 2016 @@ -12,6 +12,7 @@ // C Includes // C++ Includes +#include <mutex> #include <string> // Other libraries and framework includes @@ -103,6 +104,7 @@ public: } protected: + std::mutex m_sdk_dir_mutex; std::string m_sdk_directory; std::string m_build_update; Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.h?rev=278166&r1=278165&r2=278166&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.h (original) +++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.h Tue Aug 9 16:16:58 2016 @@ -280,10 +280,10 @@ namespace CoreSimulatorSupport { public: static DeviceSet - GetAllDevices (); + GetAllDevices (const char *developer_dir); static DeviceSet - GetAvailableDevices (); + GetAvailableDevices (const char *developer_dir); size_t GetNumDevices (); Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm?rev=278166&r1=278165&r2=278166&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm (original) +++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm Tue Aug 9 16:16:58 2016 @@ -24,14 +24,15 @@ using namespace lldb_private; using namespace lldb_utility; // CoreSimulator lives as part of Xcode, which means we can't really link against it, so we dlopen() // it at runtime, and error out nicely if that fails -@interface SimDeviceSet +@interface SimServiceContext {} -+ (id) defaultSet; ++ (id) sharedServiceContextForDeveloperDir:(NSString*)dir error:(NSError**)error; @end // However, the drawback is that the compiler will not know about the selectors we're trying to use // until runtime; to appease clang in this regard, define a fake protocol on NSObject that exposes // the needed interface names for us @protocol LLDBCoreSimulatorSupport <NSObject> +- (id) defaultDeviceSetWithError:(NSError**)error; - (NSArray *) devices; - (id) deviceType; - (NSString *) name; @@ -466,18 +467,13 @@ CoreSimulatorSupport::Device::Boot (Erro return false; } -#define kSimDeviceBootEnv @"env" /* An NSDictionary of "extra" environment key/values */ #define kSimDeviceBootPersist @"persist" /* An NSNumber (boolean) indicating whether or not the session should outlive the calling process (default false) */ -#define kSimDeviceBootDisabledJobs @"disabled_jobs" /* An NSDictionary of NSStrings -> NSNumbers, each string is the name of a job, and the value is the corresponding state (true if disabled) */ NSDictionary *options = @{ kSimDeviceBootPersist : @NO, - kSimDeviceBootDisabledJobs : @{@"com.apple.backboardd" : @YES} }; - -#undef kSimDeviceBootEnv + #undef kSimDeviceBootPersist -#undef kSimDeviceBootDisabledJobs NSError* nserror; if ([m_dev bootWithOptions:options error:&nserror]) @@ -677,15 +673,26 @@ CoreSimulatorSupport::Device::Spawn (Pro } CoreSimulatorSupport::DeviceSet -CoreSimulatorSupport::DeviceSet::GetAllDevices () +CoreSimulatorSupport::DeviceSet::GetAllDevices (const char *developer_dir) { - return DeviceSet([[NSClassFromString(@"SimDeviceSet") defaultSet] devices]); + if (!developer_dir || !developer_dir[0]) + return DeviceSet([NSArray new]); + + Class SimServiceContextClass = NSClassFromString(@"SimServiceContext"); + NSString *dev_dir = @(developer_dir); + NSError *error = nil; + + id serviceContext = [SimServiceContextClass sharedServiceContextForDeveloperDir:dev_dir error:&error]; + if (!serviceContext) + return DeviceSet([NSArray new]); + + return DeviceSet([[serviceContext defaultDeviceSetWithError:&error] devices]); } CoreSimulatorSupport::DeviceSet -CoreSimulatorSupport::DeviceSet::GetAvailableDevices () +CoreSimulatorSupport::DeviceSet::GetAvailableDevices (const char *developer_dir) { - return GetAllDevices().GetDevicesIf( [] (Device d) -> bool { + return GetAllDevices(developer_dir).GetDevicesIf( [] (Device d) -> bool { return (d && d.GetDeviceType() && d.GetDeviceRuntime() && d.GetDeviceRuntime().IsAvailable()); }); } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits