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

[Android] fix white screen cause deadlock #2901

Merged
merged 1 commit into from
Sep 16, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 */