static void LogFunctionAndJSStack(const char* funcname) { char *jsstack = PrintJSStack(); __android_log_print(ANDROID_LOG_INFO, "PowerManagerService", \ "Call to %s. The JS stack is:\n%s\n", funcname, jsstack ? jsstack : "<no JS stack>"); }
void ProcessLink::SendMessage(Message *msg) { mChan->AssertWorkerThread(); mChan->mMonitor->AssertCurrentThreadOwns(); #ifdef MOZ_NUWA_PROCESS // Parent to child: check whether we are sending some unexpected message to // the Nuwa process. if (mIsToNuwaProcess && mozilla::dom::ContentParent::IsNuwaReady()) { switch (msg->type()) { case mozilla::dom::PNuwa::Msg_Fork__ID: case mozilla::dom::PNuwa::Reply_AddNewProcess__ID: case mozilla::dom::PContent::Msg_NotifyPhoneStateChange__ID: case mozilla::dom::PContent::Msg_ActivateA11y__ID: case mozilla::hal_sandbox::PHal::Msg_NotifyNetworkChange__ID: case GOODBYE_MESSAGE_TYPE: break; default: #ifdef DEBUG MOZ_CRASH(); #else // In optimized build, message will be dropped. printf_stderr("Sending message to frozen Nuwa"); return; #endif } } #if defined(DEBUG) // Nuwa to parent: check whether we are currently blocked. if (IsNuwaProcess() && mIsBlocked) { char* jsstack = PrintJSStack(); printf_stderr("Fatal error: sending a message to the chrome process" "with a blocked IPC channel from \n%s", jsstack ? jsstack : "<no JS stack>"); JS_smprintf_free(jsstack); MOZ_CRASH(); } #endif #endif mIOLoop->PostTask( FROM_HERE, NewRunnableMethod(mTransport, &Transport::Send, msg)); }