This is an automated email from the ASF dual-hosted git repository.

jianhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-weex.git


The following commit(s) were added to refs/heads/master by this push:
     new 15c22d7  [iOS] check js thread block
     new 6e17f92  Merge pull request #3009 from jianhan-he/master
15c22d7 is described below

commit 15c22d7815ad82f8fc1aee39f98678c3d01b96b4
Author: linghe.lh <[email protected]>
AuthorDate: Thu Nov 7 10:21:13 2019 +0800

    [iOS] check js thread block
---
 ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm    |  2 +
 ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm  |  6 ++-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h       |  1 +
 ios/sdk/WeexSDK/Sources/Engine/WXSDKError.m       |  1 +
 ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h |  6 +++
 ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m | 52 ++++++++++++++++++++++-
 ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m    |  4 +-
 7 files changed, 68 insertions(+), 4 deletions(-)

diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm 
b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
index d739d63..f232ada 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
@@ -1570,6 +1570,8 @@ static WeexCore::ScriptBridge* jsBridge = nullptr;
         WeexCore::WeexCoreManager::Instance()->set_script_bridge(jsBridge);
         
         
WeexCore::WeexCoreManager::Instance()->set_measure_function_adapter(new 
WeexCore::WXCoreMeasureFunctionBridge());
+
+        [[WXSDKManager bridgeMgr] checkJSThread];
     });
 }
 
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm 
b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm
index 9caff56..0c3d251 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm
@@ -39,6 +39,7 @@
 #import "WXCoreBridge.h"
 #import "WXAnalyzerCenter.h"
 
+
 #import <dlfcn.h>
 
 #import <mach/mach.h>
@@ -143,7 +144,10 @@
 - (JSValue *)callJSMethod:(NSString *)method args:(NSArray *)args
 {
     WXLogDebug(@"Calling JS... method:%@, args:%@", method, args);
-//    __checkMutable(args);
+    WXPerformBlockOnMainThread(^{
+        [[WXBridgeManager sharedManager].lastMethodInfo setObject:method ?: 
@"" forKey:@"method"];
+        [[WXBridgeManager sharedManager].lastMethodInfo setObject:args ?: @[] 
forKey:@"args"];
+    });
     return [[_jsContext globalObject] invokeMethod:method withArguments:args];
 }
 
diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h 
b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
index 17fa069..7523cf9 100644
--- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
+++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
@@ -88,6 +88,7 @@ typedef NS_ENUM(int, WXSDKErrCode)
     WX_KEY_EXCEPTION_JS_DOWNLOAD =-9200,
     WX_KEY_EXCEPTION_DOM = -9300,
     WX_KEY_EXCEPTION_WXBRIDGE=-9400,
+    WX_KEY_EXCEPTION_JS_THREAD_BLOCK=-9401,
     
     // The following error codes have a remapped value defined in 
WXSDKUniversalErrCode
     WX_KEY_EXCEPTION_DEGRADE = -9500,
diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.m 
b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.m
index 0f06927..755cdd1 100644
--- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.m
+++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.m
@@ -88,6 +88,7 @@
                 
@(WX_KEY_EXCEPTION_JS_DOWNLOAD):@{ERROR_TYPE:@(WX_DOWN_LOAD_ERROR),ERROR_GROUP:@(WX_NATIVE)},
                 
@(WX_KEY_EXCEPTION_DOM):@{ERROR_TYPE:@(WX_NATIVE_ERROR),ERROR_GROUP:@(WX_NATIVE)},
                 
@(WX_KEY_EXCEPTION_WXBRIDGE):@{ERROR_TYPE:@(WX_JS_ERROR),ERROR_GROUP:@(WX_JS)},
+                
@(WX_KEY_EXCEPTION_JS_THREAD_BLOCK):@{ERROR_TYPE:@(WX_JS_ERROR),ERROR_GROUP:@(WX_JS)},
                 
                 
@(WX_KEY_EXCEPTION_DEGRADE):@{ERROR_TYPE:@(WX_DEGRADE_ERROR),ERROR_GROUP:@(WX_NATIVE),ERROR_ALIAS:@(WX_UNI_KEY_EXCEPTION_DEGRADE)},
                 
