void Init(void) { __disable_interrupt(); ENABLE_LCD_LED(); DISABLE_LCD_POWER(); /* clear shipping mode, if set to allow configuration */ PMMCTL0_H = PMMPW_H; PM5CTL0 &= ~LOCKLPM5; PMMCTL0_H = 0x00; /* disable DMA during read-modify-write cycles */ DMACTL4 = DMARMWDIS; #ifdef BOOTLOADER /* * enable RAM alternate interrupt vectors * these are defined in AltVect.s43 and copied to RAM by cstartup */ SYSCTL |= SYSRIVECT; ClearBootloaderSignature(); #else SaveResetSource(); #endif SetupClockAndPowerManagementModule(); CheckResetCode(); if (niReset != NORMAL_RESET_CODE) { InitProperty(); } InitBufferPool(); // message queue InitBattery(); CheckClip(); PrintF("*** %s:%s", niReset == FLASH_RESET_CODE ? "FLASH" : (niReset == MASTER_RESET_CODE ? "MASTER" : "NORMAL"), niBuild); ShowWatchdogInfo(); WhoAmI(); /* timer for battery checking at a regular frequency. */ StartTimer(BatteryTimer); InitVibration(); InitRealTimeClock(); // enable rtc interrupt LcdPeripheralInit(); DrawSplashScreen(); SerialRamInit(); /* turn the radio on; initialize the serial port profile or BLE/GATT */ CreateAndSendMessage(TurnRadioOnMsg, MSG_OPT_NONE); DISABLE_LCD_LED(); }
/* * CreateSharedMemoryAndSemaphores * Creates and initializes shared memory and semaphores. * * This is called by the postmaster or by a standalone backend. * It is also called by a backend forked from the postmaster in the * EXEC_BACKEND case. In the latter case, the shared memory segment * already exists and has been physically attached to, but we have to * initialize pointers in local memory that reference the shared structures, * because we didn't inherit the correct pointer values from the postmaster * as we do in the fork() scenario. The easiest way to do that is to run * through the same code as before. (Note that the called routines mostly * check IsUnderPostmaster, rather than EXEC_BACKEND, to detect this case. * This is a bit code-wasteful and could be cleaned up.) * * If "makePrivate" is true then we only need private memory, not shared * memory. This is true for a standalone backend, false for a postmaster. */ void CreateSharedMemoryAndSemaphores(bool makePrivate, int port) { if (!IsUnderPostmaster) { PGShmemHeader *seghdr; Size size; int numSemas; /* * Size of the Postgres shared-memory block is estimated via * moderately-accurate estimates for the big hogs, plus 100K for the * stuff that's too small to bother with estimating. * * We take some care during this phase to ensure that the total size * request doesn't overflow size_t. If this gets through, we don't * need to be so careful during the actual allocation phase. */ size = 100000; size = add_size(size, SpinlockSemaSize()); size = add_size(size, hash_estimate_size(SHMEM_INDEX_SIZE, sizeof(ShmemIndexEnt))); size = add_size(size, BufferShmemSize()); size = add_size(size, LockShmemSize()); size = add_size(size, PredicateLockShmemSize()); size = add_size(size, ProcGlobalShmemSize()); size = add_size(size, XLOGShmemSize()); size = add_size(size, CLOGShmemSize()); size = add_size(size, SUBTRANSShmemSize()); size = add_size(size, TwoPhaseShmemSize()); size = add_size(size, BackgroundWorkerShmemSize()); size = add_size(size, MultiXactShmemSize()); size = add_size(size, LWLockShmemSize()); size = add_size(size, ProcArrayShmemSize()); size = add_size(size, BackendStatusShmemSize()); size = add_size(size, SInvalShmemSize()); size = add_size(size, PMSignalShmemSize()); size = add_size(size, ProcSignalShmemSize()); size = add_size(size, CheckpointerShmemSize()); size = add_size(size, AutoVacuumShmemSize()); size = add_size(size, ReplicationSlotsShmemSize()); size = add_size(size, WalSndShmemSize()); size = add_size(size, WalRcvShmemSize()); size = add_size(size, BTreeShmemSize()); size = add_size(size, SyncScanShmemSize()); size = add_size(size, AsyncShmemSize()); #ifdef EXEC_BACKEND size = add_size(size, ShmemBackendArraySize()); #endif /* freeze the addin request size and include it */ addin_request_allowed = false; size = add_size(size, total_addin_request); /* might as well round it off to a multiple of a typical page size */ size = add_size(size, 8192 - (size % 8192)); elog(DEBUG3, "invoking IpcMemoryCreate(size=%zu)", size); /* * Create the shmem segment */ seghdr = PGSharedMemoryCreate(size, makePrivate, port); InitShmemAccess(seghdr); /* * Create semaphores */ numSemas = ProcGlobalSemas(); numSemas += SpinlockSemas(); PGReserveSemaphores(numSemas, port); } else { /* * We are reattaching to an existing shared memory segment. This * should only be reached in the EXEC_BACKEND case, and even then only * with makePrivate == false. */ #ifdef EXEC_BACKEND Assert(!makePrivate); #else elog(PANIC, "should be attached to shared memory already"); #endif } /* * Set up shared memory allocation mechanism */ if (!IsUnderPostmaster) InitShmemAllocation(); /* * Now initialize LWLocks, which do shared memory allocation and are * needed for InitShmemIndex. */ CreateLWLocks(); /* * Set up shmem.c index hashtable */ InitShmemIndex(); /* * Set up xlog, clog, and buffers */ XLOGShmemInit(); CLOGShmemInit(); SUBTRANSShmemInit(); MultiXactShmemInit(); InitBufferPool(); /* * Set up lock manager */ InitLocks(); /* * Set up predicate lock manager */ InitPredicateLocks(); /* * Set up process table */ if (!IsUnderPostmaster) InitProcGlobal(); CreateSharedProcArray(); CreateSharedBackendStatus(); TwoPhaseShmemInit(); BackgroundWorkerShmemInit(); /* * Set up shared-inval messaging */ CreateSharedInvalidationState(); /* * Set up interprocess signaling mechanisms */ PMSignalShmemInit(); ProcSignalShmemInit(); CheckpointerShmemInit(); AutoVacuumShmemInit(); ReplicationSlotsShmemInit(); WalSndShmemInit(); WalRcvShmemInit(); /* * Set up other modules that need some shared memory space */ BTreeShmemInit(); SyncScanShmemInit(); AsyncShmemInit(); #ifdef EXEC_BACKEND /* * Alloc the win32 shared backend array */ if (!IsUnderPostmaster) ShmemBackendArrayAllocation(); #endif /* Initialize dynamic shared memory facilities. */ if (!IsUnderPostmaster) dsm_postmaster_startup(); /* * Now give loadable modules a chance to set up their shmem allocations */ if (shmem_startup_hook) shmem_startup_hook(); }
void MainServer() { InitInterfaceLocks(); InitInterface(); /* starts a thread with the window */ WrapInit(); InitMemory(); /* memory needs channels in general, but need to start before config, so just be careful. */ InitConfig(); LoadConfig(); /* must be nearly first since channels use it */ InitDebug(); InitChannelBuffer(); OpenDefaultChannels(); lprintf("Starting %s\n",BlakServLongVersionString()); InitClass(); InitMessage(); InitObject(); InitList(); InitTimer(); InitSession(); InitResource(); InitRoomData(); InitString(); InitUser(); InitAccount(); InitNameID(); InitDLlist(); InitSysTimer(); InitMotd(); InitLoadBof(); InitTime(); InitGameLock(); InitBkodInterpret(); InitBufferPool(); InitTable(); AddBuiltInDLlist(); LoadMotd(); LoadBof(); LoadRsc(); LoadKodbase(); LoadAdminConstants(); PauseTimers(); if (LoadAll() == True) { /* this loaded_game_msg tells it to disconnect all blakod info about sessions, * that were logged on when we saved */ SendTopLevelBlakodMessage(GetSystemObjectID(),LOADED_GAME_MSG,0,NULL); DoneLoadAccounts(); } /* these must be after LoadAll and ClearList */ InitCommCli(); InitParseClient(); InitProfiling(); InitAsyncConnections(); UpdateSecurityRedbook(); UnpauseTimers(); ServiceTimers(); /* returns if server termiated */ MainExitServer(); WrapShutdown(); }
/* * CreateSharedMemoryAndSemaphores * Creates and initializes shared memory and semaphores. * * This is called by the postmaster or by a standalone backend. * It is also called by a backend forked from the postmaster in the * EXEC_BACKEND case. In the latter case, the shared memory segment * already exists and has been physically attached to, but we have to * initialize pointers in local memory that reference the shared structures, * because we didn't inherit the correct pointer values from the postmaster * as we do in the fork() scenario. The easiest way to do that is to run * through the same code as before. (Note that the called routines mostly * check IsUnderPostmaster, rather than EXEC_BACKEND, to detect this case. * This is a bit code-wasteful and could be cleaned up.) * * If "makePrivate" is true then we only need private memory, not shared * memory. This is true for a standalone backend, false for a postmaster. */ void CreateSharedMemoryAndSemaphores(bool makePrivate, int port) { if (!IsUnderPostmaster) { PGShmemHeader *seghdr; Size size; int numSemas; /* * Size of the Postgres shared-memory block is estimated via * moderately-accurate estimates for the big hogs, plus 100K for the * stuff that's too small to bother with estimating. * * We take some care during this phase to ensure that the total size * request doesn't overflow size_t. If this gets through, we don't * need to be so careful during the actual allocation phase. */ size = 150000; size = add_size(size, hash_estimate_size(SHMEM_INDEX_SIZE, sizeof(ShmemIndexEnt))); size = add_size(size, BufferShmemSize()); size = add_size(size, LockShmemSize()); size = add_size(size, workfile_mgr_shmem_size()); if (Gp_role == GP_ROLE_DISPATCH) { size = add_size(size, AppendOnlyWriterShmemSize()); if(ResourceScheduler) { size = add_size(size, ResSchedulerShmemSize()); size = add_size(size, ResPortalIncrementShmemSize()); } } size = add_size(size, ProcGlobalShmemSize()); size = add_size(size, XLOGShmemSize()); size = add_size(size, DistributedLog_ShmemSize()); size = add_size(size, CLOGShmemSize()); size = add_size(size, ChangeTrackingShmemSize()); size = add_size(size, SUBTRANSShmemSize()); size = add_size(size, TwoPhaseShmemSize()); size = add_size(size, MultiXactShmemSize()); size = add_size(size, LWLockShmemSize()); size = add_size(size, ProcArrayShmemSize()); size = add_size(size, BackendStatusShmemSize()); size = add_size(size, SharedSnapshotShmemSize()); size = add_size(size, SInvalShmemSize()); size = add_size(size, PMSignalShmemSize()); size = add_size(size, ProcSignalShmemSize()); size = add_size(size, primaryMirrorModeShmemSize()); size = add_size(size, FreeSpaceShmemSize()); //size = add_size(size, AutoVacuumShmemSize()); size = add_size(size, FtsShmemSize()); size = add_size(size, tmShmemSize()); size = add_size(size, SeqServerShmemSize()); size = add_size(size, PersistentFileSysObj_ShmemSize()); size = add_size(size, PersistentFilespace_ShmemSize()); size = add_size(size, PersistentTablespace_ShmemSize()); size = add_size(size, PersistentDatabase_ShmemSize()); size = add_size(size, PersistentRelation_ShmemSize()); size = add_size(size, Pass2Recovery_ShmemSize()); /*Add shared memory for PT verification checks*/ if (Gp_role == GP_ROLE_DISPATCH && debug_persistent_ptcat_verification) { size = add_size(size, Persistent_PostDTMRecv_ShmemSize()); } if (GPAreFileReplicationStructuresRequired()) { size = add_size(size, FileRep_SubProcShmemSize()); size = add_size(size, FileRep_ShmemSize()); size = add_size(size, FileRepAck_ShmemSize()); size = add_size(size, FileRepAckPrimary_ShmemSize()); size = add_size(size, FileRepResync_ShmemSize()); size = add_size(size, FileRepIpc_ShmemSize()); size = add_size(size, FileRepLog_ShmemSize()); size = add_size(size, FileRepStats_ShmemSize()); } #ifdef FAULT_INJECTOR size = add_size(size, FaultInjector_ShmemSize()); #endif #ifdef EXEC_BACKEND size = add_size(size, ShmemBackendArraySize()); #endif #ifdef USE_TEST_UTILS if (gp_simex_init) { // initialize SimEx simex_init(); size = add_size(size, SyncBitVector_ShmemSize(simex_get_subclass_count())); } #endif /* This elog happens before we know the name of the log file we are supposed to use */ elog(DEBUG1, "Size not including the buffer pool %lu", (unsigned long) size); size = add_size(size, BgWriterShmemSize()); size = add_size(size, AutoVacuumShmemSize()); size = add_size(size, BTreeShmemSize()); size = add_size(size, SyncScanShmemSize()); size = add_size(size, CheckpointShmemSize()); size = add_size(size, WalSndShmemSize()); size = add_size(size, WalRcvShmemSize()); /* freeze the addin request size and include it */ addin_request_allowed = false; size = add_size(size, total_addin_request); /* might as well round it off to a multiple of a typical page size */ size = add_size(size, BLCKSZ - (size % BLCKSZ)); /* Consider the size of the SessionState array */ size = add_size(size, SessionState_ShmemSize()); /* * Create the shmem segment */ seghdr = PGSharedMemoryCreate(size, makePrivate, port); InitShmemAccess(seghdr); /* * Create semaphores */ numSemas = ProcGlobalSemas(); numSemas += SpinlockSemas(); if (GPAreFileReplicationStructuresRequired()) { numSemas += FileRepSemas(); } elog(DEBUG3,"reserving %d semaphores",numSemas); PGReserveSemaphores(numSemas, port); } else { /* * We are reattaching to an existing shared memory segment. This * should only be reached in the EXEC_BACKEND case, and even then only * with makePrivate == false. */ #ifdef EXEC_BACKEND Assert(!makePrivate); #else elog(PANIC, "should be attached to shared memory already"); #endif } /* * Set up shared memory allocation mechanism */ if (!IsUnderPostmaster) InitShmemAllocation(); /* * Now initialize LWLocks, which do shared memory allocation and are * needed for InitShmemIndex. */ if (!IsUnderPostmaster) CreateLWLocks(); /* * Set up shmem.c index hashtable */ InitShmemIndex(); primaryMirrorModeShmemInit(); /* * Set up xlog, clog, and buffers */ XLOGShmemInit(); CLOGShmemInit(); ChangeTrackingShmemInit(); DistributedLog_ShmemInit(); SUBTRANSShmemInit(); TwoPhaseShmemInit(); MultiXactShmemInit(); FtsShmemInit(); tmShmemInit(); InitBufferPool(); /* * Set up lock manager */ InitLocks(); /* * Set up append only writer */ if (Gp_role == GP_ROLE_DISPATCH) InitAppendOnlyWriter(); PersistentFileSysObj_ShmemInit(); PersistentFilespace_ShmemInit(); PersistentTablespace_ShmemInit(); PersistentDatabase_ShmemInit(); PersistentRelation_ShmemInit(); Pass2Recovery_ShmemInit(); if (Gp_role == GP_ROLE_DISPATCH && debug_persistent_ptcat_verification) Persistent_PostDTMRecv_ShmemInit(); /* * Set up resource schedular */ if (Gp_role == GP_ROLE_DISPATCH && ResourceScheduler) { InitResScheduler(); InitResPortalIncrementHash(); } if (!IsUnderPostmaster) { /* Set up process table */ InitProcGlobal(PostmasterGetMppLocalProcessCounter()); } /* Initialize SessionState shared memory array */ SessionState_ShmemInit(); /* Initialize vmem protection */ GPMemoryProtect_ShmemInit(); CreateSharedProcArray(); CreateSharedBackendStatus(); /* * Set up Shared snapshot slots * * TODO: only need to do this if we aren't the QD. for now we are just * doing it all the time and wasting shemem on the QD. This is * because this happens at postmaster startup time when we don't * know who we are. */ CreateSharedSnapshotArray(); /* * Set up shared-inval messaging */ CreateSharedInvalidationState(); /* * Set up free-space map */ InitFreeSpaceMap(); /* * Set up interprocess signaling mechanisms */ PMSignalShmemInit(); ProcSignalShmemInit(); BgWriterShmemInit(); CheckpointShmemInit(); WalSndShmemInit(); WalRcvShmemInit(); //AutoVacuumShmemInit(); SeqServerShmemInit(); if (GPAreFileReplicationStructuresRequired()) { FileRep_SubProcShmemInit(); FileRep_ShmemInit(); FileRepAck_ShmemInit(); FileRepAckPrimary_ShmemInit(); FileRepResync_ShmemInit(); FileRepIpc_ShmemInit(); FileRepLog_ShmemInit(); FileRepStats_ShmemInit(); } #ifdef FAULT_INJECTOR FaultInjector_ShmemInit(); #endif #ifdef USE_TEST_UTILS if (gp_simex_init) { // initialize shmem segment for SimEx simex_set_sync_bitvector_container( SyncBitVector_ShmemInit("SimEx bit vector container", simex_get_subclass_count())); } #endif /* USE_TEST_UTILS */ /* * Set up other modules that need some shared memory space */ BTreeShmemInit(); SyncScanShmemInit(); workfile_mgr_cache_init(); #ifdef EXEC_BACKEND /* * Alloc the win32 shared backend array */ if (!IsUnderPostmaster) ShmemBackendArrayAllocation(); #endif BackoffStateInit(); if (gp_resqueue_memory_policy != RESQUEUE_MEMORY_POLICY_NONE) { SPI_InitMemoryReservation(); } /* * Now give loadable modules a chance to set up their shmem allocations */ if (shmem_startup_hook) shmem_startup_hook(); }
RC GHJ::Initialize() { HANDLE hR = CreateFile( (LPCWSTR)m_Params.RELATION_R_PATH, // file to open GENERIC_READ, // open for reading FILE_SHARE_READ, // share for reading NULL, // default security OPEN_EXISTING, // existing file only FILE_ATTRIBUTE_NORMAL, // overlapped operation //| FILE_FLAG_NO_BUFFERING NULL); // no attr. template //FILE_FLAG_NO_BUFFERING //http://msdn.microsoft.com/en-us/library/windows/desktop/cc644950(v=vs.85).aspx if (INVALID_HANDLE_VALUE==hR) { return ERR_CANNOT_CREATE_HANDLE; } LARGE_INTEGER *liFileSize = new LARGE_INTEGER(); if (!GetFileSizeEx(hR, liFileSize)) { return ERR_CANNOT_GET_FILE_SIZE; } CloseHandle(hR); m_R_FileSize = chROUNDUP(liFileSize->QuadPart, SSD_PAGE_SIZE) / SSD_PAGE_SIZE; //考虑FUDGE_FACTOR倍增系数 m_PartitionNum = (int)(m_R_FileSize*m_Params.FUDGE_FACTOR / (m_AvailableMemorySize)+1);//-PROBE_SIZE_EVERY_TIME //当分区数为8整除时数据集分布可能有异常 if(0==m_PartitionNum % 8) { m_PartitionNum = m_PartitionNum + 1;//nbatch 被3整除时 s表第一分区为0 避开 } m_FileHandle = new HANDLE[m_PartitionNum]; if(SUCCESS!=InitBufferPool(&m_Pool, m_Params.BUFFER_POOL_SIZE)) { ShowMB(L"Cannot init buffer pool"); return ERR_CANNOT_INITIAL_BUFFER_POOL; } if(((DWORD)(m_AvailableMemorySize - m_ReadBufferSize) % m_PartitionNum)==0) { m_BucketSize=(m_AvailableMemorySize - m_ReadBufferSize) / m_PartitionNum; } else { m_ReadBufferSize+=DWORD(m_AvailableMemorySize - m_ReadBufferSize) % m_PartitionNum; m_BucketSize=(m_AvailableMemorySize - m_ReadBufferSize) / m_PartitionNum; } if(m_BucketSize<=0) { ShowMB(L"Not enough memory for bucket"); return ERR_NOT_ENOUGH_MEMORY; } // Init read buffer size InitBuffer(&m_InBuffer, m_Params.READ_BUFFER_SIZE, &m_Pool); m_BucketBuffer = new Buffer[m_PartitionNum]; for(UINT partitionIndex=0; partitionIndex < m_PartitionNum; partitionIndex++) { if(SUCCESS!=InitBuffer(&m_BucketBuffer[partitionIndex], m_BucketSize * SSD_PAGE_SIZE, &m_Pool)) { ShowMB(L"Bufpool size is too small for all the buckets!"); return ERR_NOT_ENOUGH_MEMORY; } } //对桶装配过程中需要的全局变量初始化 m_BucketPage= new PagePtr[m_PartitionNum]; //每个桶当前页 for(UINT partitionIndex=0; partitionIndex < m_PartitionNum; partitionIndex++) { InitRunPage(&m_BucketPage[partitionIndex], &m_BucketBuffer[partitionIndex]); } return SUCCESS; }