Skip to content
This repository has been archived by the owner on Jun 3, 2021. It is now read-only.

Commit

Permalink
[Android] fix white screen cause deadlock (#2901)
Browse files Browse the repository at this point in the history
  • Loading branch information
lucky-chen authored and Darin726 committed Sep 16, 2019
1 parent 8a6c6fa commit 89a1097
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@
*/
public interface IWXConfigAdapter {
String getConfig(String nameSpace,String key,String defaultValue);
String getConfigWhenInit(String nameSpace,String key,String defaultValue);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2274,6 +2274,16 @@ private WXParams assembleDefaultOptions() {
customOptions.put("__enable_native_promise__","true");
}

String enableAlarmSignal = "true";
IWXConfigAdapter adapter = WXSDKManager.getInstance().getWxConfigAdapter();
if (null != adapter){
try {
enableAlarmSignal = adapter.getConfigWhenInit("wxapm","enableAlarmSignal",enableAlarmSignal);
}catch (Exception e){
e.printStackTrace();
}
}
customOptions.put("enableAlarmSignal",enableAlarmSignal);

wxParams.setOptions(customOptions);
wxParams.setNeedInitV8(WXSDKManager.getInstance().needInitV8());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ __attribute__((visibility("default"))) extern "C" int serverMain(int argc, char
namespace weex {
namespace bridge {
namespace js {
bool ScriptBridgeInMultiProcess::has_read_alarm_config = false;

static inline const char* GetUTF8StringFromIPCArg(IPCArguments* arguments, size_t index) {
return arguments->getByteArray(index)->length == 0 ? nullptr : arguments->getByteArray(index)->content;
Expand Down Expand Up @@ -275,6 +276,20 @@ namespace weex {
WeexEnv::getEnv()->set_m_cache_task_(enable);
}
}
if (!has_read_alarm_config){
#ifdef USE_JS_RUNTIME
std::string type = init_framework_params->type->content;
std::string value = init_framework_params->value->content;
#else
auto type = String::fromUTF8(init_framework_params->type->content);
auto value = String::fromUTF8(init_framework_params->value->content);
#endif
if (type == "enableAlarmSignal"){
has_read_alarm_config = true;
auto enable = value =="true";
WeexEnv::getEnv()->enableHandleAlarmSignal(enable);
}
}

params.push_back(init_framework_params);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class ScriptBridgeInMultiProcess : public WeexCore::ScriptBridge {
private:
static ScriptBridgeInMultiProcess* g_instance;
DISALLOW_COPY_AND_ASSIGN(ScriptBridgeInMultiProcess);
static bool has_read_alarm_config;
};
} // namespace js
} // namespace bridge
Expand Down
3 changes: 3 additions & 0 deletions weex_core/Source/android/jsengine/object/weex_env.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,9 @@ class WeexEnv {
bool enableBackupThread() {
return enableBackupThread__;
}
inline void enableHandleAlarmSignal(bool enable){
crashHandler->setEnableAlarmSignal(enable);
}

void jsc_init_finished() { isJscInitOk_ = true; };

Expand Down
30 changes: 30 additions & 0 deletions weex_core/Source/base/crash/crash_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ DECLARE_SIGNAL(SIGTRAP)
{ 0, nullptr }
};

volatile sig_atomic_t is_sig_after_crash = 0;

/* static functions */
static bool isFileAccess(const char* file)
{
Expand All @@ -71,6 +73,12 @@ static bool isFileAccess(const char* file)
return true;
}

static void handleExitAlarm(int num, siginfo_t* info, void* ucontext){
if (is_sig_after_crash){
_exit(0);
}
}

static void crashSigAction(int num, siginfo_t* info, void* ucontext)
{
bool handled = false;
Expand Down Expand Up @@ -163,6 +171,28 @@ bool CrashHandlerInfo::handleSignal(int signum, siginfo_t* siginfo, void* uconte
//signal

m_crash_occurs = true;

if (handle_alarm_signal){
//handleSignal maybe cause sig delivered deadLock,and maybe block weexCoreThread on ipc,then cause whiteScreen or other issue unless restart app
//cause 1:async-signal-safe http://man7.org/linux/man-pages/man7/signal-safety.7.html#top_of_page
//cause 2:other logic crash or dl.
//solution: google breakPad dump crash on a new process to avoid bugs.
//tmp solution: setTimeout 1s,force exit on handleExitAlarm(if has deadLock)


is_sig_after_crash =1;

struct sigaction alarmSigaction = { 0 };
alarmSigaction.sa_sigaction = handleExitAlarm;
alarmSigaction.sa_flags = SA_SIGINFO;


if (-1 == sigaction(SIGALRM, &alarmSigaction, nullptr)) {
_exit(0);
}
alarm(1);
}

LOG(INFO) << "CrashHandlerInfo::handleSignal";
const char* signalName = nullptr;
for (int i = 0; s_hookSignals[i].signum; ++i) {
Expand Down
2 changes: 2 additions & 0 deletions weex_core/Source/base/crash/crash_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class CrashHandlerInfo {
int signum;
const char* signame;
};
void setEnableAlarmSignal(bool handle){handle_alarm_signal = handle;}

private:
void printContext();
Expand Down Expand Up @@ -67,6 +68,7 @@ class CrashHandlerInfo {
std::string m_fileContent;
mcontext_t m_mcontext;
volatile bool m_crash_occurs;
volatile bool handle_alarm_signal = true;
};
}
#endif /* CRASHHANDLER_H */

0 comments on commit 89a1097

Please sign in to comment.