PostgreSQL启动过程中的那些事七:初始化共享内存和信号十四:shmem中初始化PMSignal
?
初始化PMSingal方法调用流程图
?
话说main()->…->PostmasterMain()->…->reset_shared() ->CreateSharedMemoryAndSemaphores()>…-> PMSignalShmemInit(),调用ShmemInitStruct(),在其中调用hash_search()在哈希表索引"ShmemIndex"中查找"PMSignalState",如果没有,就在shmemIndex中给"PMSignalState"分一个HashElement和ShmemIndexEnt(entry),在其中的Entry中写上"PMSignalState"。返回ShmemInitStruct(),再调用ShmemAlloc()在共享内存上给"PMSignalState"相关结构(见下面“PMSignalState相关结构图”)分配空间,设置entry(在这儿及ShmemIndexEnt类型变量)的成员location指向该空间,size成员记录该空间大小,最后返回PMSignalShmemInit (),让PMSingalData *类型静态全局变量PMSignalState指向所分配内存,初始化PMSingalData结构类型的成员值,其中包括一个信号数组成员。
相关结构定义和图见下面:
struct PMSignalData
{
??? /* per-reason flags */
??? sig_atomic_t PMSignalFlags[NUM_PMSIGNALS];
??? /* per-child-process flags */
??? int??????? num_child_flags;? /* # of entriesin PMChildFlags[] */
??? int??????? next_child_flag;? /* next slot totry to assign */
??? sig_atomic_t PMChildFlags[1];????? /* VARIABLE LENGTH ARRAY */
};
?
NON_EXEC_STATIC volatile PMSignalData*PMSignalState = NULL;
信号在各操作系统中是不同的。下面是各系统的信号类型PGSemaphoreData的定义。
POSIX标准的PGSemaphoreData的定义:
typedef sem_tPGSemaphoreData;
SYSV标准的PGSemaphoreData的定义:
typedef structPGSemaphoreData
{
??? int???????? semId;????????? /* semaphore set identifier */
??? int???????? semNum;???????? /* semaphore number within set */
} PGSemaphoreData;
Windows系统PGSemaphoreData的定义:
typedef HANDLEPGSemaphoreData;
初始化完PMSignalState相关结构的共享内存结构图
?
PMSignalState相关结构图