@(WX_KEY_EXCEPTION_DEGRADE_CHECK_CONTENT_LENGTH_FAILED):@{ERROR_TYPE:@(WX_DEGRADE_ERROR),ERROR_GROUP:@(WX_NET),ERROR_ALIAS:@(WX_UNI_KEY_EXCEPTION_DEGRADE_CHECK_CONTENT_LENGTH_FAILED)},
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h 
b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
index 3b1d2a4..5fc9c54 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
@@ -45,6 +45,10 @@ extern "C" {
  **/
 @property (nonatomic, weak, readonly) WXSDKInstance *topInstance;
 
+@property (nonatomic, strong) NSMutableDictionary *lastMethodInfo;
+
++ (instancetype)sharedManager;
+
 /**
  *  Create Instance Method
  *  @param instance  :   instance id
@@ -246,6 +250,8 @@ extern "C" {
 
 - (void)executeJSTaskQueue;
 
+- (void)checkJSThread;
+
 @end
 
 NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m 
b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
index ff89cfc..4f6a3f2 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
@@ -37,6 +37,9 @@
 #import "WXDataRenderHandler.h"
 #import "WXHandlerFactory.h"
 #import "WXUtility.h"
+#import "WXExceptionUtils.h"
+#import "WXSDKEngine.h"
+#import "WXConfigCenterProtocol.h"
 
 @interface WXBridgeManager ()
 
@@ -46,6 +49,7 @@
 @property (nonatomic, strong) WXBridgeContext *backupBridgeCtx;
 @property (nonatomic, strong) WXThreadSafeMutableArray *instanceIdStack;
 @property (nonatomic, strong) NSMutableArray* jsTaskQueue;
+@property (nonatomic, strong) NSTimer *timer;
 
 @end
 
@@ -71,10 +75,20 @@ static NSThread *WXBackupBridgeThread;
         _bridgeCtx = [[WXBridgeContext alloc] init];
         _supportMultiJSThread = NO;
         _jsTaskQueue = [NSMutableArray array];
+        _timer = nil;
+        _lastMethodInfo = [NSMutableDictionary dictionary];
     }
     return self;
 }
 
+- (WXBridgeContext *)bridgeCtx {
+    if (_bridgeCtx) {
+        return _bridgeCtx;
+    }
+    _bridgeCtx = [[WXBridgeContext alloc] init];
+    return _bridgeCtx;
+}
+
 - (WXBridgeContext *)backupBridgeCtx {
     if (_backupBridgeCtx) {
         return _backupBridgeCtx;
@@ -120,7 +134,7 @@ static NSThread *WXBackupBridgeThread;
         [WXBridgeThread setQualityOfService:[[NSThread mainThread] 
qualityOfService]];
         [WXBridgeThread start];
     });
-    
+
     return WXBridgeThread;
 }
 
@@ -778,6 +792,42 @@ void WXPerformBlockSyncOnBridgeThreadForInstance(void 
(^block) (void), NSString*
     }, instanceId);
 }
 
+#pragma mark JS Thread Check
+- (void)checkJSThread {
+    if (!_timer) {
+        id configCenter = [WXSDKEngine 
handlerForProtocol:@protocol(WXConfigCenterProtocol)];
+        if ([configCenter 
respondsToSelector:@selector(configForKey:defaultValue:isDefault:)]) {
+            BOOL enableCheckJSThread = [[configCenter 
configForKey:@"iOS_weex_ext_config.enable_check_js_thread" defaultValue:@(YES) 
isDefault:NULL] boolValue];
+            if (enableCheckJSThread) {
+                _timer = [NSTimer scheduledTimerWithTimeInterval:5.0f 
target:self selector:@selector(_postTaskToBridgeThread) userInfo:nil 
repeats:YES];
+            }
+        }
+    }
+}
+
+- (void)_postTaskToBridgeThread {
+    __block BOOL taskFinished = NO;
+    WXPerformBlockOnBridgeThread(^{
+        taskFinished = YES;
+    });
+
+    __weak typeof(self) weakSelf = self;
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * 
NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        if (!weakSelf) {
+            return;
+        }
+        if (!taskFinished) {
+            WXSDKErrCode errorCode = WX_KEY_EXCEPTION_JS_THREAD_BLOCK;
+            WXSDKInstance* instance = weakSelf.topInstance;
+            if (!instance) {
+                return;
+            }
+            NSString *instanceId = instance.instanceId;
+            [WXExceptionUtils commitCriticalExceptionRT:instanceId 
errCode:[NSString stringWithFormat:@"%d", errorCode] function:@"" 
exception:@"JS Thread is block" extParams:weakSelf.lastMethodInfo];
+        }
+    });
+}
+
 #pragma mark - Deprecated
 
 - (void)executeJsMethod:(WXCallJSMethod *)method
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m 
b/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m
index de71a29..9d16d1c 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.m
@@ -47,7 +47,7 @@ static WXSDKManager *_sharedInstance = nil;
 - (instancetype)init
 {
     if (self = [super init]){
-        _bridgeMgr = [[WXBridgeManager alloc] init];
+        _bridgeMgr = [WXBridgeManager sharedManager];
     }
     return self;
 }
@@ -57,7 +57,7 @@ static WXSDKManager *_sharedInstance = nil;
     WXBridgeManager* result = [self sharedInstance].bridgeMgr;
     if (result == nil) {
         // devtool may invoke "unload" and set bridgeMgr to nil
-        result = [[WXBridgeManager alloc] init];
+        result = [WXBridgeManager sharedManager];
         [self sharedInstance].bridgeMgr = result;
     }
     return result;

Reply via email to