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( &ltime );    ttime = ltime + (int) (dfWaitInSeconds+0.5);    for( ; ltime < ttime; time(&ltime) )    {        /* 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 + -
显示快捷键?