mars源码分析

如果网络状态发生改变,通过BaseEvent.onNetworkChange通知native层。 mars/baseevent/jni/com_tencent_mars_BaseEvent.cc

1
mars::baseevent::OnNetworkChange();

然后到达 mars/baseevent/src/baseprjevent.cc

信号响应: mars/stn/stn_logic.cc:

1
2
3
4
static void onNetworkChange() {

STN_WEAK_CALL(OnNetworkChange());
}

执行了一个唤醒的调用,通过宏STN_WEAK_CALL,具体的先不看吧,调用的是函数OnNetworkChange: mars/stn/src/timing_sync.cc:

1
2
3
4
5
6
7
8
void TimingSync::OnNetworkChange()
{
if (alarm_.IsWaiting())
{
alarm_.Cancel();
alarm_.Start(GetAlarmTime(active_logic_.IsActive()));
}
}

这里又引入了alarm这个东西,看起来是个警报器。重新启动了他,给定了一个时间 BaseEvent所触发的各个函数:

1
2
3
4
5
6
7
8
9
10
static void onCreate() {
#if !UWP && !defined(WIN32)
signal(SIGPIPE, SIG_IGN);
#endif

xinfo2(TSF"stn oncreate");
ActiveLogic::Singleton::Instance();
NetCore::Singleton::Instance();

}

实际上是new出了这个NetCore单例。这其中使用了大量的宏,配合智能指针处理

信号关联:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static void __initbind_baseprjevent() {

#ifdef ANDROID
mars::baseevent::addLoadModule(kLibName);
#endif

GetSignalOnCreate().connect(&onCreate);
GetSignalOnDestroy().connect(&onDestroy);
GetSignalOnSingalCrash().connect(&onSingalCrash);
GetSignalOnExceptionCrash().connect(&onExceptionCrash);
GetSignalOnNetworkChange().connect(&onNetworkChange);

#ifndef XLOGGER_TAG
#error "not define XLOGGER_TAG"
#endif

GetSignalOnNetworkDataChange().connect(&OnNetworkDataChange);
}

BOOT_RUN_STARTUP(__initbind_baseprjevent);

这里调用connect连接了onNetworkChange这个函数。我们先看下哪里调用这个BOOT_RUN_STARTUP初始化了: mars/comm/bootrun.h:

1
#define BOOT_RUN_STARTUP(func) VARIABLE_IS_NOT_USED static int __anonymous_run_variable_startup_##func = boot_run_atstartup(func)

是个静态变量,这里利用了c++的技巧,全局静态变量会在一开始就初始化,因此这里实际上在这里调用了__initbind_baseprjevent这个静态方法,然后实现了一开始信号与槽的连接。

stn_logic.cc 的onCreate中实例化ActiveLogic与NetCore

坚持原创技术分享,您的支持将鼓励我继续创作!