diff --git a/.travis.yml b/.travis.yml index 807919f..4fd6ba0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,17 +4,18 @@ env: matrix: include: - script: - - xctool test -project $MODULE_NAME.xcodeproj -scheme $MODULE_NAME-OSX - - xctool test -project $MODULE_NAME.xcodeproj -scheme $MODULE_NAME-iOS -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' - - xctool test -project $MODULE_NAME.xcodeproj -scheme $MODULE_NAME-tvOS -sdk appletvsimulator -destination 'platform=tvOS Simulator,name=Apple TV 1080p' - - xctool build -project $MODULE_NAME.xcodeproj -scheme $MODULE_NAME-watchOS -sdk watchsimulator -destination 'platform=watchOS Simulator,name=Apple Watch - 42mm' + - xcodebuild test -project $MODULE_NAME.xcodeproj -scheme $MODULE_NAME-OSX + - xcodebuild test -project $MODULE_NAME.xcodeproj -scheme $MODULE_NAME-iOS -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' + - xcodebuild test -project $MODULE_NAME.xcodeproj -scheme $MODULE_NAME-tvOS -sdk appletvsimulator -destination 'platform=tvOS Simulator,name=Apple TV 1080p' + - xcodebuild build -project $MODULE_NAME.xcodeproj -scheme $MODULE_NAME-watchOS -sdk watchsimulator -destination 'platform=watchOS Simulator,name=Apple Watch - 42mm' os: osx - osx_image: xcode7.2 + osx_image: xcode7.3 language: objective-c before_install: - brew update - brew outdated carthage || brew upgrade carthage - - brew outdated xctool || brew upgrade xctool + - brew install libuv + # - brew outdated xctool || brew upgrade xctool before_script: # bootstrap the dependencies for the project # you can remove if you don't have dependencies @@ -33,7 +34,9 @@ matrix: repo: crossroadlabs/ExecutionContext tags: true - script: - - ./build + - ./build test + - ./build clean + - ./build test -Xcc -fblocks -Xswiftc -Ddispatch sudo: required dist: trusty language: generic @@ -41,10 +44,25 @@ matrix: # install original swift distribution - wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import - - cd .. - - export SWIFT_VERSION="swift-DEVELOPMENT-SNAPSHOT-2016-03-01-a" + - export SWIFT_VERSION="swift-DEVELOPMENT-SNAPSHOT-2016-03-24-a" - wget https://swift.org/builds/development/ubuntu1404/$SWIFT_VERSION/$SWIFT_VERSION-ubuntu14.04.tar.gz - tar xzf $SWIFT_VERSION-ubuntu14.04.tar.gz - - export PATH="${PWD}/${SWIFT_VERSION}-ubuntu14.04/usr/bin:${PATH}" + - export SWIFT_ROOT_DIR="${PWD}/${SWIFT_VERSION}-ubuntu14.04" + - export PATH="${SWIFT_ROOT_DIR}/usr/bin:${PATH}" + # dispatch build + - sudo apt-get install clang autoconf libtool pkg-config systemtap-sdt-dev libblocksruntime-dev libkqueue-dev libpthread-workqueue-dev libbsd-dev git make + - git clone -b experimental/foundation https://github.com/apple/swift-corelibs-libdispatch.git + - cd swift-corelibs-libdispatch + - git submodule init + - git submodule update + - sh ./autogen.sh + - ./configure --with-swift-toolchain="${SWIFT_ROOT_DIR}/usr" --prefix="${SWIFT_ROOT_DIR}/usr" + - make && make install + - cd .. + # libuv v1 + - sudo add-apt-repository ppa:swiftexpress/swiftexpress --yes + - sudo apt-get update + - sudo apt-get install libuv1-dev # get back home - cd $MODULE_NAME # get crossroad build script diff --git a/Cartfile b/Cartfile index a4f1358..5fb2263 100644 --- a/Cartfile +++ b/Cartfile @@ -1 +1,3 @@ -github "crossroadlabs/Result" ~> 1.0 +github "antitypical/Result" ~> 2.0 +github "crossroadlabs/Boilerplate" ~> 0.1 +github "crossroadlabs/RunLoop" "master" diff --git a/Cartfile.private b/Cartfile.private new file mode 100644 index 0000000..b9072c0 --- /dev/null +++ b/Cartfile.private @@ -0,0 +1 @@ +github "crossroadlabs/XCTest3" ~> 0.1 diff --git a/ExecutionContext.podspec b/ExecutionContext.podspec new file mode 100644 index 0000000..5e687ba --- /dev/null +++ b/ExecutionContext.podspec @@ -0,0 +1,25 @@ +Pod::Spec.new do |s| + s.name = "ExecutionContext" + s.version = "0.4.0" + s.license = { :type => "Apache 2", :file => "LICENSE" } + s.summary = "Execution context: object oriented, cross platform, user friendly replacement of Dispatch" + s.homepage = "https://github.com/reactive-swift/ExecutionContext" + s.social_media_url = "https://github.com/reactive-swift/ExecutionContext" + s.authors = { "Daniel Leping" => "daniel@crossroadlabs.xyz" } + + s.source = { :git => "https://github.com/reactive-swift/ExecutionContext.git", :tag => "#{s.version}", :branch => 'develop' } + + s.ios.deployment_target = "8.0" + s.osx.deployment_target = "10.10" + s.watchos.deployment_target = "2.0" + s.tvos.deployment_target = "9.0" + + s.source_files = "ExecutionContext/*.swift" + + s.dependency 'Result', '~> 2.0' + s.dependency 'Boilerplate', '~> 0.1' + s.dependency 'RunLoop', '~> 0.1.1' + + s.requires_arc = true + +end diff --git a/ExecutionContext.xcodeproj/project.pbxproj b/ExecutionContext.xcodeproj/project.pbxproj index 8030b62..c18f10a 100644 --- a/ExecutionContext.xcodeproj/project.pbxproj +++ b/ExecutionContext.xcodeproj/project.pbxproj @@ -7,115 +7,155 @@ objects = { /* Begin PBXBuildFile section */ - 658566A31C7CAEE3003B0E08 /* LoopSemaphore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 658566A21C7CAEE3003B0E08 /* LoopSemaphore.swift */; }; - 659E80891C77450200DE85B1 /* ExecutionContext.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 659E807E1C77450200DE85B1 /* ExecutionContext.framework */; }; - 659E808E1C77450200DE85B1 /* ExecutionContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E808D1C77450200DE85B1 /* ExecutionContextTests.swift */; }; - 659E809E1C77457E00DE85B1 /* DefaultExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E80981C77457E00DE85B1 /* DefaultExecutionContext.swift */; }; - 659E809F1C77457E00DE85B1 /* DispatchExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E80991C77457E00DE85B1 /* DispatchExecutionContext.swift */; }; - 659E80A01C77457E00DE85B1 /* ExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809A1C77457E00DE85B1 /* ExecutionContext.swift */; }; - 659E80A11C77457E00DE85B1 /* ImmediateExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809B1C77457E00DE85B1 /* ImmediateExecutionContext.swift */; }; - 659E80A21C77457E00DE85B1 /* PThreadExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809C1C77457E00DE85B1 /* PThreadExecutionContext.swift */; }; - 659E80A31C77457E00DE85B1 /* Result+Some.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809D1C77457E00DE85B1 /* Result+Some.swift */; }; - 659E80CA1C78A47800DE85B1 /* ExecutionContext.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 659E80C01C78A47800DE85B1 /* ExecutionContext.framework */; }; - 659E80D71C78A4AB00DE85B1 /* ExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809A1C77457E00DE85B1 /* ExecutionContext.swift */; }; - 659E80D81C78A4AF00DE85B1 /* DefaultExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E80981C77457E00DE85B1 /* DefaultExecutionContext.swift */; }; - 659E80D91C78A4B200DE85B1 /* DispatchExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E80991C77457E00DE85B1 /* DispatchExecutionContext.swift */; }; - 659E80DA1C78A4B500DE85B1 /* PThreadExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809C1C77457E00DE85B1 /* PThreadExecutionContext.swift */; }; - 659E80DB1C78A4B800DE85B1 /* ImmediateExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809B1C77457E00DE85B1 /* ImmediateExecutionContext.swift */; }; - 659E80DC1C78A4BC00DE85B1 /* Result+Some.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809D1C77457E00DE85B1 /* Result+Some.swift */; }; - 659E80DD1C78A4F000DE85B1 /* ExecutionContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E808D1C77450200DE85B1 /* ExecutionContextTests.swift */; }; - 659E81121C78A71F00DE85B1 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 659E80E31C78A70700DE85B1 /* Result.framework */; }; - 659E81131C78A72C00DE85B1 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 659E80E61C78A70700DE85B1 /* Result.framework */; }; - 65E646DD1C79949C0036D028 /* CustomExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E646DC1C79949C0036D028 /* CustomExecutionContext.swift */; }; - 65E646DE1C7994A00036D028 /* CustomExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E646DC1C79949C0036D028 /* CustomExecutionContext.swift */; }; - 65E646DF1C7994A10036D028 /* CustomExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E646DC1C79949C0036D028 /* CustomExecutionContext.swift */; }; - 65E646E01C7994A20036D028 /* CustomExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E646DC1C79949C0036D028 /* CustomExecutionContext.swift */; }; - 65E646F21C79E0590036D028 /* Semaphore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E646F11C79E0580036D028 /* Semaphore.swift */; }; - 65E646F31C79E0590036D028 /* Semaphore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E646F11C79E0580036D028 /* Semaphore.swift */; }; - 65E646F41C79E0590036D028 /* Semaphore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E646F11C79E0580036D028 /* Semaphore.swift */; }; - 65E646F51C79E0590036D028 /* Semaphore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E646F11C79E0580036D028 /* Semaphore.swift */; }; - 65FB86901C78A8330005CD1B /* Result.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 659E80E61C78A70700DE85B1 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 65FB86921C78A8D30005CD1B /* Result.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 659E80E31C78A70700DE85B1 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 65FB86A21C78AA400005CD1B /* ExecutionContext.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65FB86981C78AA400005CD1B /* ExecutionContext.framework */; }; - 65FB86AF1C78AADB0005CD1B /* ExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809A1C77457E00DE85B1 /* ExecutionContext.swift */; }; - 65FB86B01C78AAE00005CD1B /* DefaultExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E80981C77457E00DE85B1 /* DefaultExecutionContext.swift */; }; - 65FB86B11C78AAE50005CD1B /* DispatchExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E80991C77457E00DE85B1 /* DispatchExecutionContext.swift */; }; - 65FB86B21C78AAE50005CD1B /* PThreadExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809C1C77457E00DE85B1 /* PThreadExecutionContext.swift */; }; - 65FB86B31C78AAE50005CD1B /* ImmediateExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809B1C77457E00DE85B1 /* ImmediateExecutionContext.swift */; }; - 65FB86B41C78AAE50005CD1B /* Result+Some.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809D1C77457E00DE85B1 /* Result+Some.swift */; }; - 65FB86B51C78AAEC0005CD1B /* ExecutionContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E808D1C77450200DE85B1 /* ExecutionContextTests.swift */; }; - 65FB86B61C78AB290005CD1B /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 659E80EB1C78A70700DE85B1 /* Result.framework */; }; - 65FB86B81C78AB4E0005CD1B /* Result.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 659E80EB1C78A70700DE85B1 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 65FB86C61C78AC8B0005CD1B /* ExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809A1C77457E00DE85B1 /* ExecutionContext.swift */; }; - 65FB86C71C78AC8B0005CD1B /* DefaultExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E80981C77457E00DE85B1 /* DefaultExecutionContext.swift */; }; - 65FB86C81C78AC8B0005CD1B /* DispatchExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E80991C77457E00DE85B1 /* DispatchExecutionContext.swift */; }; - 65FB86C91C78AC8B0005CD1B /* PThreadExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809C1C77457E00DE85B1 /* PThreadExecutionContext.swift */; }; - 65FB86CA1C78AC8B0005CD1B /* ImmediateExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809B1C77457E00DE85B1 /* ImmediateExecutionContext.swift */; }; - 65FB86CB1C78AC8B0005CD1B /* Result+Some.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E809D1C77457E00DE85B1 /* Result+Some.swift */; }; - 65FB86CC1C78ACAE0005CD1B /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 659E80F01C78A70700DE85B1 /* Result.framework */; }; - 963ED1C71C81E491002351EE /* LoopSemaphore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 658566A21C7CAEE3003B0E08 /* LoopSemaphore.swift */; }; - 963ED1C81C81E49E002351EE /* LoopSemaphore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 658566A21C7CAEE3003B0E08 /* LoopSemaphore.swift */; }; - 963ED1C91C81E4A4002351EE /* LoopSemaphore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 658566A21C7CAEE3003B0E08 /* LoopSemaphore.swift */; }; - 9678EA2D1C7B22DC00E39B17 /* RunLoop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9678EA2C1C7B22DC00E39B17 /* RunLoop.swift */; }; - 9678EA2E1C7B22DC00E39B17 /* RunLoop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9678EA2C1C7B22DC00E39B17 /* RunLoop.swift */; }; - 9678EA2F1C7B22DC00E39B17 /* RunLoop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9678EA2C1C7B22DC00E39B17 /* RunLoop.swift */; }; - 9678EA301C7B22DC00E39B17 /* RunLoop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9678EA2C1C7B22DC00E39B17 /* RunLoop.swift */; }; + 65D637891C943764000F5548 /* ExecutionContext.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65D6377E1C943764000F5548 /* ExecutionContext.framework */; }; + 65D6379E1C9437BB000F5548 /* CustomExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D637981C9437BB000F5548 /* CustomExecutionContext.swift */; }; + 65D6379F1C9437BB000F5548 /* DefaultExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D637991C9437BB000F5548 /* DefaultExecutionContext.swift */; }; + 65D637A01C9437BB000F5548 /* DispatchExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379A1C9437BB000F5548 /* DispatchExecutionContext.swift */; }; + 65D637A11C9437BB000F5548 /* ExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379B1C9437BB000F5548 /* ExecutionContext.swift */; }; + 65D637A21C9437BB000F5548 /* ImmediateExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379C1C9437BB000F5548 /* ImmediateExecutionContext.swift */; }; + 65D637A31C9437BB000F5548 /* RunLoopExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379D1C9437BB000F5548 /* RunLoopExecutionContext.swift */; }; + 65D637A51C9437F4000F5548 /* ExecutionContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D637A41C9437F4000F5548 /* ExecutionContextTests.swift */; }; + 65FD8EC01CD9BC340046D5D6 /* ExecutionContextTenant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65FD8EBF1CD9BC340046D5D6 /* ExecutionContextTenant.swift */; }; + 65FD8EC11CD9BC340046D5D6 /* ExecutionContextTenant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65FD8EBF1CD9BC340046D5D6 /* ExecutionContextTenant.swift */; }; + 65FD8EC21CD9BC340046D5D6 /* ExecutionContextTenant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65FD8EBF1CD9BC340046D5D6 /* ExecutionContextTenant.swift */; }; + 65FD8EC31CD9BC340046D5D6 /* ExecutionContextTenant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65FD8EBF1CD9BC340046D5D6 /* ExecutionContextTenant.swift */; }; + 92E4091A1CBC32F2001ED069 /* ExecutionContext.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409101CBC32F2001ED069 /* ExecutionContext.framework */; }; + 92E409271CBC3369001ED069 /* ExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379B1C9437BB000F5548 /* ExecutionContext.swift */; }; + 92E409281CBC336D001ED069 /* CustomExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D637981C9437BB000F5548 /* CustomExecutionContext.swift */; }; + 92E409291CBC3371001ED069 /* DefaultExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D637991C9437BB000F5548 /* DefaultExecutionContext.swift */; }; + 92E4092A1CBC3374001ED069 /* DispatchExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379A1C9437BB000F5548 /* DispatchExecutionContext.swift */; }; + 92E4092B1CBC3378001ED069 /* ImmediateExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379C1C9437BB000F5548 /* ImmediateExecutionContext.swift */; }; + 92E4092C1CBC337B001ED069 /* RunLoopExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379D1C9437BB000F5548 /* RunLoopExecutionContext.swift */; }; + 92E409361CBC3427001ED069 /* Boilerplate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4092E1CBC33F9001ED069 /* Boilerplate.framework */; }; + 92E409371CBC3427001ED069 /* Foundation3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4092F1CBC33F9001ED069 /* Foundation3.framework */; }; + 92E409381CBC3427001ED069 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409301CBC33F9001ED069 /* Result.framework */; }; + 92E4093A1CBC3428001ED069 /* Boilerplate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4092E1CBC33F9001ED069 /* Boilerplate.framework */; }; + 92E4093B1CBC3428001ED069 /* Foundation3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4092F1CBC33F9001ED069 /* Foundation3.framework */; }; + 92E4093C1CBC3428001ED069 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409301CBC33F9001ED069 /* Result.framework */; }; + 92E4093D1CBC3428001ED069 /* XCTest3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409311CBC33F9001ED069 /* XCTest3.framework */; }; + 92E409441CBC344D001ED069 /* Boilerplate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4093E1CBC344D001ED069 /* Boilerplate.framework */; }; + 92E409451CBC344D001ED069 /* Foundation3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4093F1CBC344D001ED069 /* Foundation3.framework */; }; + 92E409461CBC344D001ED069 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409401CBC344D001ED069 /* Result.framework */; }; + 92E409471CBC344D001ED069 /* RunLoop.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409411CBC344D001ED069 /* RunLoop.framework */; }; + 92E409481CBC344D001ED069 /* UV.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409421CBC344D001ED069 /* UV.framework */; }; + 92E4094A1CBC3455001ED069 /* XCTest3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409431CBC344D001ED069 /* XCTest3.framework */; }; + 92E4094B1CBC345A001ED069 /* Boilerplate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4093E1CBC344D001ED069 /* Boilerplate.framework */; }; + 92E4094C1CBC345A001ED069 /* Foundation3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4093F1CBC344D001ED069 /* Foundation3.framework */; }; + 92E4094D1CBC345A001ED069 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409401CBC344D001ED069 /* Result.framework */; }; + 92E4094E1CBC345A001ED069 /* RunLoop.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409411CBC344D001ED069 /* RunLoop.framework */; }; + 92E4094F1CBC345A001ED069 /* UV.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409421CBC344D001ED069 /* UV.framework */; }; + 92E409501CBC3474001ED069 /* Boilerplate.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4093E1CBC344D001ED069 /* Boilerplate.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E409511CBC3474001ED069 /* Foundation3.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4093F1CBC344D001ED069 /* Foundation3.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E409521CBC3474001ED069 /* Result.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409401CBC344D001ED069 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E409531CBC3474001ED069 /* RunLoop.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409411CBC344D001ED069 /* RunLoop.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E409541CBC3474001ED069 /* UV.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409421CBC344D001ED069 /* UV.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E409551CBC3474001ED069 /* XCTest3.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409431CBC344D001ED069 /* XCTest3.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E409571CBC3495001ED069 /* Boilerplate.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4092E1CBC33F9001ED069 /* Boilerplate.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E409581CBC3495001ED069 /* Foundation3.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E4092F1CBC33F9001ED069 /* Foundation3.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E409591CBC3495001ED069 /* Result.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409301CBC33F9001ED069 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E4095A1CBC3495001ED069 /* XCTest3.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409311CBC33F9001ED069 /* XCTest3.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E409F01CC10545001ED069 /* RunLoop.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409EE1CC10541001ED069 /* RunLoop.framework */; }; + 92E409F11CC10546001ED069 /* RunLoop.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409EE1CC10541001ED069 /* RunLoop.framework */; }; + 92E409F21CC10552001ED069 /* RunLoop.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409EE1CC10541001ED069 /* RunLoop.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E40A021CC10677001ED069 /* ExecutionContext.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E409F81CC10677001ED069 /* ExecutionContext.framework */; }; + 92E40A0F1CC10713001ED069 /* ExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379B1C9437BB000F5548 /* ExecutionContext.swift */; }; + 92E40A101CC10713001ED069 /* CustomExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D637981C9437BB000F5548 /* CustomExecutionContext.swift */; }; + 92E40A111CC10713001ED069 /* DefaultExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D637991C9437BB000F5548 /* DefaultExecutionContext.swift */; }; + 92E40A121CC10713001ED069 /* DispatchExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379A1C9437BB000F5548 /* DispatchExecutionContext.swift */; }; + 92E40A131CC10713001ED069 /* ImmediateExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379C1C9437BB000F5548 /* ImmediateExecutionContext.swift */; }; + 92E40A141CC10713001ED069 /* RunLoopExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379D1C9437BB000F5548 /* RunLoopExecutionContext.swift */; }; + 92E40A151CC10717001ED069 /* ExecutionContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D637A41C9437F4000F5548 /* ExecutionContextTests.swift */; }; + 92E40A161CC10718001ED069 /* ExecutionContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D637A41C9437F4000F5548 /* ExecutionContextTests.swift */; }; + 92E40A1C1CC10761001ED069 /* Boilerplate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A181CC10761001ED069 /* Boilerplate.framework */; }; + 92E40A1D1CC10761001ED069 /* Boilerplate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A181CC10761001ED069 /* Boilerplate.framework */; }; + 92E40A1E1CC10761001ED069 /* Foundation3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A191CC10761001ED069 /* Foundation3.framework */; }; + 92E40A1F1CC10761001ED069 /* Foundation3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A191CC10761001ED069 /* Foundation3.framework */; }; + 92E40A201CC10761001ED069 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A1A1CC10761001ED069 /* Result.framework */; }; + 92E40A211CC10761001ED069 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A1A1CC10761001ED069 /* Result.framework */; }; + 92E40A221CC10761001ED069 /* RunLoop.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A1B1CC10761001ED069 /* RunLoop.framework */; }; + 92E40A231CC10761001ED069 /* RunLoop.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A1B1CC10761001ED069 /* RunLoop.framework */; }; + 92E40A251CC1079D001ED069 /* Boilerplate.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A181CC10761001ED069 /* Boilerplate.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E40A261CC1079D001ED069 /* Foundation3.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A191CC10761001ED069 /* Foundation3.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E40A271CC1079D001ED069 /* Result.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A1A1CC10761001ED069 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E40A281CC1079D001ED069 /* RunLoop.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A1B1CC10761001ED069 /* RunLoop.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 92E40A361CC10816001ED069 /* ExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379B1C9437BB000F5548 /* ExecutionContext.swift */; }; + 92E40A371CC10816001ED069 /* CustomExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D637981C9437BB000F5548 /* CustomExecutionContext.swift */; }; + 92E40A381CC10816001ED069 /* DefaultExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D637991C9437BB000F5548 /* DefaultExecutionContext.swift */; }; + 92E40A391CC10816001ED069 /* DispatchExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379A1C9437BB000F5548 /* DispatchExecutionContext.swift */; }; + 92E40A3A1CC10816001ED069 /* ImmediateExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379C1C9437BB000F5548 /* ImmediateExecutionContext.swift */; }; + 92E40A3B1CC10816001ED069 /* RunLoopExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6379D1C9437BB000F5548 /* RunLoopExecutionContext.swift */; }; + 92E40A411CC10895001ED069 /* Boilerplate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A3D1CC10895001ED069 /* Boilerplate.framework */; }; + 92E40A421CC10895001ED069 /* Foundation3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A3E1CC10895001ED069 /* Foundation3.framework */; }; + 92E40A431CC10895001ED069 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A3F1CC10895001ED069 /* Result.framework */; }; + 92E40A441CC10895001ED069 /* RunLoop.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92E40A401CC10895001ED069 /* RunLoop.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 659E808A1C77450200DE85B1 /* PBXContainerItemProxy */ = { + 65D6378A1C943764000F5548 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 659E80751C77450200DE85B1 /* Project object */; + containerPortal = 65D637751C943763000F5548 /* Project object */; proxyType = 1; - remoteGlobalIDString = 659E807D1C77450200DE85B1; + remoteGlobalIDString = 65D6377D1C943763000F5548; remoteInfo = ExecutionContext; }; - 659E80CB1C78A47800DE85B1 /* PBXContainerItemProxy */ = { + 92E4091B1CBC32F2001ED069 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 659E80751C77450200DE85B1 /* Project object */; + containerPortal = 65D637751C943763000F5548 /* Project object */; proxyType = 1; - remoteGlobalIDString = 659E80BF1C78A47800DE85B1; - remoteInfo = ExecutionContext; + remoteGlobalIDString = 92E4090F1CBC32F2001ED069; + remoteInfo = "ExecutionContext-iOS"; }; - 65FB86A31C78AA400005CD1B /* PBXContainerItemProxy */ = { + 92E40A031CC10677001ED069 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 659E80751C77450200DE85B1 /* Project object */; + containerPortal = 65D637751C943763000F5548 /* Project object */; proxyType = 1; - remoteGlobalIDString = 65FB86971C78AA400005CD1B; + remoteGlobalIDString = 92E409F71CC10677001ED069; remoteInfo = ExecutionContext; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 659E80A81C7746BA00DE85B1 /* Copy Frameworks */ = { + 65D637BC1C943872000F5548 /* Copy Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - 65FB86901C78A8330005CD1B /* Result.framework in Copy Frameworks */, + 92E409501CBC3474001ED069 /* Boilerplate.framework in Copy Frameworks */, + 92E409511CBC3474001ED069 /* Foundation3.framework in Copy Frameworks */, + 92E409521CBC3474001ED069 /* Result.framework in Copy Frameworks */, + 92E409531CBC3474001ED069 /* RunLoop.framework in Copy Frameworks */, + 92E409541CBC3474001ED069 /* UV.framework in Copy Frameworks */, + 92E409551CBC3474001ED069 /* XCTest3.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 65FB86911C78A8C00005CD1B /* Copy Frameworks */ = { + 92E409561CBC3485001ED069 /* Copy Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - 65FB86921C78A8D30005CD1B /* Result.framework in Copy Frameworks */, + 92E409571CBC3495001ED069 /* Boilerplate.framework in Copy Frameworks */, + 92E409581CBC3495001ED069 /* Foundation3.framework in Copy Frameworks */, + 92E409591CBC3495001ED069 /* Result.framework in Copy Frameworks */, + 92E409F21CC10552001ED069 /* RunLoop.framework in Copy Frameworks */, + 92E4095A1CBC3495001ED069 /* XCTest3.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 65FB86B71C78AB3C0005CD1B /* Copy Frameworks */ = { + 92E40A241CC1078D001ED069 /* Copy Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - 65FB86B81C78AB4E0005CD1B /* Result.framework in Copy Frameworks */, + 92E40A251CC1079D001ED069 /* Boilerplate.framework in Copy Frameworks */, + 92E40A261CC1079D001ED069 /* Foundation3.framework in Copy Frameworks */, + 92E40A271CC1079D001ED069 /* Result.framework in Copy Frameworks */, + 92E40A281CC1079D001ED069 /* RunLoop.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -123,240 +163,265 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 658566A21C7CAEE3003B0E08 /* LoopSemaphore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoopSemaphore.swift; sourceTree = ""; }; - 659E807E1C77450200DE85B1 /* ExecutionContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExecutionContext.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 659E80831C77450200DE85B1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 659E80881C77450200DE85B1 /* ExecutionContextTests-OSX.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ExecutionContextTests-OSX.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 659E808D1C77450200DE85B1 /* ExecutionContextTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExecutionContextTests.swift; sourceTree = ""; }; - 659E808F1C77450200DE85B1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 659E80981C77457E00DE85B1 /* DefaultExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultExecutionContext.swift; sourceTree = ""; }; - 659E80991C77457E00DE85B1 /* DispatchExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DispatchExecutionContext.swift; sourceTree = ""; }; - 659E809A1C77457E00DE85B1 /* ExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExecutionContext.swift; sourceTree = ""; }; - 659E809B1C77457E00DE85B1 /* ImmediateExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImmediateExecutionContext.swift; sourceTree = ""; }; - 659E809C1C77457E00DE85B1 /* PThreadExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PThreadExecutionContext.swift; sourceTree = ""; }; - 659E809D1C77457E00DE85B1 /* Result+Some.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Result+Some.swift"; sourceTree = ""; }; - 659E80C01C78A47800DE85B1 /* ExecutionContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExecutionContext.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 659E80C91C78A47800DE85B1 /* ExecutionContextTests-iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ExecutionContextTests-iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 659E80DF1C78A70700DE85B1 /* 5DAA48E3-5755-35D2-AB25-E1F30299A0F7.bcsymbolmap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "5DAA48E3-5755-35D2-AB25-E1F30299A0F7.bcsymbolmap"; sourceTree = ""; }; - 659E80E01C78A70700DE85B1 /* 790F29BC-8E9F-3D46-B492-07898513A87F.bcsymbolmap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "790F29BC-8E9F-3D46-B492-07898513A87F.bcsymbolmap"; sourceTree = ""; }; - 659E80E11C78A70700DE85B1 /* 9C700391-4B46-36F8-B936-005B49EBCAFB.bcsymbolmap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "9C700391-4B46-36F8-B936-005B49EBCAFB.bcsymbolmap"; sourceTree = ""; }; - 659E80E21C78A70700DE85B1 /* B143BCB0-79DF-31AA-AC9C-7ED9E261D87D.bcsymbolmap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "B143BCB0-79DF-31AA-AC9C-7ED9E261D87D.bcsymbolmap"; sourceTree = ""; }; - 659E80E31C78A70700DE85B1 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; - 659E80E41C78A70700DE85B1 /* Result.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; path = Result.framework.dSYM; sourceTree = ""; }; - 659E80E61C78A70700DE85B1 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; - 659E80E71C78A70700DE85B1 /* Result.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; path = Result.framework.dSYM; sourceTree = ""; }; - 659E80E91C78A70700DE85B1 /* B664D9B2-6E95-32DB-AE17-189723115AE7.bcsymbolmap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "B664D9B2-6E95-32DB-AE17-189723115AE7.bcsymbolmap"; sourceTree = ""; }; - 659E80EA1C78A70700DE85B1 /* EFEDA4F1-6B1F-3501-98EF-3133DB0026EA.bcsymbolmap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "EFEDA4F1-6B1F-3501-98EF-3133DB0026EA.bcsymbolmap"; sourceTree = ""; }; - 659E80EB1C78A70700DE85B1 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; - 659E80EC1C78A70700DE85B1 /* Result.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; path = Result.framework.dSYM; sourceTree = ""; }; - 659E80EE1C78A70700DE85B1 /* 14121FE4-824C-3F41-BB65-EFAE120D2446.bcsymbolmap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "14121FE4-824C-3F41-BB65-EFAE120D2446.bcsymbolmap"; sourceTree = ""; }; - 659E80EF1C78A70700DE85B1 /* B2361319-6010-3366-BA4B-B28167D21368.bcsymbolmap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "B2361319-6010-3366-BA4B-B28167D21368.bcsymbolmap"; sourceTree = ""; }; - 659E80F01C78A70700DE85B1 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; - 659E80F11C78A70700DE85B1 /* Result.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; path = Result.framework.dSYM; sourceTree = ""; }; - 65E646DC1C79949C0036D028 /* CustomExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomExecutionContext.swift; sourceTree = ""; }; - 65E646F11C79E0580036D028 /* Semaphore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Semaphore.swift; sourceTree = ""; }; - 65FB86981C78AA400005CD1B /* ExecutionContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExecutionContext.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 65FB86A11C78AA400005CD1B /* ExecutionContextTests-tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ExecutionContextTests-tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 65FB86BE1C78AC260005CD1B /* ExecutionContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExecutionContext.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9678EA2C1C7B22DC00E39B17 /* RunLoop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RunLoop.swift; sourceTree = ""; }; + 65D6377E1C943764000F5548 /* ExecutionContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExecutionContext.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 65D637831C943764000F5548 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 65D637881C943764000F5548 /* ExecutionContextTests-OSX.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ExecutionContextTests-OSX.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 65D6378F1C943764000F5548 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 65D637981C9437BB000F5548 /* CustomExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomExecutionContext.swift; sourceTree = ""; }; + 65D637991C9437BB000F5548 /* DefaultExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultExecutionContext.swift; sourceTree = ""; }; + 65D6379A1C9437BB000F5548 /* DispatchExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DispatchExecutionContext.swift; sourceTree = ""; }; + 65D6379B1C9437BB000F5548 /* ExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExecutionContext.swift; sourceTree = ""; }; + 65D6379C1C9437BB000F5548 /* ImmediateExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImmediateExecutionContext.swift; sourceTree = ""; }; + 65D6379D1C9437BB000F5548 /* RunLoopExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RunLoopExecutionContext.swift; sourceTree = ""; }; + 65D637A41C9437F4000F5548 /* ExecutionContextTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExecutionContextTests.swift; sourceTree = ""; }; + 65FD8EBF1CD9BC340046D5D6 /* ExecutionContextTenant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExecutionContextTenant.swift; sourceTree = ""; }; + 92E409101CBC32F2001ED069 /* ExecutionContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExecutionContext.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 92E409191CBC32F2001ED069 /* ExecutionContextTests-iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ExecutionContextTests-iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 92E4092E1CBC33F9001ED069 /* Boilerplate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Boilerplate.framework; sourceTree = ""; }; + 92E4092F1CBC33F9001ED069 /* Foundation3.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Foundation3.framework; sourceTree = ""; }; + 92E409301CBC33F9001ED069 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; + 92E409311CBC33F9001ED069 /* XCTest3.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = XCTest3.framework; sourceTree = ""; }; + 92E4093E1CBC344D001ED069 /* Boilerplate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Boilerplate.framework; sourceTree = ""; }; + 92E4093F1CBC344D001ED069 /* Foundation3.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Foundation3.framework; sourceTree = ""; }; + 92E409401CBC344D001ED069 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; + 92E409411CBC344D001ED069 /* RunLoop.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RunLoop.framework; sourceTree = ""; }; + 92E409421CBC344D001ED069 /* UV.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UV.framework; sourceTree = ""; }; + 92E409431CBC344D001ED069 /* XCTest3.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = XCTest3.framework; sourceTree = ""; }; + 92E409EE1CC10541001ED069 /* RunLoop.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RunLoop.framework; sourceTree = ""; }; + 92E409F81CC10677001ED069 /* ExecutionContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExecutionContext.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 92E40A011CC10677001ED069 /* ExecutionContextTests-tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ExecutionContextTests-tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 92E40A181CC10761001ED069 /* Boilerplate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Boilerplate.framework; sourceTree = ""; }; + 92E40A191CC10761001ED069 /* Foundation3.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Foundation3.framework; sourceTree = ""; }; + 92E40A1A1CC10761001ED069 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; + 92E40A1B1CC10761001ED069 /* RunLoop.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RunLoop.framework; sourceTree = ""; }; + 92E40A2E1CC107D0001ED069 /* ExecutionContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExecutionContext.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 92E40A3D1CC10895001ED069 /* Boilerplate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Boilerplate.framework; sourceTree = ""; }; + 92E40A3E1CC10895001ED069 /* Foundation3.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Foundation3.framework; sourceTree = ""; }; + 92E40A3F1CC10895001ED069 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; + 92E40A401CC10895001ED069 /* RunLoop.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RunLoop.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 659E807A1C77450200DE85B1 /* Frameworks */ = { + 65D6377A1C943763000F5548 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 659E81131C78A72C00DE85B1 /* Result.framework in Frameworks */, + 92E409471CBC344D001ED069 /* RunLoop.framework in Frameworks */, + 92E409461CBC344D001ED069 /* Result.framework in Frameworks */, + 92E409441CBC344D001ED069 /* Boilerplate.framework in Frameworks */, + 92E409451CBC344D001ED069 /* Foundation3.framework in Frameworks */, + 92E409481CBC344D001ED069 /* UV.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 659E80851C77450200DE85B1 /* Frameworks */ = { + 65D637851C943764000F5548 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 659E80891C77450200DE85B1 /* ExecutionContext.framework in Frameworks */, + 92E4094F1CBC345A001ED069 /* UV.framework in Frameworks */, + 92E4094E1CBC345A001ED069 /* RunLoop.framework in Frameworks */, + 65D637891C943764000F5548 /* ExecutionContext.framework in Frameworks */, + 92E4094B1CBC345A001ED069 /* Boilerplate.framework in Frameworks */, + 92E4094D1CBC345A001ED069 /* Result.framework in Frameworks */, + 92E4094A1CBC3455001ED069 /* XCTest3.framework in Frameworks */, + 92E4094C1CBC345A001ED069 /* Foundation3.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 659E80BC1C78A47800DE85B1 /* Frameworks */ = { + 92E4090C1CBC32F2001ED069 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 659E81121C78A71F00DE85B1 /* Result.framework in Frameworks */, + 92E409F01CC10545001ED069 /* RunLoop.framework in Frameworks */, + 92E409381CBC3427001ED069 /* Result.framework in Frameworks */, + 92E409361CBC3427001ED069 /* Boilerplate.framework in Frameworks */, + 92E409371CBC3427001ED069 /* Foundation3.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 659E80C61C78A47800DE85B1 /* Frameworks */ = { + 92E409161CBC32F2001ED069 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 659E80CA1C78A47800DE85B1 /* ExecutionContext.framework in Frameworks */, + 92E409F11CC10546001ED069 /* RunLoop.framework in Frameworks */, + 92E4093B1CBC3428001ED069 /* Foundation3.framework in Frameworks */, + 92E4093D1CBC3428001ED069 /* XCTest3.framework in Frameworks */, + 92E4093A1CBC3428001ED069 /* Boilerplate.framework in Frameworks */, + 92E4091A1CBC32F2001ED069 /* ExecutionContext.framework in Frameworks */, + 92E4093C1CBC3428001ED069 /* Result.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 65FB86941C78AA400005CD1B /* Frameworks */ = { + 92E409F41CC10677001ED069 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 65FB86B61C78AB290005CD1B /* Result.framework in Frameworks */, + 92E40A221CC10761001ED069 /* RunLoop.framework in Frameworks */, + 92E40A201CC10761001ED069 /* Result.framework in Frameworks */, + 92E40A1C1CC10761001ED069 /* Boilerplate.framework in Frameworks */, + 92E40A1E1CC10761001ED069 /* Foundation3.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 65FB869E1C78AA400005CD1B /* Frameworks */ = { + 92E409FE1CC10677001ED069 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 65FB86A21C78AA400005CD1B /* ExecutionContext.framework in Frameworks */, + 92E40A1F1CC10761001ED069 /* Foundation3.framework in Frameworks */, + 92E40A1D1CC10761001ED069 /* Boilerplate.framework in Frameworks */, + 92E40A231CC10761001ED069 /* RunLoop.framework in Frameworks */, + 92E40A021CC10677001ED069 /* ExecutionContext.framework in Frameworks */, + 92E40A211CC10761001ED069 /* Result.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 65FB86BA1C78AC260005CD1B /* Frameworks */ = { + 92E40A2A1CC107D0001ED069 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 65FB86CC1C78ACAE0005CD1B /* Result.framework in Frameworks */, + 92E40A441CC10895001ED069 /* RunLoop.framework in Frameworks */, + 92E40A431CC10895001ED069 /* Result.framework in Frameworks */, + 92E40A411CC10895001ED069 /* Boilerplate.framework in Frameworks */, + 92E40A421CC10895001ED069 /* Foundation3.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 659E80741C77450200DE85B1 = { + 65D637741C943763000F5548 = { isa = PBXGroup; children = ( - 659E80801C77450200DE85B1 /* ExecutionContext */, - 659E808C1C77450200DE85B1 /* ExecutionContextTests */, - 659E807F1C77450200DE85B1 /* Products */, - 659E80A61C77467600DE85B1 /* Frameworks */, + 65D637801C943764000F5548 /* ExecutionContext */, + 65D6378C1C943764000F5548 /* ExecutionContextTests */, + 65D637A61C94383C000F5548 /* Frameworks */, + 65D6377F1C943764000F5548 /* Products */, ); sourceTree = ""; }; - 659E807F1C77450200DE85B1 /* Products */ = { + 65D6377F1C943764000F5548 /* Products */ = { isa = PBXGroup; children = ( - 659E807E1C77450200DE85B1 /* ExecutionContext.framework */, - 659E80881C77450200DE85B1 /* ExecutionContextTests-OSX.xctest */, - 659E80C01C78A47800DE85B1 /* ExecutionContext.framework */, - 659E80C91C78A47800DE85B1 /* ExecutionContextTests-iOS.xctest */, - 65FB86981C78AA400005CD1B /* ExecutionContext.framework */, - 65FB86A11C78AA400005CD1B /* ExecutionContextTests-tvOS.xctest */, - 65FB86BE1C78AC260005CD1B /* ExecutionContext.framework */, + 65D6377E1C943764000F5548 /* ExecutionContext.framework */, + 65D637881C943764000F5548 /* ExecutionContextTests-OSX.xctest */, + 92E409101CBC32F2001ED069 /* ExecutionContext.framework */, + 92E409191CBC32F2001ED069 /* ExecutionContextTests-iOS.xctest */, + 92E409F81CC10677001ED069 /* ExecutionContext.framework */, + 92E40A011CC10677001ED069 /* ExecutionContextTests-tvOS.xctest */, + 92E40A2E1CC107D0001ED069 /* ExecutionContext.framework */, ); name = Products; sourceTree = ""; }; - 659E80801C77450200DE85B1 /* ExecutionContext */ = { + 65D637801C943764000F5548 /* ExecutionContext */ = { isa = PBXGroup; children = ( - 659E809A1C77457E00DE85B1 /* ExecutionContext.swift */, - 659E80981C77457E00DE85B1 /* DefaultExecutionContext.swift */, - 659E80991C77457E00DE85B1 /* DispatchExecutionContext.swift */, - 659E809C1C77457E00DE85B1 /* PThreadExecutionContext.swift */, - 9678EA2C1C7B22DC00E39B17 /* RunLoop.swift */, - 659E809B1C77457E00DE85B1 /* ImmediateExecutionContext.swift */, - 65E646DC1C79949C0036D028 /* CustomExecutionContext.swift */, - 659E809D1C77457E00DE85B1 /* Result+Some.swift */, - 65E646F11C79E0580036D028 /* Semaphore.swift */, - 659E80831C77450200DE85B1 /* Info.plist */, - 658566A21C7CAEE3003B0E08 /* LoopSemaphore.swift */, + 65D6379B1C9437BB000F5548 /* ExecutionContext.swift */, + 65D637981C9437BB000F5548 /* CustomExecutionContext.swift */, + 65D637991C9437BB000F5548 /* DefaultExecutionContext.swift */, + 65D6379A1C9437BB000F5548 /* DispatchExecutionContext.swift */, + 65D6379C1C9437BB000F5548 /* ImmediateExecutionContext.swift */, + 65D6379D1C9437BB000F5548 /* RunLoopExecutionContext.swift */, + 65FD8EBF1CD9BC340046D5D6 /* ExecutionContextTenant.swift */, + 65D637831C943764000F5548 /* Info.plist */, ); path = ExecutionContext; sourceTree = ""; }; - 659E808C1C77450200DE85B1 /* ExecutionContextTests */ = { + 65D6378C1C943764000F5548 /* ExecutionContextTests */ = { isa = PBXGroup; children = ( - 659E808D1C77450200DE85B1 /* ExecutionContextTests.swift */, - 659E808F1C77450200DE85B1 /* Info.plist */, + 65D637A41C9437F4000F5548 /* ExecutionContextTests.swift */, + 65D6378F1C943764000F5548 /* Info.plist */, ); name = ExecutionContextTests; path = Tests/ExecutionContext; sourceTree = ""; }; - 659E80A61C77467600DE85B1 /* Frameworks */ = { + 65D637A61C94383C000F5548 /* Frameworks */ = { isa = PBXGroup; children = ( - 659E80DE1C78A70700DE85B1 /* iOS */, - 659E80E51C78A70700DE85B1 /* Mac */, - 659E80E81C78A70700DE85B1 /* tvOS */, - 659E80ED1C78A70700DE85B1 /* watchOS */, + 92E40A3C1CC10875001ED069 /* watchOS */, + 92E40A171CC10740001ED069 /* tvOS */, + 92E4092D1CBC33DC001ED069 /* iOS */, + 65D637A71C94383C000F5548 /* Mac */, ); name = Frameworks; + path = Carthage/Build; sourceTree = ""; }; - 659E80DE1C78A70700DE85B1 /* iOS */ = { + 65D637A71C94383C000F5548 /* Mac */ = { isa = PBXGroup; children = ( - 659E80DF1C78A70700DE85B1 /* 5DAA48E3-5755-35D2-AB25-E1F30299A0F7.bcsymbolmap */, - 659E80E01C78A70700DE85B1 /* 790F29BC-8E9F-3D46-B492-07898513A87F.bcsymbolmap */, - 659E80E11C78A70700DE85B1 /* 9C700391-4B46-36F8-B936-005B49EBCAFB.bcsymbolmap */, - 659E80E21C78A70700DE85B1 /* B143BCB0-79DF-31AA-AC9C-7ED9E261D87D.bcsymbolmap */, - 659E80E31C78A70700DE85B1 /* Result.framework */, - 659E80E41C78A70700DE85B1 /* Result.framework.dSYM */, - ); - name = iOS; - path = Carthage/Build/iOS; + 92E4093E1CBC344D001ED069 /* Boilerplate.framework */, + 92E4093F1CBC344D001ED069 /* Foundation3.framework */, + 92E409401CBC344D001ED069 /* Result.framework */, + 92E409411CBC344D001ED069 /* RunLoop.framework */, + 92E409421CBC344D001ED069 /* UV.framework */, + 92E409431CBC344D001ED069 /* XCTest3.framework */, + ); + path = Mac; sourceTree = ""; }; - 659E80E51C78A70700DE85B1 /* Mac */ = { + 92E4092D1CBC33DC001ED069 /* iOS */ = { isa = PBXGroup; children = ( - 659E80E61C78A70700DE85B1 /* Result.framework */, - 659E80E71C78A70700DE85B1 /* Result.framework.dSYM */, + 92E409EE1CC10541001ED069 /* RunLoop.framework */, + 92E4092E1CBC33F9001ED069 /* Boilerplate.framework */, + 92E4092F1CBC33F9001ED069 /* Foundation3.framework */, + 92E409301CBC33F9001ED069 /* Result.framework */, + 92E409311CBC33F9001ED069 /* XCTest3.framework */, ); - name = Mac; - path = Carthage/Build/Mac; + path = iOS; sourceTree = ""; }; - 659E80E81C78A70700DE85B1 /* tvOS */ = { + 92E40A171CC10740001ED069 /* tvOS */ = { isa = PBXGroup; children = ( - 659E80E91C78A70700DE85B1 /* B664D9B2-6E95-32DB-AE17-189723115AE7.bcsymbolmap */, - 659E80EA1C78A70700DE85B1 /* EFEDA4F1-6B1F-3501-98EF-3133DB0026EA.bcsymbolmap */, - 659E80EB1C78A70700DE85B1 /* Result.framework */, - 659E80EC1C78A70700DE85B1 /* Result.framework.dSYM */, + 92E40A181CC10761001ED069 /* Boilerplate.framework */, + 92E40A191CC10761001ED069 /* Foundation3.framework */, + 92E40A1A1CC10761001ED069 /* Result.framework */, + 92E40A1B1CC10761001ED069 /* RunLoop.framework */, ); - name = tvOS; - path = Carthage/Build/tvOS; + path = tvOS; sourceTree = ""; }; - 659E80ED1C78A70700DE85B1 /* watchOS */ = { + 92E40A3C1CC10875001ED069 /* watchOS */ = { isa = PBXGroup; children = ( - 659E80EE1C78A70700DE85B1 /* 14121FE4-824C-3F41-BB65-EFAE120D2446.bcsymbolmap */, - 659E80EF1C78A70700DE85B1 /* B2361319-6010-3366-BA4B-B28167D21368.bcsymbolmap */, - 659E80F01C78A70700DE85B1 /* Result.framework */, - 659E80F11C78A70700DE85B1 /* Result.framework.dSYM */, + 92E40A3D1CC10895001ED069 /* Boilerplate.framework */, + 92E40A3E1CC10895001ED069 /* Foundation3.framework */, + 92E40A3F1CC10895001ED069 /* Result.framework */, + 92E40A401CC10895001ED069 /* RunLoop.framework */, ); - name = watchOS; - path = Carthage/Build/watchOS; + path = watchOS; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 659E807B1C77450200DE85B1 /* Headers */ = { + 65D6377B1C943763000F5548 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 659E80BD1C78A47800DE85B1 /* Headers */ = { + 92E4090D1CBC32F2001ED069 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 65FB86951C78AA400005CD1B /* Headers */ = { + 92E409F51CC10677001ED069 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 65FB86BB1C78AC260005CD1B /* Headers */ = { + 92E40A2B1CC107D0001ED069 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( @@ -366,14 +431,14 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 659E807D1C77450200DE85B1 /* ExecutionContext-OSX */ = { + 65D6377D1C943763000F5548 /* ExecutionContext-OSX */ = { isa = PBXNativeTarget; - buildConfigurationList = 659E80921C77450200DE85B1 /* Build configuration list for PBXNativeTarget "ExecutionContext-OSX" */; + buildConfigurationList = 65D637921C943764000F5548 /* Build configuration list for PBXNativeTarget "ExecutionContext-OSX" */; buildPhases = ( - 659E80791C77450200DE85B1 /* Sources */, - 659E807A1C77450200DE85B1 /* Frameworks */, - 659E807B1C77450200DE85B1 /* Headers */, - 659E807C1C77450200DE85B1 /* Resources */, + 65D637791C943763000F5548 /* Sources */, + 65D6377A1C943763000F5548 /* Frameworks */, + 65D6377B1C943763000F5548 /* Headers */, + 65D6377C1C943763000F5548 /* Resources */, ); buildRules = ( ); @@ -381,73 +446,73 @@ ); name = "ExecutionContext-OSX"; productName = ExecutionContext; - productReference = 659E807E1C77450200DE85B1 /* ExecutionContext.framework */; + productReference = 65D6377E1C943764000F5548 /* ExecutionContext.framework */; productType = "com.apple.product-type.framework"; }; - 659E80871C77450200DE85B1 /* ExecutionContextTests-OSX */ = { + 65D637871C943764000F5548 /* ExecutionContextTests-OSX */ = { isa = PBXNativeTarget; - buildConfigurationList = 659E80951C77450200DE85B1 /* Build configuration list for PBXNativeTarget "ExecutionContextTests-OSX" */; + buildConfigurationList = 65D637951C943764000F5548 /* Build configuration list for PBXNativeTarget "ExecutionContextTests-OSX" */; buildPhases = ( - 659E80841C77450200DE85B1 /* Sources */, - 659E80851C77450200DE85B1 /* Frameworks */, - 659E80861C77450200DE85B1 /* Resources */, - 659E80A81C7746BA00DE85B1 /* Copy Frameworks */, + 65D637841C943764000F5548 /* Sources */, + 65D637851C943764000F5548 /* Frameworks */, + 65D637861C943764000F5548 /* Resources */, + 65D637BC1C943872000F5548 /* Copy Frameworks */, ); buildRules = ( ); dependencies = ( - 659E808B1C77450200DE85B1 /* PBXTargetDependency */, + 65D6378B1C943764000F5548 /* PBXTargetDependency */, ); name = "ExecutionContextTests-OSX"; productName = ExecutionContextTests; - productReference = 659E80881C77450200DE85B1 /* ExecutionContextTests-OSX.xctest */; + productReference = 65D637881C943764000F5548 /* ExecutionContextTests-OSX.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - 659E80BF1C78A47800DE85B1 /* ExecutionContext-iOS */ = { + 92E4090F1CBC32F2001ED069 /* ExecutionContext-iOS */ = { isa = PBXNativeTarget; - buildConfigurationList = 659E80D11C78A47800DE85B1 /* Build configuration list for PBXNativeTarget "ExecutionContext-iOS" */; + buildConfigurationList = 92E409211CBC32F2001ED069 /* Build configuration list for PBXNativeTarget "ExecutionContext-iOS" */; buildPhases = ( - 659E80BB1C78A47800DE85B1 /* Sources */, - 659E80BC1C78A47800DE85B1 /* Frameworks */, - 659E80BD1C78A47800DE85B1 /* Headers */, - 659E80BE1C78A47800DE85B1 /* Resources */, + 92E4090B1CBC32F2001ED069 /* Sources */, + 92E4090C1CBC32F2001ED069 /* Frameworks */, + 92E4090D1CBC32F2001ED069 /* Headers */, + 92E4090E1CBC32F2001ED069 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = "ExecutionContext-iOS"; - productName = ExecutionContext; - productReference = 659E80C01C78A47800DE85B1 /* ExecutionContext.framework */; + productName = "ExecutionContext-iOS"; + productReference = 92E409101CBC32F2001ED069 /* ExecutionContext.framework */; productType = "com.apple.product-type.framework"; }; - 659E80C81C78A47800DE85B1 /* ExecutionContextTests-iOS */ = { + 92E409181CBC32F2001ED069 /* ExecutionContextTests-iOS */ = { isa = PBXNativeTarget; - buildConfigurationList = 659E80D41C78A47800DE85B1 /* Build configuration list for PBXNativeTarget "ExecutionContextTests-iOS" */; + buildConfigurationList = 92E409241CBC32F2001ED069 /* Build configuration list for PBXNativeTarget "ExecutionContextTests-iOS" */; buildPhases = ( - 659E80C51C78A47800DE85B1 /* Sources */, - 659E80C61C78A47800DE85B1 /* Frameworks */, - 659E80C71C78A47800DE85B1 /* Resources */, - 65FB86911C78A8C00005CD1B /* Copy Frameworks */, + 92E409151CBC32F2001ED069 /* Sources */, + 92E409161CBC32F2001ED069 /* Frameworks */, + 92E409171CBC32F2001ED069 /* Resources */, + 92E409561CBC3485001ED069 /* Copy Frameworks */, ); buildRules = ( ); dependencies = ( - 659E80CC1C78A47800DE85B1 /* PBXTargetDependency */, + 92E4091C1CBC32F2001ED069 /* PBXTargetDependency */, ); name = "ExecutionContextTests-iOS"; - productName = ExecutionContextTests; - productReference = 659E80C91C78A47800DE85B1 /* ExecutionContextTests-iOS.xctest */; + productName = "ExecutionContext-iOSTests"; + productReference = 92E409191CBC32F2001ED069 /* ExecutionContextTests-iOS.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - 65FB86971C78AA400005CD1B /* ExecutionContext-tvOS */ = { + 92E409F71CC10677001ED069 /* ExecutionContext-tvOS */ = { isa = PBXNativeTarget; - buildConfigurationList = 65FB86A91C78AA400005CD1B /* Build configuration list for PBXNativeTarget "ExecutionContext-tvOS" */; + buildConfigurationList = 92E40A091CC10677001ED069 /* Build configuration list for PBXNativeTarget "ExecutionContext-tvOS" */; buildPhases = ( - 65FB86931C78AA400005CD1B /* Sources */, - 65FB86941C78AA400005CD1B /* Frameworks */, - 65FB86951C78AA400005CD1B /* Headers */, - 65FB86961C78AA400005CD1B /* Resources */, + 92E409F31CC10677001ED069 /* Sources */, + 92E409F41CC10677001ED069 /* Frameworks */, + 92E409F51CC10677001ED069 /* Headers */, + 92E409F61CC10677001ED069 /* Resources */, ); buildRules = ( ); @@ -455,36 +520,36 @@ ); name = "ExecutionContext-tvOS"; productName = ExecutionContext; - productReference = 65FB86981C78AA400005CD1B /* ExecutionContext.framework */; + productReference = 92E409F81CC10677001ED069 /* ExecutionContext.framework */; productType = "com.apple.product-type.framework"; }; - 65FB86A01C78AA400005CD1B /* ExecutionContextTests-tvOS */ = { + 92E40A001CC10677001ED069 /* ExecutionContextTests-tvOS */ = { isa = PBXNativeTarget; - buildConfigurationList = 65FB86AC1C78AA400005CD1B /* Build configuration list for PBXNativeTarget "ExecutionContextTests-tvOS" */; + buildConfigurationList = 92E40A0C1CC10677001ED069 /* Build configuration list for PBXNativeTarget "ExecutionContextTests-tvOS" */; buildPhases = ( - 65FB869D1C78AA400005CD1B /* Sources */, - 65FB869E1C78AA400005CD1B /* Frameworks */, - 65FB869F1C78AA400005CD1B /* Resources */, - 65FB86B71C78AB3C0005CD1B /* Copy Frameworks */, + 92E409FD1CC10677001ED069 /* Sources */, + 92E409FE1CC10677001ED069 /* Frameworks */, + 92E409FF1CC10677001ED069 /* Resources */, + 92E40A241CC1078D001ED069 /* Copy Frameworks */, ); buildRules = ( ); dependencies = ( - 65FB86A41C78AA400005CD1B /* PBXTargetDependency */, + 92E40A041CC10677001ED069 /* PBXTargetDependency */, ); name = "ExecutionContextTests-tvOS"; productName = ExecutionContextTests; - productReference = 65FB86A11C78AA400005CD1B /* ExecutionContextTests-tvOS.xctest */; + productReference = 92E40A011CC10677001ED069 /* ExecutionContextTests-tvOS.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - 65FB86BD1C78AC260005CD1B /* ExecutionContext-watchOS */ = { + 92E40A2D1CC107D0001ED069 /* ExecutionContext-watchOS */ = { isa = PBXNativeTarget; - buildConfigurationList = 65FB86C31C78AC260005CD1B /* Build configuration list for PBXNativeTarget "ExecutionContext-watchOS" */; + buildConfigurationList = 92E40A331CC107D0001ED069 /* Build configuration list for PBXNativeTarget "ExecutionContext-watchOS" */; buildPhases = ( - 65FB86B91C78AC260005CD1B /* Sources */, - 65FB86BA1C78AC260005CD1B /* Frameworks */, - 65FB86BB1C78AC260005CD1B /* Headers */, - 65FB86BC1C78AC260005CD1B /* Resources */, + 92E40A291CC107D0001ED069 /* Sources */, + 92E40A2A1CC107D0001ED069 /* Frameworks */, + 92E40A2B1CC107D0001ED069 /* Headers */, + 92E40A2C1CC107D0001ED069 /* Resources */, ); buildRules = ( ); @@ -492,109 +557,109 @@ ); name = "ExecutionContext-watchOS"; productName = ExecutionContext; - productReference = 65FB86BE1C78AC260005CD1B /* ExecutionContext.framework */; + productReference = 92E40A2E1CC107D0001ED069 /* ExecutionContext.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 659E80751C77450200DE85B1 /* Project object */ = { + 65D637751C943763000F5548 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0720; + LastSwiftUpdateCheck = 0730; LastUpgradeCheck = 0720; ORGANIZATIONNAME = "Crossroad Labs, LTD."; TargetAttributes = { - 659E807D1C77450200DE85B1 = { + 65D6377D1C943763000F5548 = { CreatedOnToolsVersion = 7.2.1; }; - 659E80871C77450200DE85B1 = { + 65D637871C943764000F5548 = { CreatedOnToolsVersion = 7.2.1; }; - 659E80BF1C78A47800DE85B1 = { - CreatedOnToolsVersion = 7.2.1; + 92E4090F1CBC32F2001ED069 = { + CreatedOnToolsVersion = 7.3; }; - 659E80C81C78A47800DE85B1 = { - CreatedOnToolsVersion = 7.2.1; + 92E409181CBC32F2001ED069 = { + CreatedOnToolsVersion = 7.3; }; - 65FB86971C78AA400005CD1B = { - CreatedOnToolsVersion = 7.2.1; + 92E409F71CC10677001ED069 = { + CreatedOnToolsVersion = 7.3; }; - 65FB86A01C78AA400005CD1B = { - CreatedOnToolsVersion = 7.2.1; + 92E40A001CC10677001ED069 = { + CreatedOnToolsVersion = 7.3; }; - 65FB86BD1C78AC260005CD1B = { - CreatedOnToolsVersion = 7.2.1; + 92E40A2D1CC107D0001ED069 = { + CreatedOnToolsVersion = 7.3; }; }; }; - buildConfigurationList = 659E80781C77450200DE85B1 /* Build configuration list for PBXProject "ExecutionContext" */; + buildConfigurationList = 65D637781C943763000F5548 /* Build configuration list for PBXProject "ExecutionContext" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); - mainGroup = 659E80741C77450200DE85B1; - productRefGroup = 659E807F1C77450200DE85B1 /* Products */; + mainGroup = 65D637741C943763000F5548; + productRefGroup = 65D6377F1C943764000F5548 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 659E807D1C77450200DE85B1 /* ExecutionContext-OSX */, - 659E80871C77450200DE85B1 /* ExecutionContextTests-OSX */, - 659E80BF1C78A47800DE85B1 /* ExecutionContext-iOS */, - 659E80C81C78A47800DE85B1 /* ExecutionContextTests-iOS */, - 65FB86971C78AA400005CD1B /* ExecutionContext-tvOS */, - 65FB86A01C78AA400005CD1B /* ExecutionContextTests-tvOS */, - 65FB86BD1C78AC260005CD1B /* ExecutionContext-watchOS */, + 65D6377D1C943763000F5548 /* ExecutionContext-OSX */, + 65D637871C943764000F5548 /* ExecutionContextTests-OSX */, + 92E4090F1CBC32F2001ED069 /* ExecutionContext-iOS */, + 92E409181CBC32F2001ED069 /* ExecutionContextTests-iOS */, + 92E409F71CC10677001ED069 /* ExecutionContext-tvOS */, + 92E40A001CC10677001ED069 /* ExecutionContextTests-tvOS */, + 92E40A2D1CC107D0001ED069 /* ExecutionContext-watchOS */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 659E807C1C77450200DE85B1 /* Resources */ = { + 65D6377C1C943763000F5548 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 659E80861C77450200DE85B1 /* Resources */ = { + 65D637861C943764000F5548 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 659E80BE1C78A47800DE85B1 /* Resources */ = { + 92E4090E1CBC32F2001ED069 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 659E80C71C78A47800DE85B1 /* Resources */ = { + 92E409171CBC32F2001ED069 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 65FB86961C78AA400005CD1B /* Resources */ = { + 92E409F61CC10677001ED069 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 65FB869F1C78AA400005CD1B /* Resources */ = { + 92E409FF1CC10677001ED069 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 65FB86BC1C78AC260005CD1B /* Resources */ = { + 92E40A2C1CC107D0001ED069 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -604,120 +669,108 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 659E80791C77450200DE85B1 /* Sources */ = { + 65D637791C943763000F5548 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 659E809F1C77457E00DE85B1 /* DispatchExecutionContext.swift in Sources */, - 9678EA2D1C7B22DC00E39B17 /* RunLoop.swift in Sources */, - 659E80A01C77457E00DE85B1 /* ExecutionContext.swift in Sources */, - 65E646DD1C79949C0036D028 /* CustomExecutionContext.swift in Sources */, - 659E80A31C77457E00DE85B1 /* Result+Some.swift in Sources */, - 659E80A11C77457E00DE85B1 /* ImmediateExecutionContext.swift in Sources */, - 659E809E1C77457E00DE85B1 /* DefaultExecutionContext.swift in Sources */, - 65E646F21C79E0590036D028 /* Semaphore.swift in Sources */, - 658566A31C7CAEE3003B0E08 /* LoopSemaphore.swift in Sources */, - 659E80A21C77457E00DE85B1 /* PThreadExecutionContext.swift in Sources */, + 65D637A31C9437BB000F5548 /* RunLoopExecutionContext.swift in Sources */, + 65FD8EC01CD9BC340046D5D6 /* ExecutionContextTenant.swift in Sources */, + 65D6379F1C9437BB000F5548 /* DefaultExecutionContext.swift in Sources */, + 65D6379E1C9437BB000F5548 /* CustomExecutionContext.swift in Sources */, + 65D637A21C9437BB000F5548 /* ImmediateExecutionContext.swift in Sources */, + 65D637A11C9437BB000F5548 /* ExecutionContext.swift in Sources */, + 65D637A01C9437BB000F5548 /* DispatchExecutionContext.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 659E80841C77450200DE85B1 /* Sources */ = { + 65D637841C943764000F5548 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 659E808E1C77450200DE85B1 /* ExecutionContextTests.swift in Sources */, + 65D637A51C9437F4000F5548 /* ExecutionContextTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 659E80BB1C78A47800DE85B1 /* Sources */ = { + 92E4090B1CBC32F2001ED069 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 963ED1C71C81E491002351EE /* LoopSemaphore.swift in Sources */, - 659E80D81C78A4AF00DE85B1 /* DefaultExecutionContext.swift in Sources */, - 9678EA2E1C7B22DC00E39B17 /* RunLoop.swift in Sources */, - 659E80DA1C78A4B500DE85B1 /* PThreadExecutionContext.swift in Sources */, - 65E646DE1C7994A00036D028 /* CustomExecutionContext.swift in Sources */, - 659E80DC1C78A4BC00DE85B1 /* Result+Some.swift in Sources */, - 659E80DB1C78A4B800DE85B1 /* ImmediateExecutionContext.swift in Sources */, - 659E80D71C78A4AB00DE85B1 /* ExecutionContext.swift in Sources */, - 65E646F31C79E0590036D028 /* Semaphore.swift in Sources */, - 659E80D91C78A4B200DE85B1 /* DispatchExecutionContext.swift in Sources */, + 92E4092C1CBC337B001ED069 /* RunLoopExecutionContext.swift in Sources */, + 65FD8EC11CD9BC340046D5D6 /* ExecutionContextTenant.swift in Sources */, + 92E409271CBC3369001ED069 /* ExecutionContext.swift in Sources */, + 92E409291CBC3371001ED069 /* DefaultExecutionContext.swift in Sources */, + 92E4092B1CBC3378001ED069 /* ImmediateExecutionContext.swift in Sources */, + 92E4092A1CBC3374001ED069 /* DispatchExecutionContext.swift in Sources */, + 92E409281CBC336D001ED069 /* CustomExecutionContext.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 659E80C51C78A47800DE85B1 /* Sources */ = { + 92E409151CBC32F2001ED069 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 659E80DD1C78A4F000DE85B1 /* ExecutionContextTests.swift in Sources */, + 92E40A151CC10717001ED069 /* ExecutionContextTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 65FB86931C78AA400005CD1B /* Sources */ = { + 92E409F31CC10677001ED069 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 963ED1C81C81E49E002351EE /* LoopSemaphore.swift in Sources */, - 65FB86B01C78AAE00005CD1B /* DefaultExecutionContext.swift in Sources */, - 9678EA2F1C7B22DC00E39B17 /* RunLoop.swift in Sources */, - 65FB86B21C78AAE50005CD1B /* PThreadExecutionContext.swift in Sources */, - 65E646DF1C7994A10036D028 /* CustomExecutionContext.swift in Sources */, - 65FB86B41C78AAE50005CD1B /* Result+Some.swift in Sources */, - 65FB86B31C78AAE50005CD1B /* ImmediateExecutionContext.swift in Sources */, - 65FB86AF1C78AADB0005CD1B /* ExecutionContext.swift in Sources */, - 65E646F41C79E0590036D028 /* Semaphore.swift in Sources */, - 65FB86B11C78AAE50005CD1B /* DispatchExecutionContext.swift in Sources */, + 92E40A141CC10713001ED069 /* RunLoopExecutionContext.swift in Sources */, + 65FD8EC21CD9BC340046D5D6 /* ExecutionContextTenant.swift in Sources */, + 92E40A0F1CC10713001ED069 /* ExecutionContext.swift in Sources */, + 92E40A111CC10713001ED069 /* DefaultExecutionContext.swift in Sources */, + 92E40A131CC10713001ED069 /* ImmediateExecutionContext.swift in Sources */, + 92E40A121CC10713001ED069 /* DispatchExecutionContext.swift in Sources */, + 92E40A101CC10713001ED069 /* CustomExecutionContext.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 65FB869D1C78AA400005CD1B /* Sources */ = { + 92E409FD1CC10677001ED069 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 65FB86B51C78AAEC0005CD1B /* ExecutionContextTests.swift in Sources */, + 92E40A161CC10718001ED069 /* ExecutionContextTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 65FB86B91C78AC260005CD1B /* Sources */ = { + 92E40A291CC107D0001ED069 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 963ED1C91C81E4A4002351EE /* LoopSemaphore.swift in Sources */, - 65FB86C71C78AC8B0005CD1B /* DefaultExecutionContext.swift in Sources */, - 9678EA301C7B22DC00E39B17 /* RunLoop.swift in Sources */, - 65FB86C91C78AC8B0005CD1B /* PThreadExecutionContext.swift in Sources */, - 65E646E01C7994A20036D028 /* CustomExecutionContext.swift in Sources */, - 65FB86CB1C78AC8B0005CD1B /* Result+Some.swift in Sources */, - 65FB86CA1C78AC8B0005CD1B /* ImmediateExecutionContext.swift in Sources */, - 65FB86C61C78AC8B0005CD1B /* ExecutionContext.swift in Sources */, - 65E646F51C79E0590036D028 /* Semaphore.swift in Sources */, - 65FB86C81C78AC8B0005CD1B /* DispatchExecutionContext.swift in Sources */, + 92E40A3B1CC10816001ED069 /* RunLoopExecutionContext.swift in Sources */, + 65FD8EC31CD9BC340046D5D6 /* ExecutionContextTenant.swift in Sources */, + 92E40A361CC10816001ED069 /* ExecutionContext.swift in Sources */, + 92E40A381CC10816001ED069 /* DefaultExecutionContext.swift in Sources */, + 92E40A3A1CC10816001ED069 /* ImmediateExecutionContext.swift in Sources */, + 92E40A391CC10816001ED069 /* DispatchExecutionContext.swift in Sources */, + 92E40A371CC10816001ED069 /* CustomExecutionContext.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 659E808B1C77450200DE85B1 /* PBXTargetDependency */ = { + 65D6378B1C943764000F5548 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 659E807D1C77450200DE85B1 /* ExecutionContext-OSX */; - targetProxy = 659E808A1C77450200DE85B1 /* PBXContainerItemProxy */; + target = 65D6377D1C943763000F5548 /* ExecutionContext-OSX */; + targetProxy = 65D6378A1C943764000F5548 /* PBXContainerItemProxy */; }; - 659E80CC1C78A47800DE85B1 /* PBXTargetDependency */ = { + 92E4091C1CBC32F2001ED069 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 659E80BF1C78A47800DE85B1 /* ExecutionContext-iOS */; - targetProxy = 659E80CB1C78A47800DE85B1 /* PBXContainerItemProxy */; + target = 92E4090F1CBC32F2001ED069 /* ExecutionContext-iOS */; + targetProxy = 92E4091B1CBC32F2001ED069 /* PBXContainerItemProxy */; }; - 65FB86A41C78AA400005CD1B /* PBXTargetDependency */ = { + 92E40A041CC10677001ED069 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 65FB86971C78AA400005CD1B /* ExecutionContext-tvOS */; - targetProxy = 65FB86A31C78AA400005CD1B /* PBXContainerItemProxy */; + target = 92E409F71CC10677001ED069 /* ExecutionContext-tvOS */; + targetProxy = 92E40A031CC10677001ED069 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 659E80901C77450200DE85B1 /* Debug */ = { + 65D637901C943764000F5548 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -754,6 +807,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + LIBRARY_SEARCH_PATHS = /usr/local/lib; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -764,7 +819,7 @@ }; name = Debug; }; - 659E80911C77450200DE85B1 /* Release */ = { + 65D637911C943764000F5548 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -795,6 +850,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + LIBRARY_SEARCH_PATHS = /usr/local/lib; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; @@ -803,7 +860,7 @@ }; name = Release; }; - 659E80931C77450200DE85B1 /* Debug */ = { + 65D637931C943764000F5548 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; @@ -816,8 +873,6 @@ "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/Mac", "$(PROJECT_DIR)/Carthage/Build/iOS", - "$(PROJECT_DIR)/Carthage/Build/tvOS", - "$(PROJECT_DIR)/Carthage/Build/watchOS", ); FRAMEWORK_VERSION = A; INFOPLIST_FILE = ExecutionContext/Info.plist; @@ -830,7 +885,7 @@ }; name = Debug; }; - 659E80941C77450200DE85B1 /* Release */ = { + 65D637941C943764000F5548 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; @@ -843,8 +898,6 @@ "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/Mac", "$(PROJECT_DIR)/Carthage/Build/iOS", - "$(PROJECT_DIR)/Carthage/Build/tvOS", - "$(PROJECT_DIR)/Carthage/Build/watchOS", ); FRAMEWORK_VERSION = A; INFOPLIST_FILE = ExecutionContext/Info.plist; @@ -856,9 +909,10 @@ }; name = Release; }; - 659E80961C77450200DE85B1 /* Debug */ = { + 65D637961C943764000F5548 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -868,12 +922,14 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = xyz.crossroadlabs.ExecutionContextTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; - 659E80971C77450200DE85B1 /* Release */ = { + 65D637971C943764000F5548 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -886,9 +942,10 @@ }; name = Release; }; - 659E80D21C78A47800DE85B1 /* Debug */ = { + 92E409221CBC32F2001ED069 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ANALYZER_NONNULL = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -897,9 +954,6 @@ FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", - "$(PROJECT_DIR)/Carthage/Build/Mac", - "$(PROJECT_DIR)/Carthage/Build/tvOS", - "$(PROJECT_DIR)/Carthage/Build/watchOS", ); INFOPLIST_FILE = ExecutionContext/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -913,9 +967,10 @@ }; name = Debug; }; - 659E80D31C78A47800DE85B1 /* Release */ = { + 92E409231CBC32F2001ED069 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ANALYZER_NONNULL = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -924,9 +979,6 @@ FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", - "$(PROJECT_DIR)/Carthage/Build/Mac", - "$(PROJECT_DIR)/Carthage/Build/tvOS", - "$(PROJECT_DIR)/Carthage/Build/watchOS", ); INFOPLIST_FILE = ExecutionContext/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -941,36 +993,47 @@ }; name = Release; }; - 659E80D51C78A47800DE85B1 /* Debug */ = { + 92E409251CBC32F2001ED069 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ANALYZER_NONNULL = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); INFOPLIST_FILE = Tests/ExecutionContext/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = xyz.crossroadlabs.ExecutionContextTests; + PRODUCT_BUNDLE_IDENTIFIER = "xyz.crossroadlabs.ExecutionContextTests-iOS"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; }; name = Debug; }; - 659E80D61C78A47800DE85B1 /* Release */ = { + 92E409261CBC32F2001ED069 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ANALYZER_NONNULL = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); INFOPLIST_FILE = Tests/ExecutionContext/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = xyz.crossroadlabs.ExecutionContextTests; + PRODUCT_BUNDLE_IDENTIFIER = "xyz.crossroadlabs.ExecutionContextTests-iOS"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; - 65FB86AA1C78AA400005CD1B /* Debug */ = { + 92E40A0A1CC10677001ED069 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ANALYZER_NONNULL = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -987,13 +1050,14 @@ SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.1; + TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; - 65FB86AB1C78AA400005CD1B /* Release */ = { + 92E40A0B1CC10677001ED069 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ANALYZER_NONNULL = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1010,40 +1074,51 @@ SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.1; + TVOS_DEPLOYMENT_TARGET = 9.0; VALIDATE_PRODUCT = YES; }; name = Release; }; - 65FB86AD1C78AA400005CD1B /* Debug */ = { + 92E40A0D1CC10677001ED069 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); INFOPLIST_FILE = Tests/ExecutionContext/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = xyz.crossroadlabs.ExecutionContextTests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 9.2; }; name = Debug; }; - 65FB86AE1C78AA400005CD1B /* Release */ = { + 92E40A0E1CC10677001ED069 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); INFOPLIST_FILE = Tests/ExecutionContext/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = xyz.crossroadlabs.ExecutionContextTests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 9.2; VALIDATE_PRODUCT = YES; }; name = Release; }; - 65FB86C41C78AC260005CD1B /* Debug */ = { + 92E40A341CC107D0001ED069 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1064,10 +1139,11 @@ }; name = Debug; }; - 65FB86C51C78AC260005CD1B /* Release */ = { + 92E40A351CC107D0001ED069 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1092,79 +1168,79 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 659E80781C77450200DE85B1 /* Build configuration list for PBXProject "ExecutionContext" */ = { + 65D637781C943763000F5548 /* Build configuration list for PBXProject "ExecutionContext" */ = { isa = XCConfigurationList; buildConfigurations = ( - 659E80901C77450200DE85B1 /* Debug */, - 659E80911C77450200DE85B1 /* Release */, + 65D637901C943764000F5548 /* Debug */, + 65D637911C943764000F5548 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 659E80921C77450200DE85B1 /* Build configuration list for PBXNativeTarget "ExecutionContext-OSX" */ = { + 65D637921C943764000F5548 /* Build configuration list for PBXNativeTarget "ExecutionContext-OSX" */ = { isa = XCConfigurationList; buildConfigurations = ( - 659E80931C77450200DE85B1 /* Debug */, - 659E80941C77450200DE85B1 /* Release */, + 65D637931C943764000F5548 /* Debug */, + 65D637941C943764000F5548 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 659E80951C77450200DE85B1 /* Build configuration list for PBXNativeTarget "ExecutionContextTests-OSX" */ = { + 65D637951C943764000F5548 /* Build configuration list for PBXNativeTarget "ExecutionContextTests-OSX" */ = { isa = XCConfigurationList; buildConfigurations = ( - 659E80961C77450200DE85B1 /* Debug */, - 659E80971C77450200DE85B1 /* Release */, + 65D637961C943764000F5548 /* Debug */, + 65D637971C943764000F5548 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 659E80D11C78A47800DE85B1 /* Build configuration list for PBXNativeTarget "ExecutionContext-iOS" */ = { + 92E409211CBC32F2001ED069 /* Build configuration list for PBXNativeTarget "ExecutionContext-iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - 659E80D21C78A47800DE85B1 /* Debug */, - 659E80D31C78A47800DE85B1 /* Release */, + 92E409221CBC32F2001ED069 /* Debug */, + 92E409231CBC32F2001ED069 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 659E80D41C78A47800DE85B1 /* Build configuration list for PBXNativeTarget "ExecutionContextTests-iOS" */ = { + 92E409241CBC32F2001ED069 /* Build configuration list for PBXNativeTarget "ExecutionContextTests-iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - 659E80D51C78A47800DE85B1 /* Debug */, - 659E80D61C78A47800DE85B1 /* Release */, + 92E409251CBC32F2001ED069 /* Debug */, + 92E409261CBC32F2001ED069 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 65FB86A91C78AA400005CD1B /* Build configuration list for PBXNativeTarget "ExecutionContext-tvOS" */ = { + 92E40A091CC10677001ED069 /* Build configuration list for PBXNativeTarget "ExecutionContext-tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - 65FB86AA1C78AA400005CD1B /* Debug */, - 65FB86AB1C78AA400005CD1B /* Release */, + 92E40A0A1CC10677001ED069 /* Debug */, + 92E40A0B1CC10677001ED069 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 65FB86AC1C78AA400005CD1B /* Build configuration list for PBXNativeTarget "ExecutionContextTests-tvOS" */ = { + 92E40A0C1CC10677001ED069 /* Build configuration list for PBXNativeTarget "ExecutionContextTests-tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - 65FB86AD1C78AA400005CD1B /* Debug */, - 65FB86AE1C78AA400005CD1B /* Release */, + 92E40A0D1CC10677001ED069 /* Debug */, + 92E40A0E1CC10677001ED069 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 65FB86C31C78AC260005CD1B /* Build configuration list for PBXNativeTarget "ExecutionContext-watchOS" */ = { + 92E40A331CC107D0001ED069 /* Build configuration list for PBXNativeTarget "ExecutionContext-watchOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - 65FB86C41C78AC260005CD1B /* Debug */, - 65FB86C51C78AC260005CD1B /* Release */, + 92E40A341CC107D0001ED069 /* Debug */, + 92E40A351CC107D0001ED069 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 659E80751C77450200DE85B1 /* Project object */; + rootObject = 65D637751C943763000F5548 /* Project object */; } diff --git a/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-OSX.xcscheme b/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-OSX.xcscheme index 9e8b053..6b71ed9 100644 --- a/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-OSX.xcscheme +++ b/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-OSX.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> @@ -32,7 +32,7 @@ skipped = "NO"> @@ -42,7 +42,7 @@ @@ -64,7 +64,7 @@ @@ -82,7 +82,7 @@ diff --git a/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-iOS.xcscheme b/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-iOS.xcscheme index d4b24c5..4c41adb 100644 --- a/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-iOS.xcscheme +++ b/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-iOS.xcscheme @@ -1,6 +1,6 @@ @@ -32,7 +32,7 @@ skipped = "NO"> @@ -42,7 +42,7 @@ @@ -64,7 +64,7 @@ @@ -82,7 +82,7 @@ diff --git a/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-tvOS.xcscheme b/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-tvOS.xcscheme index 2084557..4b961b5 100644 --- a/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-tvOS.xcscheme +++ b/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-tvOS.xcscheme @@ -1,6 +1,6 @@ @@ -32,7 +32,7 @@ skipped = "NO"> @@ -42,7 +42,7 @@ @@ -64,7 +64,7 @@ @@ -82,7 +82,7 @@ diff --git a/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-watchOS.xcscheme b/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-watchOS.xcscheme index 03f818b..fe10d29 100644 --- a/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-watchOS.xcscheme +++ b/ExecutionContext.xcodeproj/xcshareddata/xcschemes/ExecutionContext-watchOS.xcscheme @@ -1,6 +1,6 @@ @@ -45,7 +45,7 @@ @@ -63,7 +63,7 @@ diff --git a/ExecutionContext/CustomExecutionContext.swift b/ExecutionContext/CustomExecutionContext.swift index 0e81a1f..7485708 100644 --- a/ExecutionContext/CustomExecutionContext.swift +++ b/ExecutionContext/CustomExecutionContext.swift @@ -15,8 +15,11 @@ //===----------------------------------------------------------------------===// import Foundation +import Foundation3 +import Boilerplate public class CustomExecutionContext : ExecutionContextBase, ExecutionContextType { + let id = NSUUID() let executor:Executor public init(executor:Executor) { @@ -24,17 +27,32 @@ public class CustomExecutionContext : ExecutionContextBase, ExecutionContextType } public func async(task:SafeTask) { - executor(task) + executor { + let context = currentContext.value + defer { + currentContext.value = context + } + currentContext.value = self + + task() + } } - public func async(after:Double, task:SafeTask) { + public func async(after:Timeout, task:SafeTask) { async { - sleep(after) + Thread.sleep(after) task() } } - public func sync(task:() throws -> ReturnType) throws -> ReturnType { + public func sync(task:() throws -> ReturnType) rethrows -> ReturnType { return try syncThroughAsync(task) } + + public func isEqualTo(other: NonStrictEquatable) -> Bool { + guard let other = other as? CustomExecutionContext else { + return false + } + return id.isEqual(other.id) + } } \ No newline at end of file diff --git a/ExecutionContext/DefaultExecutionContext.swift b/ExecutionContext/DefaultExecutionContext.swift index b37bcd9..c720f94 100644 --- a/ExecutionContext/DefaultExecutionContext.swift +++ b/ExecutionContext/DefaultExecutionContext.swift @@ -18,11 +18,21 @@ import Foundation #if !os(Linux) || dispatch - public typealias DefaultExecutionContext = DispatchExecutionContext + #if nouv + public typealias DefaultExecutionContext = DispatchExecutionContext + #else + public typealias DefaultExecutionContext = RunLoopExecutionContext + #endif #else - public typealias DefaultExecutionContext = PThreadExecutionContext + #if nouv + private func error() { + let error = "You can not use 'nouv' key' without dispatch support" + } + #else + public typealias DefaultExecutionContext = RunLoopExecutionContext + #endif #endif @@ -36,4 +46,8 @@ public protocol DefaultExecutionContextType : ExecutionContextType { static var global:ExecutionContextType { get } + + /// unfortunately name main() is not allowed + @noreturn + static func mainProc() } \ No newline at end of file diff --git a/ExecutionContext/DispatchExecutionContext.swift b/ExecutionContext/DispatchExecutionContext.swift index e2e10e9..2229189 100644 --- a/ExecutionContext/DispatchExecutionContext.swift +++ b/ExecutionContext/DispatchExecutionContext.swift @@ -17,57 +17,82 @@ #if !os(Linux) || dispatch import Foundation + import Foundation3 import Dispatch - import Result + import Boilerplate + import RunLoop + + private extension ExecutionContextKind { + func createDispatchQueue(id:String) -> dispatch_queue_t! { + switch self { + case .serial: + return dispatch_queue_create(id, DISPATCH_QUEUE_SERIAL) + case .parallel: + return dispatch_queue_create(id, DISPATCH_QUEUE_CONCURRENT) + } + } + } public class DispatchExecutionContext : ExecutionContextBase, ExecutionContextType, DefaultExecutionContextType { - private let queue:dispatch_queue_t + private let loop:DispatchRunLoop - public required init(kind:ExecutionContextKind) { - let id = NSUUID().UUIDString - switch kind { - case .Serial: queue = dispatch_queue_create(id, DISPATCH_QUEUE_SERIAL) - case .Parallel: queue = dispatch_queue_create(id, DISPATCH_QUEUE_CONCURRENT) - } + public required convenience init(kind:ExecutionContextKind) { + let id = NSUUID().uuidString + let queue = kind.createDispatchQueue(id) + self.init(queue: queue) } public init(queue:dispatch_queue_t) { - self.queue = queue + self.loop = DispatchRunLoop(queue: queue) + super.init() + loop.execute { + currentContext.value = self + } } public func async(task:SafeTask) { - dispatch_async(queue) { + loop.execute { + currentContext.value = self task() } } - public func async(after:Double, task:SafeTask) { - if after > 0 { - let time = dispatch_time(DISPATCH_TIME_NOW, Int64(after * NSTimeInterval(NSEC_PER_SEC))) - dispatch_after(time, queue) { - task() - } - } else { - async(task) + public func async(after:Timeout, task:SafeTask) { + loop.execute(after) { + currentContext.value = self + task() } } - public func sync(task:() throws -> ReturnType) throws -> ReturnType { - if dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue) { + public func sync(task:() throws -> ReturnType) rethrows -> ReturnType { + if isCurrent { + return try task() + } + + return try loop.sync { + currentContext.value = self return try task() - } else { - var result:Result? - - dispatch_sync(queue) { - result = materialize(task) - } - - return try result!.dematerializeAnyError() } } public static let main:ExecutionContextType = DispatchExecutionContext(queue: dispatch_get_main_queue()) public static let global:ExecutionContextType = DispatchExecutionContext(queue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) + + @noreturn + public static func mainProc() { + if !Thread.isMain { + print("Main proc was called on non-main thread. Exiting") + exit(1) + } + dispatch_main() + } + + public func isEqualTo(other: NonStrictEquatable) -> Bool { + guard let other = other as? DispatchExecutionContext else { + return false + } + return loop.isEqualTo(other.loop) + } } #endif \ No newline at end of file diff --git a/ExecutionContext/ExecutionContext.swift b/ExecutionContext/ExecutionContext.swift index 9cb5779..bb699bf 100644 --- a/ExecutionContext/ExecutionContext.swift +++ b/ExecutionContext/ExecutionContext.swift @@ -16,6 +16,7 @@ import Foundation import Result +import Boilerplate #if os(Linux) import Glibc @@ -25,13 +26,10 @@ import Result import Dispatch #endif -public typealias Task = () throws -> Void -public typealias SafeTask = () -> Void - // return true if error successfully handled, false otherwise -public typealias ErrorHandler = (e:ErrorType) throws -> Bool +public typealias ErrorHandler = (e:ErrorProtocol) throws -> Bool -private func stockErrorHandler(e:ErrorType) throws -> Bool { +private func stockErrorHandler(e:ErrorProtocol) throws -> Bool { let errorName = Mirror(reflecting: e).description print(errorName, " was thrown but not handled") return true @@ -47,22 +45,53 @@ public protocol TaskSchedulerType { func async(task:Task) func async(task:SafeTask) - //after is in seconds - func async(after:Double, task:Task) - func async(after:Double, task:SafeTask) + func async(after:Timeout, task:Task) + func async(after:Timeout, task:SafeTask) - func sync(task:() throws -> ReturnType) throws -> ReturnType - func sync(task:() -> ReturnType) -> ReturnType + func sync(task:() throws -> ReturnType) rethrows -> ReturnType } -public protocol ExecutionContextType : TaskSchedulerType, ErrorHandlerRegistryType { +public protocol ExecutionContextType : TaskSchedulerType, ErrorHandlerRegistryType, NonStrictEquatable { func execute(task:SafeTask) + + static var current:ExecutionContextType {get} } public extension ExecutionContextType { - func execute(task:SafeTask) { + public func execute(task:SafeTask) { async(task) } + + public var isCurrent:Bool { + get { + return Self.current.isEqualTo(self) + } + } +} + +import RunLoop + +extension ExecutionContextType { + func syncThroughAsync(task:() throws -> ReturnType) rethrows -> ReturnType { + if isCurrent { + return try task() + } + + return try { + var result:Result? + + let sema = RunLoop.current.semaphore() + + async { + result = materializeAny(task) + sema.signal() + } + + sema.wait() + + return try result!.dematerializeAny() + }() + } } public typealias Executor = (SafeTask)->Void @@ -76,12 +105,12 @@ public class ExecutionContextBase : ErrorHandlerRegistryType { public func registerErrorHandler(handler:ErrorHandler) { //keep last one as it's stock - errorHandlers.insert(handler, atIndex: errorHandlers.endIndex.advancedBy(-1)) + errorHandlers.insert(handler, at: errorHandlers.endIndex.advanced(by: -1)) } } public extension ErrorHandlerRegistryType where Self : TaskSchedulerType { - func handleError(e:ErrorType) { + func handleError(e:ErrorProtocol) { for handler in errorHandlers { do { if try handler(e: e) { @@ -106,7 +135,7 @@ public extension ErrorHandlerRegistryType where Self : TaskSchedulerType { } //after is in seconds - func async(after:Double, task:Task) { + public func async(after:Timeout, task:Task) { //specify explicitely, that it's safe task async(after) { () -> Void in do { @@ -118,42 +147,13 @@ public extension ErrorHandlerRegistryType where Self : TaskSchedulerType { } } -public extension TaskSchedulerType { - public func sync(task:() -> ReturnType) -> ReturnType { - return try! sync { () throws -> ReturnType in - return task() - } - } -} - public enum ExecutionContextKind { - case Serial - case Parallel + case serial + case parallel } public typealias ExecutionContext = DefaultExecutionContext -extension ExecutionContextType { - func syncThroughAsync(task:() throws -> ReturnType) throws -> ReturnType { - var result:Result? - - let sema = LoopSemaphore() - sema.willUse() - defer { - sema.didUse() - } - - async { - result = materialize(task) - sema.signal() - } - - sema.wait() - - return try result!.dematerializeAnyError() - } -} - public let immediate:ExecutionContextType = ImmediateExecutionContext() public let main:ExecutionContextType = ExecutionContext.main public let global:ExecutionContextType = ExecutionContext.global @@ -162,18 +162,31 @@ public func executionContext(executor:Executor) -> ExecutionContextType { return CustomExecutionContext(executor: executor) } -public func sleep(timeout:Double) { - let sec = time_t(timeout) - let nsec = Int((timeout - Double(sec)) * 1000 * 1000 * 1000)//nano seconds - var time = timespec(tv_sec:sec, tv_nsec: nsec) - - nanosleep(&time, nil) +var currentContext = try! ThreadLocal() + +public extension ExecutionContextType { + public static var current:ExecutionContextType { + get { + if Thread.isMain { + return ExecutionContext.main + } + if currentContext.value == nil { + //TODO: think +// currentContext.value = RunLoopExecutionContext(inner: <#T##ExecutionContextType#>) + } + return currentContext.value! + } + } } -@noreturn public func executionContextMain() { - #if !os(Linux) || dispatch - dispatch_main() - #else - RunLoop.runForever() - #endif +public extension ExecutionContextType { + //if context is current - executes immediately. Schedules to the context otherwise + public func immediateIfCurrent(task:SafeTask) { + //can avoid first check but is here for optimization + if immediate.isEqualTo(self) || isCurrent { + task() + } else { + execute(task) + } + } } \ No newline at end of file diff --git a/ExecutionContext/ExecutionContextTenant.swift b/ExecutionContext/ExecutionContextTenant.swift new file mode 100644 index 0000000..c5895c7 --- /dev/null +++ b/ExecutionContext/ExecutionContextTenant.swift @@ -0,0 +1,25 @@ +//===--- ExecutionContextTenant.swift ------------------------------------------------------===// +//Copyright (c) 2016 Daniel Leping (dileping) +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. +//===----------------------------------------------------------------------===// + +public protocol ExecutionContextTenantProtocol { + var context:ExecutionContextType {get} +} + +public protocol MovableExecutionContextTenantProtocol : ExecutionContextTenantProtocol { + associatedtype SettledTenant + + func settleIn(context:ExecutionContextType) -> SettledTenant +} \ No newline at end of file diff --git a/ExecutionContext/ImmediateExecutionContext.swift b/ExecutionContext/ImmediateExecutionContext.swift index 043448f..b7b07e7 100644 --- a/ExecutionContext/ImmediateExecutionContext.swift +++ b/ExecutionContext/ImmediateExecutionContext.swift @@ -15,20 +15,37 @@ //===----------------------------------------------------------------------===// import Foundation +import Boilerplate -public class ImmediateExecutionContext : ExecutionContextBase, ExecutionContextType { - public func async(task:SafeTask) { +class ImmediateExecutionContext : ExecutionContextBase, ExecutionContextType { + func async(task:SafeTask) { + let context = currentContext.value + defer { + currentContext.value = context + } + currentContext.value = self + task() } - public func async(after:Double, task:SafeTask) { + func async(after:Timeout, task:SafeTask) { async { - sleep(after) + Thread.sleep(after) task() } } - public func sync(task:() throws -> ReturnType) throws -> ReturnType { + func sync(task:() throws -> ReturnType) rethrows -> ReturnType { + let context = currentContext.value + defer { + currentContext.value = context + } + currentContext.value = self + return try task() } + + func isEqualTo(other:NonStrictEquatable) -> Bool { + return other is ImmediateExecutionContext + } } \ No newline at end of file diff --git a/ExecutionContext/Info.plist b/ExecutionContext/Info.plist index 883633a..41b8b8d 100644 --- a/ExecutionContext/Info.plist +++ b/ExecutionContext/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.1 + 0.2 CFBundleSignature ???? CFBundleVersion diff --git a/ExecutionContext/LoopSemaphore.swift b/ExecutionContext/LoopSemaphore.swift deleted file mode 100644 index 60c5841..0000000 --- a/ExecutionContext/LoopSemaphore.swift +++ /dev/null @@ -1,149 +0,0 @@ -//===--- LoopSemaphore.swift -----------------------------------------------===// -//Copyright (c) 2016 Daniel Leping (dileping) -// -//Licensed under the Apache License, Version 2.0 (the "License"); -//you may not use this file except in compliance with the License. -//You may obtain a copy of the License at -// -//http://www.apache.org/licenses/LICENSE-2.0 -// -//Unless required by applicable law or agreed to in writing, software -//distributed under the License is distributed on an "AS IS" BASIS, -//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -//See the License for the specific language governing permissions and -//limitations under the License. -//===----------------------------------------------------------------------===// - -import Foundation -import CoreFoundation - -#if !os(Linux) || dispatch - import Dispatch - - public class DispatchLoopSemaphore : SemaphoreType { - let sema:dispatch_semaphore_t - - public required convenience init() { - self.init(value: 0) - } - - public required init(value: Int) { - self.sema = dispatch_semaphore_create(value) - } - - public func wait() -> Bool { - return dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER) == 0 - } - - public func wait(until:NSDate?) -> Bool { - let timeout = until?.timeIntervalSinceNow - return wait(timeout) - } - - public func wait(timeout: Double?) -> Bool { - guard let timeout = timeout else { - return wait() - } - let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSTimeInterval(NSEC_PER_SEC))) - let result = dispatch_semaphore_wait(sema, time) - return result == 0 - } - - public func signal() -> Int { - return dispatch_semaphore_signal(sema) - } - } -#endif - -extension Optional { - func getOrElse(@autoclosure f:()->Wrapped) -> Wrapped { - switch self { - case .Some(let value): - return value - case .None: - return f() - } - } -} - -public class CFRunLoopSemaphore : SemaphoreType { - var source: RunLoopSource? - var signaled: Bool - - private(set) public var value: Int - - /// Creates a new semaphore with the given initial value - /// See NSCondition and https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW13 - public required init(value: Int) { - self.value = value - self.signaled = false - self.source = RunLoopSource( { [unowned self] in - self.signaled = true - self.value += 1 - // On linux timeout not working in run loop - #if os(Linux) - CFRunLoopStop(CFRunLoopGetCurrent()) - #endif - }, priority: 2) - } - - /// Creates a new semaphore with initial value 0 - /// This kind of semaphores is useful to protect a critical section - public convenience required init() { - self.init(value: 0) - } - - public func wait() -> Bool { - return wait(nil) - } - - /// returns true on success (false if timeout expired) - /// if nil is passed - waits forever - public func wait(until:NSDate?) -> Bool { - let until = until.getOrElse(NSDate.distantFuture()) - - defer { - self.signaled = false - } - - var timedout:Bool = false - - while value <= 0 { - while !self.signaled && !timedout { - RunLoop.runUntilOnce(RunLoop.defaultMode, until: until) - timedout = until.timeIntervalSinceNow <= 0 - } - if timedout { - break - } - } - - if signaled { - value -= 1 - } - - return signaled - } - - /// Performs the signal operation on this semaphore - public func signal() -> Int { - source?.signal() - return value - } - - public func willUse() { - let loop:RunLoop = RunLoop.currentRunLoop() - loop.addSource(source!, mode: RunLoop.defaultMode) - } - - public func didUse() { - let loop:RunLoop = RunLoop.currentRunLoop() - loop.removeSource(source!, mode: RunLoop.defaultMode) - } -} - -#if !os(Linux) || dispatch - public typealias LoopSemaphore = DispatchLoopSemaphore -#else - public typealias LoopSemaphore = CFRunLoopSemaphore -#endif diff --git a/ExecutionContext/PThreadExecutionContext.swift b/ExecutionContext/PThreadExecutionContext.swift deleted file mode 100644 index 7a9c1ce..0000000 --- a/ExecutionContext/PThreadExecutionContext.swift +++ /dev/null @@ -1,192 +0,0 @@ -//===--- PThreadExecutionContext.swift ------------------------------------------------------===// -//Copyright (c) 2016 Daniel Leping (dileping) -// -//Licensed under the Apache License, Version 2.0 (the "License"); -//you may not use this file except in compliance with the License. -//You may obtain a copy of the License at -// -//http://www.apache.org/licenses/LICENSE-2.0 -// -//Unless required by applicable law or agreed to in writing, software -//distributed under the License is distributed on an "AS IS" BASIS, -//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -//See the License for the specific language governing permissions and -//limitations under the License. -//===----------------------------------------------------------------------===// - -////////////////////////////////////////////////////////////////////////// -//This file is a temporary solution, just until Dispatch will run on Mac// -////////////////////////////////////////////////////////////////////////// -//#if os(Linux) - - import Foundation - import Result - #if os(Linux) - import Glibc - #endif - - private func thread_proc(pm: UnsafeMutablePointer) -> UnsafeMutablePointer { - let pthread = Unmanaged.fromOpaque(COpaquePointer(pm)).takeRetainedValue() - pthread.task?() - return nil - } - - internal class PThreadKey { - private var key: pthread_key_t = 0 - init(destructionCallback: (@convention(c) UnsafeMutablePointer -> Void)! = nil) { - pthread_key_create(&key, destructionCallback) - } - deinit { - pthread_key_delete(key) - } - } - - internal class PThread { - let thread: UnsafeMutablePointer - let task:SafeTask? - - init(task:SafeTask? = nil) { - self.task = task - self.thread = UnsafeMutablePointer.alloc(1) - } - deinit { - self.thread.destroy() - self.thread.dealloc(1) - } - - func start() { - pthread_create(thread, nil, thread_proc, UnsafeMutablePointer(Unmanaged.passRetained(self).toOpaque())) - } - - static func getSpecific(key: PThreadKey) -> AnyObject? { - let val = pthread_getspecific(key.key) - if val == nil { - return nil - } - return Unmanaged.fromOpaque(COpaquePointer(val)).takeUnretainedValue() - } - - static func setSpecific(obj: AnyObject?, key: PThreadKey, retain: Bool = false) { - if retain { - let old = pthread_getspecific(key.key) - if old != nil { - Unmanaged.fromOpaque(COpaquePointer(old)).release() - } - } - if obj == nil { - pthread_setspecific(key.key, nil) - } else { - if retain { - pthread_setspecific(key.key, UnsafePointer(Unmanaged.passRetained(obj!).toOpaque())) - } else { - pthread_setspecific(key.key, UnsafePointer(Unmanaged.passUnretained(obj!).toOpaque())) - } - } - } - - } - - private class ParallelContext : ExecutionContextBase, ExecutionContextType { - func async(task:SafeTask) { - let thread = PThread(task: task) - thread.start() - } - - func async(after:Double, task:SafeTask) { - let thread = PThread(task: { - sleep(after) - task() - }) - thread.start() - } - - func sync(task:() throws -> ReturnType) throws -> ReturnType { - return try syncThroughAsync(task) - } - } - - // This class is workaround around retain cycle in pthread run loop creation. See below in init(). Stupid ARC :( - private class RunLoopHolder { - var loop: RunLoop? = nil - } - - private class SerialContext : ExecutionContextBase, ExecutionContextType { - private let rl:RunLoop - - override init() { - let holder = RunLoopHolder() - let sema = Semaphore() - sema.willUse() - defer { - sema.didUse() - } - - PThread(task: { [unowned holder] in - holder.loop = RunLoop.currentRunLoop() - holder.loop!.startTaskQueue() - sema.signal() - RunLoop.run() - }).start() - - sema.wait() - - self.rl = holder.loop! - } - - init(runLoop:RunLoop) { - rl = runLoop - rl.startTaskQueue() - } - - deinit { - rl.stopTaskQueue() - } - - func async(task:SafeTask) { - rl.addTask(task) - } - - func async(after:Double, task:SafeTask) { - rl.addDelay(RunLoopDelay(task, delay: after), mode: RunLoop.defaultMode) - } - - func sync(task:() throws -> ReturnType) throws -> ReturnType { - if rl.isCurrent() { - return try task() - } else { - return try syncThroughAsync(task) - } - } - } - - public class PThreadExecutionContext : ExecutionContextBase, ExecutionContextType, DefaultExecutionContextType { - let inner:ExecutionContextType - - init(inner:ExecutionContextType) { - self.inner = inner - } - - public required init(kind:ExecutionContextKind) { - switch kind { - case .Serial: inner = SerialContext() - case .Parallel: inner = ParallelContext() - } - } - - public func async(task:SafeTask) { - inner.async(task) - } - - public func sync(task:() throws -> ReturnType) throws -> ReturnType { - return try inner.sync(task) - } - - public func async(after:Double, task:SafeTask) { - inner.async(after, task: task) - } - - public static let main:ExecutionContextType = PThreadExecutionContext(inner: SerialContext(runLoop: RunLoop.mainRunLoop())) - public static let global:ExecutionContextType = PThreadExecutionContext(kind: .Parallel) - } - -//#endif diff --git a/ExecutionContext/Result+Some.swift b/ExecutionContext/Result+Some.swift deleted file mode 100644 index a8942a6..0000000 --- a/ExecutionContext/Result+Some.swift +++ /dev/null @@ -1,60 +0,0 @@ -//===--- Result+Some.swift ------------------------------------------------------===// -//Copyright (c) 2016 Daniel Leping (dileping) -// -//Licensed under the Apache License, Version 2.0 (the "License"); -//you may not use this file except in compliance with the License. -//You may obtain a copy of the License at -// -//http://www.apache.org/licenses/LICENSE-2.0 -// -//Unless required by applicable law or agreed to in writing, software -//distributed under the License is distributed on an "AS IS" BASIS, -//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -//See the License for the specific language governing permissions and -//limitations under the License. -//===----------------------------------------------------------------------===// - -import Foundation -import Result - -public protocol AnyErrorType : ErrorType { - var error:ErrorType { - get - } -} - -struct AnyError : AnyErrorType { - private let e:ErrorType - - init(e:ErrorType) { - self.e = e - } - - var error:ErrorType { - get { - guard let anyError = e as? AnyError else { - return e - } - return anyError.error - } - } -} - -public extension Result where Error : AnyErrorType { - public func dematerializeAnyError() throws -> T { - switch self { - case let .Success(value): - return value - case let .Failure(error): - throw error.error - } - } -} - -func materialize(f: () throws -> T) -> Result { - do { - return .Success(try f()) - } catch let error { - return .Failure(AnyError(e: error)) - } -} \ No newline at end of file diff --git a/ExecutionContext/RunLoop.swift b/ExecutionContext/RunLoop.swift deleted file mode 100644 index 93c59c5..0000000 --- a/ExecutionContext/RunLoop.swift +++ /dev/null @@ -1,420 +0,0 @@ -//===--- RunLoop.swift ------------------------------------------------------===// -//Copyright (c) 2016 Daniel Leping (dileping) -// -//Licensed under the Apache License, Version 2.0 (the "License"); -//you may not use this file except in compliance with the License. -//You may obtain a copy of the License at -// -//http://www.apache.org/licenses/LICENSE-2.0 -// -//Unless required by applicable law or agreed to in writing, software -//distributed under the License is distributed on an "AS IS" BASIS, -//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -//See the License for the specific language governing permissions and -//limitations under the License. -//===----------------------------------------------------------------------===// - -import Foundation -import CoreFoundation - -private extension NSString { - var cfString: CFString { return unsafeBitCast(self, CFString.self) } -} - -private class TaskQueueElement { - private let task : SafeTask - private let source: RunLoopSource - var next: TaskQueueElement? = nil - - init(_ task: SafeTask, runLoopSource: RunLoopSource) { - self.task = task - self.source = runLoopSource - } - - func run() { - task() - } -} - -private class TaskQueue { - private let lock = NSLock() - private var head:TaskQueueElement? = nil - private var tail:TaskQueueElement? = nil - - func enqueue(elem: TaskQueueElement) { - defer { - lock.unlock() - } - lock.lock() - if tail == nil { - head = elem - tail = elem - } else { - tail!.next = elem - tail = elem - } - } - - func dequeue() -> TaskQueueElement? { - defer { - lock.unlock() - } - lock.lock() - let elem = head - head = head?.next - if head == nil { - tail = nil - } - elem?.next = nil - return elem - } -} - -private class RunLoopCallbackInfo { - private let lock = NSLock() - private let task: SafeTask - private var runLoops: [RunLoop] = [] - - init(_ task: SafeTask) { - self.task = task - } - - func run() { - task() - } - - func addRunLoop(rl: RunLoop) { - defer { - lock.unlock() - } - lock.lock() - runLoops.append(rl) - } - - func removeRunLoop(rl: RunLoop) { - defer { - lock.unlock() - } - lock.lock() - if let index = runLoops.indexOf(rl) { - runLoops.removeAtIndex(index) - } - } -} - -private func runLoopCallbackInfoRun(i: UnsafeMutablePointer) { - let info = Unmanaged.fromOpaque(COpaquePointer(i)).takeUnretainedValue() - info.run() -} - -private func runLoopCallbackInfoRetain(i: UnsafePointer) -> UnsafePointer { - Unmanaged.fromOpaque(COpaquePointer(i)).retain() - return i -} - -private func runLoopCallbackInfoRelease(i: UnsafePointer) { - Unmanaged.fromOpaque(COpaquePointer(i)).release() -} - -private protocol RunLoopCallback { - var info : RunLoopCallbackInfo { get } - var cfObject: AnyObject { get } -} - -class RunLoopSource : RunLoopCallback { - private let info : RunLoopCallbackInfo - private let priority : Int - private var _source: CFRunLoopSource! = nil - - private var cfObject : AnyObject { - get { - if _source == nil { - var context = CFRunLoopSourceContext( - version: 0, - info: UnsafeMutablePointer(Unmanaged.passUnretained(info).toOpaque()), - retain: runLoopCallbackInfoRetain, - release: runLoopCallbackInfoRelease, - copyDescription: nil, - equal: nil, - hash: nil, - schedule: nil, - cancel: nil, - perform: runLoopCallbackInfoRun - ) - _source = CFRunLoopSourceCreate(nil, -priority, &context) - } - return _source - } - } - - init(_ task: SafeTask, priority: Int = 0, runOnce: Bool = false) { - self.priority = priority - if runOnce { - var stopTask:SafeTask? - self.info = RunLoopCallbackInfo({ - task() - stopTask?() - }) - stopTask = { self.stop() } - } else { - self.info = RunLoopCallbackInfo(task) - } - - } - - deinit { - stop() - } - - func stop() { - if _source != nil && CFRunLoopSourceIsValid(_source) { - CFRunLoopSourceInvalidate(_source) - _source = nil - } - } - - func signal() { - if _source != nil { - CFRunLoopSourceSignal(_source) - info.lock.lock() - defer { - info.lock.unlock() - } - for loop in info.runLoops { - loop.wakeUp() - } - } - } -} - -class RunLoopTaskQueueSource : RunLoopSource { - private let queue = TaskQueue() - - init(priority: Int = 1) { - super.init({ [unowned queue] in - if let element = queue.dequeue() { - element.run() - element.source.signal() - } - }, priority: priority) - } - - func addTask(task: SafeTask) { - queue.enqueue(TaskQueueElement(task, runLoopSource: self)) - self.signal() - } -} - -private func timerRunCallback(timer: CFRunLoopTimer!, i: UnsafeMutablePointer) { - runLoopCallbackInfoRun(i) -} - -class RunLoopDelay : RunLoopCallback { - private let info : RunLoopCallbackInfo - private let delay: Double - private var _timer: CFRunLoopTimer! = nil - - private var cfObject : AnyObject { - get { - if _timer == nil { - var context = CFRunLoopTimerContext( - version: 0, - info: UnsafeMutablePointer(Unmanaged.passUnretained(info).toOpaque()), - retain: runLoopCallbackInfoRetain, - release: runLoopCallbackInfoRelease, - copyDescription: nil - ) - _timer = CFRunLoopTimerCreate(nil, CFAbsoluteTimeGetCurrent()+delay, -1, 0, 0, timerRunCallback, &context) - } - return _timer - } - } - - init(_ task: SafeTask, delay: Double) { - self.delay = delay - self.info = RunLoopCallbackInfo(task) - } -} - -private func runLoopTLRelease(rl : UnsafeMutablePointer) { - Unmanaged.fromOpaque(COpaquePointer(rl)).release() -} - -class RunLoop { - private let cfRunLoop: CFRunLoop! - - private var taskQueueSource: RunLoopTaskQueueSource? = nil - private let taskQueueLock = NSLock() - - #if !os(Linux) - static let defaultMode:NSString = "kCFRunLoopDefaultMode" as NSString - #else - static let defaultMode:NSString = "kCFRunLoopDefaultMode".bridge() - #endif - - private static let threadKey = PThreadKey(destructionCallback: runLoopTLRelease) - - private static let threadLocalLock = NSLock() - private static let MainRunLoop = RunLoop.createMainRunLoop() - - init(_ cfRunLoop: CFRunLoop) { - self.cfRunLoop = cfRunLoop - } - - convenience init(_ runLoop: AnyObject) { - self.init(unsafeBitCast(runLoop, CFRunLoop.self)) - } - - private static func createMainRunLoop() -> RunLoop { - defer { - RunLoop.threadLocalLock.unlock() - } - - RunLoop.threadLocalLock.lock() - let runLoop = RunLoop(CFRunLoopGetMain()) - if runLoop.isCurrent() { - PThread.setSpecific(runLoop, key: RunLoop.threadKey, retain: true) - } else { - let sema = Semaphore() - sema.willUse() - defer { - sema.didUse() - } - runLoop.addTask({ - PThread.setSpecific(runLoop, key: RunLoop.threadKey, retain: true) - sema.signal() - }) - sema.wait() - } - return runLoop - } - - static func currentRunLoop() -> RunLoop { - defer { - RunLoop.threadLocalLock.unlock() - } - RunLoop.threadLocalLock.lock() - guard let loop = PThread.getSpecific(RunLoop.threadKey) else { - let loop = RunLoop(CFRunLoopGetCurrent()) - PThread.setSpecific(loop, key: RunLoop.threadKey, retain: true) - return loop - } - return unsafeBitCast(loop, RunLoop.self) - } - - static func mainRunLoop() -> RunLoop { - return MainRunLoop - } - - func startTaskQueue(priority: Int = 1) { - defer { - taskQueueLock.unlock() - } - taskQueueLock.lock() - self.taskQueueSource = RunLoopTaskQueueSource() - - addSource(taskQueueSource!, mode: RunLoop.defaultMode) - } - - func stopTaskQueue() { - defer { - taskQueueLock.unlock() - } - taskQueueLock.lock() - self.taskQueueSource = nil - } - - - func isCurrent() -> Bool { - return cfRunLoop === CFRunLoopGetCurrent() - } - - static func run() { - runInMode(RunLoop.defaultMode) - } - - static func runUntil(mode: NSString, until:NSDate) { - RunLoop.runWithTimeout(mode, timeout: until.timeIntervalSinceNow) - } - - static func runUntilOnce(mode: NSString, until:NSDate) { - RunLoop.runWithOptions(mode, timeout: until.timeIntervalSinceNow, once: true) - } - - static func runWithOptions(mode: NSString, timeout:NSTimeInterval, once:Bool) { - #if !os(Linux) - //var result:CFRunLoopRunResult - //result = - CFRunLoopRunInMode(mode.cfString, timeout, once) - #else - //var result:Int32 - //result = - CFRunLoopRunInMode(mode.cfString, timeout, once) - //Int32(kCFRunLoopRunStopped) - #endif - } - - static func runWithTimeout(mode: NSString, timeout:NSTimeInterval) { - RunLoop.runWithOptions(mode, timeout: timeout, once: false) - } - - static func runInMode(mode: NSString) { - RunLoop.runWithTimeout(mode, timeout: Double.infinity) - } - - @noreturn static func runForever() { - while true { run() } - } - - func addSource(rls: RunLoopSource, mode: NSString) { - let crls = unsafeBitCast(rls.cfObject, CFRunLoopSource.self) - if CFRunLoopSourceIsValid(crls) { - CFRunLoopAddSource(cfRunLoop, crls, mode.cfString) - rls.info.addRunLoop(self) - wakeUp() - } - } - - func removeSource(rls: RunLoopSource, mode: NSString) { - let crls = unsafeBitCast(rls.cfObject, CFRunLoopSource.self) - if CFRunLoopSourceIsValid(crls) { - CFRunLoopRemoveSource(cfRunLoop, crls, mode.cfString) - rls.info.removeRunLoop(self) - wakeUp() - } - } - - func addDelay(rld: RunLoopDelay, mode: NSString) { - let crld = unsafeBitCast(rld.cfObject, CFRunLoopTimer.self) - if CFRunLoopTimerIsValid(crld) && (rld.info.runLoops.count == 0 || rld.info.runLoops[0] === self) { - CFRunLoopAddTimer(cfRunLoop, crld, mode.cfString) - rld.info.addRunLoop(self) - wakeUp() - } - } - - func addTask(task: SafeTask) { - defer { - taskQueueLock.unlock() - } - taskQueueLock.lock() - if let queue = taskQueueSource { - queue.addTask(task) - } else { - let source = RunLoopSource(task, priority: 0, runOnce: true) - addSource(source, mode: RunLoop.defaultMode) - source.signal() - } - } - - func wakeUp() { - CFRunLoopWakeUp(cfRunLoop) - } -} - -extension RunLoop : Equatable { -} - -func ==(lhs: RunLoop, rhs: RunLoop) -> Bool { - return lhs.cfRunLoop === rhs.cfRunLoop -} \ No newline at end of file diff --git a/ExecutionContext/RunLoopExecutionContext.swift b/ExecutionContext/RunLoopExecutionContext.swift new file mode 100644 index 0000000..1e8defd --- /dev/null +++ b/ExecutionContext/RunLoopExecutionContext.swift @@ -0,0 +1,200 @@ +//===--- RunLoopExecutionContext.swift -----------------------------------------------===// +//Copyright (c) 2016 Daniel Leping (dileping) +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. +//===----------------------------------------------------------------------===// + +import Foundation +import Boilerplate +import RunLoop + +private class ParallelContext : ExecutionContextBase, ExecutionContextType { + let id = NSUUID() + + func runAsync(task:SafeTask) { + do { + try Thread.detach { +/* if (!RunLoop.trySetFactory { + return RunLoop() + }) { + print("unable to set run loop") + exit(1) + }*/ + + guard let loop = RunLoop.current as? RunnableRunLoopType else { + print("unable to run run loop") + exit(1) + } + + loop.execute(task) + + loop.run() + } + } catch let e as CError { + switch e { + case .Unknown: + print("Got unknown CError while creating pthread") + case .Code(let code): + print("Got CError with code \(code) while creating pthread") + } + } catch { + print("Got Unknown error while creating pthread: ", error) + } + } + + func async(task:SafeTask) { + runAsync(task) + } + + func async(after:Timeout, task:SafeTask) { + runAsync { + RunLoop.current.execute(after, task: task) + } + } + + func sync(task:() throws -> ReturnType) rethrows -> ReturnType { + return try syncThroughAsync(task) + } + + func isEqualTo(other: NonStrictEquatable) -> Bool { + guard let other = other as? ParallelContext else { + return false + } + return id.isEqual(other.id) + } +} + +private class SerialContext : ExecutionContextBase, ExecutionContextType { + private let loop:RunnableRunLoopType + + override init() { + let sema = BlockingSemaphore() + let loop = MutableAnyContainer(nil) + + //yeah, fail for now + try! Thread.detach { + var _loop = (RunLoop.current as! RunnableRunLoopType) + loop.content = _loop + + sema.signal() + + _loop.protected = true + _loop.run() + } + + sema.wait() + + self.loop = loop.content! + } + + init(runLoop:RunLoopType) { + loop = runLoop as! RunnableRunLoopType + } + + deinit { + var loop = self.loop + loop.execute { + loop.protected = false + loop.stop() + } + } + + func async(task:SafeTask) { + loop.execute(task) + } + + func async(after:Timeout, task:SafeTask) { + loop.execute(after, task: task) + } + + func sync(task:() throws -> ReturnType) rethrows -> ReturnType { + return try loop.sync(task) + } + + func isEqualTo(other: NonStrictEquatable) -> Bool { + guard let other = other as? SerialContext else { + return false + } + return loop.isEqualTo(other.loop) + } +} + +private extension ExecutionContextKind { + func createInnerContext() -> ExecutionContextType { + switch self { + case .serial: + return SerialContext() + case .parallel: + return ParallelContext() + } + } +} + +public class RunLoopExecutionContext : ExecutionContextBase, ExecutionContextType, DefaultExecutionContextType { + let inner:ExecutionContextType + + init(inner:ExecutionContextType) { + self.inner = inner + } + + public required convenience init(kind:ExecutionContextKind) { + self.init(inner: kind.createInnerContext()) + } + + public func async(task:SafeTask) { + inner.async { + currentContext.value = self + task() + } + } + + public func async(after:Timeout, task:SafeTask) { + inner.async(after) { + currentContext.value = self + task() + } + } + + public func sync(task:() throws -> ReturnType) rethrows -> ReturnType { + if self.isCurrent { + return try task() + } + return try inner.sync { + currentContext.value = self + return try task() + } + } + + public func isEqualTo(other: NonStrictEquatable) -> Bool { + guard let other = other as? RunLoopExecutionContext else { + return false + } + return inner.isEqualTo(other.inner) + } + + public static let main:ExecutionContextType = RunLoopExecutionContext(inner: SerialContext(runLoop: RunLoop.main)) + public static let global:ExecutionContextType = RunLoopExecutionContext(kind: .parallel) + + @noreturn + public static func mainProc() { + if !Thread.isMain { + print("Main proc was called on non-main thread. Exiting") + exit(1) + } + var loop = (RunLoop.main as! RunnableRunLoopType) + loop.protected = true + while true { + loop.run() + } + } +} \ No newline at end of file diff --git a/ExecutionContext/Semaphore.swift b/ExecutionContext/Semaphore.swift deleted file mode 100644 index e833349..0000000 --- a/ExecutionContext/Semaphore.swift +++ /dev/null @@ -1,115 +0,0 @@ -//===--- Semaphore.swift ------------------------------------------------------===// -//Copyright (c) 2016 Daniel Leping (dileping) -// -//Licensed under the Apache License, Version 2.0 (the "License"); -//you may not use this file except in compliance with the License. -//You may obtain a copy of the License at -// -//http://www.apache.org/licenses/LICENSE-2.0 -// -//Unless required by applicable law or agreed to in writing, software -//distributed under the License is distributed on an "AS IS" BASIS, -//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -//See the License for the specific language governing permissions and -//limitations under the License. -//===----------------------------------------------------------------------===// - -import Foundation - -private extension NSCondition { - func waitWithConditionalEnd(date:NSDate?) -> Bool { - guard let date = date else { - self.wait() - return true - } - return self.waitUntilDate(date) - } -} - -public protocol SemaphoreType { - init() - init(value: Int) - - func wait() -> Bool - func wait(until:NSDate?) -> Bool - func wait(timeout: Double?) -> Bool - - func signal() -> Int -} - -public extension SemaphoreType { - /// Performs the wait operation on this semaphore until the timeout - /// Returns true if the semaphore was signalled before the timeout occurred - /// or false if the timeout occurred. - public func wait(timeout: Double?) -> Bool { - let until = timeout.flatMap {$0 <= 0 ? nil : $0}.map{NSDate(timeIntervalSinceNow: $0)} - return wait(until) - } -} - -/// A wrapper around NSCondition -public class Semaphore : SemaphoreType { - - /// The underlying NSCondition - private(set) public var underlyingSemaphore: NSCondition - private(set) public var value: Int - - /// Creates a new semaphore with the given initial value - /// See NSCondition and https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW13 - public required init(value: Int) { - self.underlyingSemaphore = NSCondition() - self.value = value - } - - /// Creates a new semaphore with initial value 0 - /// This kind of semaphores is useful to protect a critical section - public convenience required init() { - self.init(value: 0) - } - - public func wait() -> Bool { - return wait(nil) - } - - /// returns true on success (false if timeout expired) - /// if nil is passed - waits forever - public func wait(until:NSDate?) -> Bool { - underlyingSemaphore.lock() - defer { - underlyingSemaphore.unlock() - } - - var signaled:Bool = true - while value <= 0 { - signaled = underlyingSemaphore.waitWithConditionalEnd(until) - if !signaled { - break - } - } - - if signaled { - value -= 1 - } - - return signaled - } - - /// Performs the signal operation on this semaphore - public func signal() -> Int { - underlyingSemaphore.lock() - defer { - underlyingSemaphore.unlock() - } - value += 1 - underlyingSemaphore.signal() - return value - } -} - -public extension SemaphoreType { - public func willUse() { - } - - public func didUse() { - } -} \ No newline at end of file diff --git a/Package.swift b/Package.swift index a81e482..efea85d 100644 --- a/Package.swift +++ b/Package.swift @@ -18,10 +18,11 @@ import PackageDescription let package = Package( name: "ExecutionContext", - targets: [ - Target( - name: "ExecutionContext" - ), - ], - dependencies: [.Package(url: "https://github.com/crossroadlabs/Result.git", majorVersion: 1)] + targets: [Target(name: "ExecutionContext")], + dependencies: [ + .Package(url: "https://github.com/antitypical/Result.git", majorVersion: 2), + .Package(url: "https://github.com/crossroadlabs/Boilerplate.git", majorVersion: 0, minor: 1), + .Package(url: "https://github.com/crossroadlabs/XCTest3.git", majorVersion: 0, minor: 1), + .Package(url: "https://github.com/crossroadlabs/RunLoop.git", majorVersion: 0, minor: 1), + ] ) diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..1239ebe --- /dev/null +++ b/Podfile @@ -0,0 +1 @@ +pod 'RunLoop', :git => 'git@github.com:necrowman/TestPodspecs.git', :branch => 'master' \ No newline at end of file diff --git a/Tests/ExecutionContext/ExecutionContextTests.swift b/Tests/ExecutionContext/ExecutionContextTests.swift index b7bd3ad..ea4874c 100644 --- a/Tests/ExecutionContext/ExecutionContextTests.swift +++ b/Tests/ExecutionContext/ExecutionContextTests.swift @@ -17,63 +17,92 @@ import XCTest @testable import ExecutionContext +#if !os(tvOS) + import XCTest3 +#endif + #if os(Linux) import Glibc #endif +import Boilerplate +import RunLoop + +#if !os(tvOS) class ExecutionContextTests: XCTestCase { //Tests does not create static variables. We need initialized main thread //let mainContext = DefaultExecutionContext.main func syncTest(context:ExecutionContextType) { - let expectation = self.expectationWithDescription("OK SYNC") + + let expectation = self.expectation(withDescription: "OK SYNC") context.sync { expectation.fulfill() } - self.waitForExpectationsWithTimeout(0, handler: nil) + self.waitForExpectations(withTimeout: 0, handler: nil) } - func asyncTest(context:ExecutionContextType) { - let expectation = self.expectationWithDescription("OK ASYNC") + func asyncTest(context:ExecutionContextType, runRunLoop: Bool = false) { + let expectation = self.expectation(withDescription: "OK ASYNC") context.async { - sleep(1.0) + if runRunLoop { + (RunLoop.current as! RunnableRunLoopType).run(.In(timeout: 1)) + } else { + Thread.sleep(1) + } expectation.fulfill() } - self.waitForExpectationsWithTimeout(2, handler: nil) + if runRunLoop { + (RunLoop.current as! RunnableRunLoopType).run(.In(timeout: 2)) + } + + self.waitForExpectations(withTimeout: 2, handler: nil) } - func afterTest(context:ExecutionContextType) { - let expectation = self.expectationWithDescription("OK AFTER") + func afterTest(context:ExecutionContextType, runRunLoop: Bool = false) { + let expectation = self.expectation(withDescription: "OK AFTER") context.async(0.5) { expectation.fulfill() } - self.waitForExpectationsWithTimeout(3, handler: nil) + if runRunLoop { + (RunLoop.current as! RunnableRunLoopType).run(.In(timeout: 3)) + } + + self.waitForExpectations(withTimeout: 3, handler: nil) } - func afterTestAdvanced(context:ExecutionContextType) { + func afterTestAdvanced(context:ExecutionContextType, runRunLoop: Bool = false) { var ok = true context.async(3) { ok = false } - sleep(2.0) + if runRunLoop { + (RunLoop.current as! RunnableRunLoopType).run(.In(timeout: 2)) + } else { + Thread.sleep(2.0) + } XCTAssert(ok) - sleep(2.0) + if runRunLoop { + (RunLoop.current as! RunnableRunLoopType).run(.In(timeout: 2)) + } else { + Thread.sleep(2.0) + } XCTAssertFalse(ok) } func testSerial() { - let context:ExecutionContextType = DefaultExecutionContext(kind: .Serial) + let context:ExecutionContextType = DefaultExecutionContext(kind: .serial) syncTest(context) asyncTest(context) @@ -82,7 +111,7 @@ class ExecutionContextTests: XCTestCase { } func testParallel() { - let context:ExecutionContextType = DefaultExecutionContext(kind: .Parallel) + let context:ExecutionContextType = DefaultExecutionContext(kind: .parallel) syncTest(context) asyncTest(context) @@ -101,10 +130,17 @@ class ExecutionContextTests: XCTestCase { func testMain() { let context:ExecutionContextType = DefaultExecutionContext.main - - syncTest(context) - asyncTest(context) - afterTest(context) + #if os(Linux) + let runRunLoop = true + #else + let runRunLoop = false + #endif + + #if !os(Linux) + syncTest(context) + #endif + asyncTest(context, runRunLoop: runRunLoop) + afterTest(context, runRunLoop: runRunLoop) //afterTestAdvanced - no it will not work here } @@ -119,10 +155,15 @@ class ExecutionContextTests: XCTestCase { func testCustomOnMain() { let context = executionContext(main.execute) - - syncTest(context) - asyncTest(context) - afterTest(context) + #if os(Linux) + let runRunLoop = true + #else + let runRunLoop = false + #endif + +// syncTest(context) + asyncTest(context, runRunLoop: runRunLoop) + afterTest(context, runRunLoop: runRunLoop) //afterTestAdvanced - no it will not work here } @@ -136,39 +177,21 @@ class ExecutionContextTests: XCTestCase { afterTest(context) //afterTestAdvanced - no it will not work here } - - func testSemaphore() { - let sema = Semaphore(value: 1) - var n = 0 - for _ in [0...100] { - global.execute { - sema.willUse() - defer { - sema.didUse() - } - sema.wait() - XCTAssert(n == 0, "Should always be zero") - n += 1 - sleep(0.1) - n -= 1 - sema.signal() - } - } - } } +#endif #if os(Linux) -extension ExecutionContextTests : XCTestCaseProvider { - var allTests : [(String, () throws -> Void)] { - return [ - ("testSerial", testSerial), - ("testParallel", testParallel), - ("testGlobal", testGlobal), - ("testMain", testMain), - ("testCustomOnGlobal", testCustomOnGlobal), - ("testCustomOnMain", testCustomOnMain), - ("testCustomSimple", testCustomSimple) - ] - } +extension ExecutionContextTests { + static var allTests : [(String, ExecutionContextTests -> () throws -> Void)] { + return [ + ("testSerial", testSerial), + ("testParallel", testParallel), + ("testGlobal", testGlobal), + ("testMain", testMain), + ("testCustomOnGlobal", testCustomOnGlobal), + ("testCustomOnMain", testCustomOnMain), + ("testCustomSimple", testCustomSimple), + ] + } } -#endif \ No newline at end of file +#endif diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift index 6217a12..4783876 100644 --- a/Tests/LinuxMain.swift +++ b/Tests/LinuxMain.swift @@ -1,23 +1,7 @@ -//===--- LinuxMain.swift ---------------------------------------------------===// -//Copyright (c) 2016 Daniel Leping (dileping) -// -//Licensed under the Apache License, Version 2.0 (the "License"); -//you may not use this file except in compliance with the License. -//You may obtain a copy of the License at -// -//http://www.apache.org/licenses/LICENSE-2.0 -// -//Unless required by applicable law or agreed to in writing, software -//distributed under the License is distributed on an "AS IS" BASIS, -//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -//See the License for the specific language governing permissions and -//limitations under the License. -//===----------------------------------------------------------------------===// - import XCTest -@testable import ExecutionContexttest +@testable import ExecutionContextTestSuite XCTMain([ - ExecutionContextTests(), -]) + testCase(ExecutionContextTests.allTests), +]) \ No newline at end of file