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;