⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ncbimtx.inl

📁 ncbi源码
💻 INL
字号:
/* * =========================================================================== * PRODUCTION $Log: ncbimtx.inl,v $ * PRODUCTION Revision 1000.0  2003/10/29 15:04:49  gouriano * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.5 * PRODUCTION * =========================================================================== */#if defined(CORELIB___NCBIMTX__HPP)  &&  !defined(CORELIB___NCBIMTX__INL)#define CORELIB___NCBIMTX__INL/*  $Id: ncbimtx.inl,v 1000.0 2003/10/29 15:04:49 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Author: Eugene Vasilchenko * * File Description: *   Mutex classes' inline functions * *////////////////////////////////////////////////////////////////////////////////  SSystemFastMutexStruct//inlinebool SSystemFastMutex::IsInitialized(void) const{    return m_Magic == eMutexInitialized;}inlinebool SSystemFastMutex::IsUninitialized(void) const{    return m_Magic == eMutexUninitialized;}inlinevoid SSystemFastMutex::CheckInitialized(void) const{#if defined(INTERNAL_MUTEX_DEBUG)    if ( !IsInitialized() ) {        ThrowUninitialized();    }#endif}inlinevoid SSystemFastMutex::Lock(void){#if defined(NCBI_NO_THREADS)    return;#else    // check    CheckInitialized();    // Acquire system mutex#  if defined(NCBI_WIN32_THREADS)    if (WaitForSingleObject(m_Handle, INFINITE) != WAIT_OBJECT_0) {        ThrowLockFailed();    }#  elif defined(NCBI_POSIX_THREADS)    if ( pthread_mutex_lock(&m_Handle) != 0 ) { // error        ThrowLockFailed();    }#  endif#endif}inlinebool SSystemFastMutex::TryLock(void){#if defined(NCBI_NO_THREADS)    return true;#else    // check    CheckInitialized();    // Check if the system mutex is acquired.    // If not, acquire for the current thread.#  if defined(NCBI_WIN32_THREADS)    DWORD status = WaitForSingleObject(m_Handle, 0);    if (status == WAIT_OBJECT_0) { // ok        return true;    }    else {        if (status != WAIT_TIMEOUT) { // error            ThrowTryLockFailed();        }        return false;    }#  elif defined(NCBI_POSIX_THREADS)    int status = pthread_mutex_trylock(&m_Handle);    if (status == 0) { // ok        return true;    }    else {        if (status != EBUSY) { // error            ThrowTryLockFailed();        }        return false;    }#  endif#endif}inlinevoid SSystemFastMutex::Unlock(void){#if defined(NCBI_NO_THREADS)    return;#else    // check    CheckInitialized();            // Release system mutex# if defined(NCBI_WIN32_THREADS)    if ( !ReleaseMutex(m_Handle) ) { // error        ThrowUnlockFailed();    }# elif defined(NCBI_POSIX_THREADS)    if ( pthread_mutex_unlock(&m_Handle) != 0 ) { // error        ThrowUnlockFailed();    }# endif#endif}///////////////////////////////////////////////////////////////////////////////  SSystemMutex//inlinebool SSystemMutex::IsInitialized(void) const{    return m_Mutex.IsInitialized();}inlinebool SSystemMutex::IsUninitialized(void) const{    return m_Mutex.IsUninitialized();}inlinevoid SSystemMutex::InitializeStatic(void){    m_Mutex.InitializeStatic();}inlinevoid SSystemMutex::InitializeDynamic(void){    m_Mutex.InitializeDynamic();    m_Count = 0;}#if defined(NCBI_NO_THREADS)// empty version of Lock/Unlock methods for inlininginlinevoid SSystemMutex::Lock(void){}inlinebool SSystemMutex::TryLock(void){    return true;}inlinevoid SSystemMutex::Unlock(void){}#endif#if defined(NEED_AUTO_INITIALIZE_MUTEX)inlineCAutoInitializeStaticFastMutex::TObject&CAutoInitializeStaticFastMutex::Get(void){    if ( !m_Mutex.IsInitialized() ) {        Initialize();    }    return m_Mutex;}inlineCAutoInitializeStaticFastMutex::operator CAutoInitializeStaticFastMutex::TObject&(void){    return Get();}inlinevoid CAutoInitializeStaticFastMutex::Lock(void){    Get().Lock();}inlinevoid CAutoInitializeStaticFastMutex::Unlock(void){    Get().Unlock();}inlinebool CAutoInitializeStaticFastMutex::TryLock(void){    return Get().TryLock();}inlineCAutoInitializeStaticMutex::TObject&CAutoInitializeStaticMutex::Get(void){    if ( !m_Mutex.IsInitialized() ) {        Initialize();    }    return m_Mutex;}inlineCAutoInitializeStaticMutex::operator CAutoInitializeStaticMutex::TObject&(void){    return Get();}inlinevoid CAutoInitializeStaticMutex::Lock(void){    Get().Lock();}inlinevoid CAutoInitializeStaticMutex::Unlock(void){    Get().Unlock();}inlinebool CAutoInitializeStaticMutex::TryLock(void){    return Get().TryLock();}#endif///////////////////////////////////////////////////////////////////////////////  CFastMutex:://inlineCFastMutex::CFastMutex(void){    m_Mutex.InitializeDynamic();}inlineCFastMutex::~CFastMutex(void){    m_Mutex.Destroy();}inlineCFastMutex::operator SSystemFastMutex&(void){    return m_Mutex;}inlinevoid CFastMutex::Lock(void){    m_Mutex.Lock();}inlinevoid CFastMutex::Unlock(void){    m_Mutex.Unlock();}inlinebool CFastMutex::TryLock(void){    return m_Mutex.TryLock();}// CFastMutexGuardinlineCFastMutexGuard::CFastMutexGuard(void)    : m_Mutex(0){}inlineCFastMutexGuard::CFastMutexGuard(SSystemFastMutex& mtx)    : m_Mutex(&mtx){    mtx.Lock();}inlineCFastMutexGuard::~CFastMutexGuard(void){    if (m_Mutex)        m_Mutex->Unlock();}inlinevoid CFastMutexGuard::Release(void){    if ( m_Mutex ) {        m_Mutex->Unlock();        m_Mutex = 0;    }}inlinevoid CFastMutexGuard::Guard(SSystemFastMutex& mtx){    if ( &mtx != m_Mutex ) {        Release();        mtx.Lock();        m_Mutex = &mtx;    }}inlineCMutex::CMutex(void){    m_Mutex.InitializeDynamic();}inlineCMutex::~CMutex(void){    m_Mutex.Destroy();}inlineCMutex::operator SSystemMutex&(void){    return m_Mutex;}inlinevoid CMutex::Lock(void){    m_Mutex.Lock();}inlinevoid CMutex::Unlock(void){    m_Mutex.Unlock();}inlinebool CMutex::TryLock(void){    return m_Mutex.TryLock();}inlineCMutexGuard::CMutexGuard(void)    : m_Mutex(0){}inlineCMutexGuard::CMutexGuard(SSystemMutex& mtx)    : m_Mutex(&mtx){    mtx.Lock();}inlineCMutexGuard::~CMutexGuard(void){    if ( m_Mutex ) {        m_Mutex->Unlock();    }}inlinevoid CMutexGuard::Release(void){    if ( m_Mutex ) {        m_Mutex->Unlock();        m_Mutex = 0;    }}inlinevoid CMutexGuard::Guard(SSystemMutex& mtx){    if ( &mtx != m_Mutex ) {        Release();        mtx.Lock();        m_Mutex = &mtx;    }}/* * =========================================================================== * $Log: ncbimtx.inl,v $ * Revision 1000.0  2003/10/29 15:04:49  gouriano * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.5 * * Revision 1.5  2003/09/02 16:08:48  vasilche * Fixed race condition with optimization on some compilers - added 'volatile'. * Moved mutex Lock/Unlock methods out of inline section - they are quite complex. * * Revision 1.4  2003/09/02 15:41:05  ucko * Re-sync preprocessor guards with ncbimtx.hpp. * * Revision 1.3  2003/06/19 19:16:37  vasilche * Added CMutexGuard and CFastMutexGuard constructors. * * Revision 1.2  2002/09/20 20:02:07  vasilche * Added public Lock/Unlock/TryLock * * Revision 1.1  2002/09/19 20:05:41  vasilche * Safe initialization of static mutexes * * =========================================================================== */#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -