让我们进入AppInitMain函数
首先const CChainParams& chainparams = Params();
返回一个CChainParams类型的指针。这个类型包含了合约相关的接口,比如说产生区块GenesisBlock
然后CreatePidFile
这个就是输出详细错误的文件。
InitSignatureCache();初始化签名执行缓冲
点进去一看是这种函数
size_t nMaxCacheSize = std::min(std::max((int64_t)0, gArgs.GetArg("-maxsigcachesize", DEFAULT_MAX_SIG_CACHE_SIZE) / 2), MAX_MAX_SIG_CACHE_SIZE) * ((size_t) 1 << 20);
size_t nElems = signatureCache.setup_bytes(nMaxCacheSize);
然后并没有什么作用,只是将缓冲区的上下限输入到日志当中
InitScriptExecutionCache();//这个函数同上
这里开线程去执行ThreadScriptCheck
if (nScriptCheckThreads) {
for (int i=0; i<nScriptCheckThreads-1; i++)
threadGroup.create_thread(&ThreadScriptCheck);
}
CScheduler::Function serviceLoop = std::bind(&CScheduler::serviceQueue, &scheduler);
threadGroup.create_thread(std::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
看不懂没关系 serviceLoop 就是scheduler的serviceQueue函数。然后开一个线程去执行serviceLoop。然后实现生产者模式。保证将来生产的一些事件顺序执行。
template <typename Callable> void (const char* name, Callable func)
我们来看 void serviceQueue();的解释
// To keep things as simple as possible, there is no unschedule.
// Services the queue 'forever'. Should be run in a thread,
// and interrupted using boost::interrupt_thread
我没看懂。看代码
while (!shouldStop()) {
try {
if (!shouldStop() && taskQueue.empty()) {
reverse_lock<boost::unique_lock<boost::mutex> > rlock(lock);
// Use this chance to get more entropy
RandAddSeedSleep();
}
while (!shouldStop() && taskQueue.empty()) {
// Wait until there is something to do.
newTaskScheduled.wait(lock);
}
原来这个是一个循环跑队列。队列里没有任务就休眠。一旦有任务就触发处理任务的行为。
是这个任务队列是用std :: multimap实现的,map的关键表达某一时刻,map的值表达:那一时刻要执行的函数,内部使用条件变量和锁来保护multimap,还有几个bool条件
接着往下看看:
GetMainSignals().RegisterBackgroundSignalScheduler(scheduler);
/** Register a CScheduler to give callbacks which should run in the background (may only be called once) */
GetMainSignals().RegisterWithMempoolSignals(mempool);
/** Register with mempool to call TransactionRemovedFromMempool callbacks */
首先GetMainSignals()返回CMainSignals类。
这个类的主要作用是注册一些信号。
那么是怎么注册的呢