cpl_multiproc.cpp
来自「用于读取TAB、MIF、SHP文件的类」· C++ 代码 · 共 1,036 行 · 第 1/3 页
CPP
1,036 行
void *CPLLockFile( const char *pszPath, double dfWaitInSeconds ){ FILE *fpLock; char *pszLockFilename; /* -------------------------------------------------------------------- *//* We use a lock file with a name derived from the file we want *//* to lock to represent the file being locked. Note that for *//* the stub implementation the target file does not even need *//* to exist to be locked. *//* -------------------------------------------------------------------- */ pszLockFilename = (char *) CPLMalloc(strlen(pszPath) + 30); sprintf( pszLockFilename, "%s.lock", pszPath ); fpLock = fopen( pszLockFilename, "r" ); while( fpLock != NULL && dfWaitInSeconds > 0.0 ) { fclose( fpLock ); CPLSleep( MIN(dfWaitInSeconds,0.5) ); dfWaitInSeconds -= 0.5; fpLock = fopen( pszLockFilename, "r" ); } if( fpLock != NULL ) { fclose( fpLock ); CPLFree( pszLockFilename ); return NULL; } fpLock = fopen( pszLockFilename, "w" ); if( fpLock == NULL ) { CPLFree( pszLockFilename ); return NULL; } fwrite( "held\n", 1, 5, fpLock ); fclose( fpLock ); return pszLockFilename;}/************************************************************************//* CPLUnlockFile() *//************************************************************************/void CPLUnlockFile( void *hLock ){ char *pszLockFilename = (char *) hLock; if( hLock == NULL ) return; VSIUnlink( pszLockFilename ); CPLFree( pszLockFilename );}/************************************************************************//* CPLGetPID() *//************************************************************************/int CPLGetPID(){ return 1;}/************************************************************************//* CPLCreateThread(); *//************************************************************************/int CPLCreateThread( CPLThreadFunc pfnMain, void *pArg ){ return -1;}/************************************************************************//* CPLSleep() *//************************************************************************/void CPLSleep( double dfWaitInSeconds ){ time_t ltime; time_t ttime; time( <ime ); ttime = ltime + (int) (dfWaitInSeconds+0.5); for( ; ltime < ttime; time(<ime) ) { /* currently we just busy wait. Perhaps we could at least block on io? */ }}/************************************************************************//* CPLGetTLSList() *//************************************************************************/static void **papTLSList = NULL;static void **CPLGetTLSList(){ if( papTLSList == NULL ) papTLSList = (void **) CPLCalloc(sizeof(void*),CTLS_MAX*2); return papTLSList;}/************************************************************************//* CPLCleanupTLS() *//************************************************************************/void CPLCleanupTLS(){ CPLCleanupTLSList( papTLSList ); papTLSList = NULL;}#endif /* def CPL_MULTIPROC_STUB */#if defined(CPL_MULTIPROC_WIN32) /************************************************************************/ /* ==================================================================== */ /* CPL_MULTIPROC_WIN32 */ /* */ /* WIN32 Implementation of multiprocessing functions. */ /* ==================================================================== */ /************************************************************************/#include <windows.h>/* windows.h header must be included above following lines. */#if defined(WIN32CE)# include "cpl_win32ce_api.h"# define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)#endif/************************************************************************//* CPLGetThreadingModel() *//************************************************************************/const char *CPLGetThreadingModel(){ return "win32";}/************************************************************************//* CPLCreateMutex() *//************************************************************************/void *CPLCreateMutex(){ HANDLE hMutex; hMutex = CreateMutex( NULL, TRUE, NULL ); return (void *) hMutex;}/************************************************************************//* CPLAcquireMutex() *//************************************************************************/int CPLAcquireMutex( void *hMutexIn, double dfWaitInSeconds ){ HANDLE hMutex = (HANDLE) hMutexIn; DWORD hr; hr = WaitForSingleObject( hMutex, (int) (dfWaitInSeconds * 1000) ); return hr != WAIT_TIMEOUT;}/************************************************************************//* CPLReleaseMutex() *//************************************************************************/void CPLReleaseMutex( void *hMutexIn ){ HANDLE hMutex = (HANDLE) hMutexIn; ReleaseMutex( hMutex );}/************************************************************************//* CPLDestroyMutex() *//************************************************************************/void CPLDestroyMutex( void *hMutexIn ){ HANDLE hMutex = (HANDLE) hMutexIn; CloseHandle( hMutex );}/************************************************************************//* CPLLockFile() *//************************************************************************/void *CPLLockFile( const char *pszPath, double dfWaitInSeconds ){ char *pszLockFilename; HANDLE hLockFile; pszLockFilename = (char *) CPLMalloc(strlen(pszPath) + 30); sprintf( pszLockFilename, "%s.lock", pszPath ); hLockFile = CreateFile( pszLockFilename, GENERIC_WRITE, 0, NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_DELETE_ON_CLOSE, NULL ); while( GetLastError() == ERROR_ALREADY_EXISTS && dfWaitInSeconds > 0.0 ) { CloseHandle( hLockFile ); CPLSleep( MIN(dfWaitInSeconds,0.125) ); dfWaitInSeconds -= 0.125; hLockFile = CreateFile( pszLockFilename, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_DELETE_ON_CLOSE, NULL ); } CPLFree( pszLockFilename ); if( hLockFile == INVALID_HANDLE_VALUE ) return NULL; if( GetLastError() == ERROR_ALREADY_EXISTS ) { CloseHandle( hLockFile ); return NULL; } return (void *) hLockFile;}/************************************************************************//* CPLUnlockFile() *//************************************************************************/void CPLUnlockFile( void *hLock ){ HANDLE hLockFile = (HANDLE) hLock; CloseHandle( hLockFile );}/************************************************************************//* CPLGetPID() *//************************************************************************/int CPLGetPID(){ return GetCurrentThreadId();}/************************************************************************//* CPLStdCallThreadJacket() *//************************************************************************/typedef struct { void *pAppData; CPLThreadFunc pfnMain;} CPLStdCallThreadInfo;static DWORD WINAPI CPLStdCallThreadJacket( void *pData ){ CPLStdCallThreadInfo *psInfo = (CPLStdCallThreadInfo *) pData; psInfo->pfnMain( psInfo->pAppData ); CPLFree( psInfo ); return 0;}/************************************************************************//* CPLCreateThread() *//* *//* The WIN32 CreateThread() call requires an entry point that *//* has __stdcall conventions, so we provide a jacket function *//* to supply that. *//************************************************************************/int CPLCreateThread( CPLThreadFunc pfnMain, void *pThreadArg ){ HANDLE hThread; DWORD nThreadId; CPLStdCallThreadInfo *psInfo; psInfo = (CPLStdCallThreadInfo*) CPLCalloc(sizeof(CPLStdCallThreadInfo),1); psInfo->pAppData = pThreadArg; psInfo->pfnMain = pfnMain; hThread = CreateThread( NULL, 0, CPLStdCallThreadJacket, psInfo, 0, &nThreadId ); if( hThread == NULL ) return -1; CloseHandle( hThread ); return nThreadId;}/************************************************************************//* CPLSleep() *//************************************************************************/void CPLSleep( double dfWaitInSeconds ){ Sleep( (DWORD) (dfWaitInSeconds * 1000.0) );}static int bTLSKeySetup = FALSE;static DWORD nTLSKey;/************************************************************************//* CPLGetTLSList() */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?