JSPatch icon indicating copy to clipboard operation
JSPatch copied to clipboard

主线程卡死问题

Open ganvinalix opened this issue 8 years ago • 5 comments

OC部分:

一个简单对象

@interface NewObject : NSObject
@property (nonatomic,strong) NSString *property1;
@end
@implementation NewObject
@end

ViewController中人为点击触发toTestJSPath


-(void)toTestJSPath:(id)sender
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
    {
        for (NSUInteger i = 0; i <15; i++)
        {
            [self doBackGroupThread:i];
        }
    });

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
                   {
                       for (NSUInteger i = 0; i <15; i++)
                       {
                           [self testBlock:nil];
                       }

    });
}
-(void)doBackGroupThread:(NSUInteger)i
{

}
-(void)doSomeThing:(NSUInteger)i
{
    // _obj为NewObject
     [_obj property1];
}

JS补丁部分:


defineClass('ViewController', {
  doBackGroupThread: function(i) {
    var slt = self;
    dispatch_async_main(function() {
        slt.doSomeThing(i);
    });

  },

  testBlock: function(sender) {
  }
});

defineClass('NewObject', {
            property1: function() {
            }
});

说明:

如上基本上都会卡死主线程,我修改dispatch_async_main扩展就不会卡死了

  context[@"dispatch_async_main"] = ^(JSValue *func) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [_JSMethodForwardCallLock lock];
            [func callWithArguments:nil];
            [_JSMethodForwardCallLock unlock];
        });
    };

ganvinalix avatar Jun 24 '16 11:06 ganvinalix

子线程调doBackGroupThread-> JSMethod Lock -> dispatch_async_main -> 调 JS 的 doSomeThing -> 等待 JSMethod Lock -> 死锁 确实是有这问题


想错了,调dispatch_async_main后未调doSomeThing时这段JS已经执行完,JSMethod Lock已经解锁了。还没想明白

bang590 avatar Jun 30 '16 03:06 bang590

@bang590 这个问题 有方案木 bang 哥 demo 上次发给你了

ganvinalix avatar Aug 18 '16 01:08 ganvinalix

@bang590 昨天还遇到复写一个子线程函数 然后这个函数被oc子线程触发到js执行报错: FATAL ERROR: JavaScript garbage collection failed because thread_get_state returned an error (268435459). This is probably the result of running inside Rosetta, which is not supported. /SourceCache/JavaScriptCoreEmbedded/JavaScriptCoreEmbedded-1218.35/heap/MachineStackMarker.cpp(350) : size_t JSC::getPlatformThreadRegisters(const PlatformThread &, PlatformThreadRegisters &)

ganvinalix avatar Aug 18 '16 01:08 ganvinalix

@ganvinalix JavaScript garbage collection failed 这问题解决了吗? 我修复tableView_cellForRowAtIndexPath,iPhone 4s报同样的错误

dw0625 avatar Aug 22 '16 09:08 dw0625

@dw0625 没有子线程调用js替换函数某种情况下导致的问题

ganvinalix avatar Sep 29 '16 06:09 ganvinalix