Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

wefts_os_windows.h

Go to the documentation of this file.
00001 /*
00002    wefts_os_widnows.h
00003    MS-Windows specific header file
00004 
00005    $Id: wefts_os_windows.h,v 1.14 2004/03/13 16:46:27 jonnymind Exp $
00006 ---------------------------------------
00007    Begin      : 2003-10-15 16.50
00008    Author     : Giancarlo Niccolai
00009 
00010    Last modified because:
00011    
00012 */
00013 
00014 /**************************************************************************
00015 *   This program is free software; you can redistribute it and/or modify  *
00016 *   it under the terms of the GNU Library General Public License as       *
00017 *   published by the Free Software Foundation; either version 2.1 of the  *
00018 *   License, or (at your option) any later version.                       *
00019 ***************************************************************************/
00020 
00021 #ifndef WT_OS_WINDOWS_H
00022 #define WT_OS_WINDOWS_H
00023 
00024 /* To allow compilation of TryEnterCriticalSection */
00025 #ifndef _WIN32_WINNT
00026 #define _WIN32_WINNT 0x0400
00027 #endif
00028 
00029 #ifdef _MSC_VER
00030 #pragma warning ( disable:4355 )
00031 #endif
00032 
00033 #include <wefts_cleanup.h>
00034 #include <wefts_os_base.h>
00035 #include <wefts_error.h>
00036 
00037 
00038 #ifdef __extern_c
00039 extern "C" {
00040 #endif
00041 
00042 #include <windows.h>
00043 
00044 #ifdef __extern_c
00045 }
00046 #endif
00047 
00053 namespace Wefts {
00054 
00055 extern DWORD s_tlsThreadObj;
00056 
00057 extern void (* s_cleanerPointer)(void *);
00058 
00068 class OSMutexWindows: public OSMutexBase 
00069 {
00070    bool m_canTryLock;
00071 protected:
00072    CRITICAL_SECTION  m_sect;
00073 
00074    friend class OSConditionWindows;
00075 public:
00076    OSMutexWindows() throw( InitError );
00077    
00078    ~OSMutexWindows() 
00079    { 
00080       DeleteCriticalSection( &m_sect );
00081    }
00082 
00083    virtual inline void lock() { EnterCriticalSection( &m_sect ); }
00084 
00085    virtual inline bool trylock() { 
00086       if( m_canTryLock )
00087          return TryEnterCriticalSection( &m_sect ) == TRUE; 
00088       else
00089          return false;
00090    }
00091 
00093    virtual inline void unlock() { LeaveCriticalSection( &m_sect ); }
00094 };
00095 
00096 #if 0
00097 class OSMutexWindows: public OSMutexBase {
00098 protected:
00099    CRITICAL_SECTION  m_sema;
00100 
00101    friend class OSConditionWindows;
00102 public:
00103    OSMutexWindows() throw( InitError )
00104       : OSMutexBase()
00105    {
00106       InitializeCriticalSection(&m_sema);
00107       //if ( m_sema == NULL ) throw InitError( GetLastError() );
00108    }
00109 
00110    ~OSMutexWindows() 
00111    { 
00112       DeleteCriticalSection( &m_sema );
00113    }
00114 
00115    virtual inline void lock() { EnterCriticalSection( &m_sema); }
00116 
00117    virtual inline bool trylock() { 
00118       OSVERSIONINFO osVer;
00119       osVer.dwOSVersionInfoSize = sizeof( osVer );
00120 
00121       if( GetVersionEx( &osVer ) && 
00122             ( osVer.dwPlatformId == VER_PLATFORM_WIN32_NT || osVer.dwMajorVersion >= 5 )
00123          return TryEnterCriticalSection( &m_sema); 
00124       else
00125          return false;
00126    }
00127 
00129    virtual inline void unlock() { LeaveCriticalSection(&m_sema); }
00130 };
00131 #endif
00132 
00137 class OSConditionWindows: public OSConditionBase {
00138 private:
00139    HANDLE semBlockLock;
00140    HANDLE semBlockQueue;
00141    CRITICAL_SECTION mtxUnblockLock;
00142    int nWaitersGone;
00143    int nWaitersBlocked;
00144    int nWaitersToUnblock;
00145 
00146 public:
00147    OSConditionWindows() throw( InitError );
00148    ~OSConditionWindows(); 
00149 
00150    void signal();
00151    void signalOne();
00152    
00154    bool wait( OSMutexBase &mtx, CleanupItem &guard ); 
00155 
00157    bool timedWait( OSMutexBase &mtx, long seconds, long nanoseconds,
00158          CleanupItem &guard  );
00159 };
00160 
00164 class OSThreadWindows: public OSThreadBase {
00165 private:
00167    DWORD m_thid;
00168    
00170    HANDLE m_hth;
00171    
00173    bool m_valid;
00174 
00176    HANDLE m_evtCancel;
00177 
00182    bool m_wasCanceled;
00183       
00185    bool m_canCancel;
00186    
00191    void (*m_rawCleanup)(void *);
00192    
00197    void *m_rawCleanData;
00198    
00199    friend class OSConditionWindows;
00200    friend class OSFileFuncWin;
00201    friend bool OSSleep( long nSeconds, long nNanoseconds );
00202 public:
00203    OSThreadWindows();
00204    OSThreadWindows( bool val ): OSThreadBase( val ) {  setCurrent(); }
00205    ~OSThreadWindows();
00206 
00228    virtual bool priority( OSPriority prio_class, int boost = 0);
00229    
00230    bool start( void *(*func)(void *), void *data );
00231    bool stop();
00232    void *join() throw( NotJoinableError );
00233    
00235    int enableCancel();
00236    
00238    int disableCancel();
00239       
00240    inline bool setCancelState( int state ) 
00241    {
00242       m_canCancel = (state != 0);
00243       return true;
00244    }
00245    
00246    virtual void *osRun( void * (*func)(void *), void *data, void (*cleanup)(void *) );
00247    
00248    void testCancel();
00249    
00251    inline void setCancelDeferred() {};
00252    
00253    inline void detach() {}
00254    
00255    void exit( void *data );
00256    
00257    inline bool same() const {
00258       return (m_valid && m_thid == GetCurrentThreadId());
00259    }
00260 
00261    bool equal( const OSThreadBase &th ) const {
00262       const OSThreadWindows *other =static_cast<const OSThreadWindows *>( &th );
00263       return ( m_valid && other->m_valid && other->m_thid == m_thid );
00264    }
00265 
00266    virtual bool setCurrent();
00267    virtual void invalidate();
00268 };
00269 
00270 #include <stdio.h>
00271 
00273 class OSSpecificDataWindows: public OSSpecificDataBase
00274 {
00275 private:
00276    DWORD  m_data;
00277 
00278 public:
00282    OSSpecificDataWindows() throw( InitError );
00283 
00288    ~OSSpecificDataWindows() 
00289    { 
00290       if (  m_data != TLS_OUT_OF_INDEXES )
00291          TlsFree( m_data ); 
00292    }
00293 
00294    void *data() const { return TlsGetValue( m_data ); }
00295    void data(const void *dt) { 
00296       void *dt1 = const_cast<void *>(dt);
00297       TlsSetValue( m_data, dt1); 
00298    }
00299 };
00300 
00301 typedef OSSpecificDataWindows OSSpecificData;
00302 typedef OSThreadWindows OSThread;
00303 typedef OSConditionWindows OSCondition;
00304 typedef OSMutexWindows OSMutex;
00305 
00306 } // namespace
00307 
00308 #endif

Generated on Sat Mar 13 21:05:43 2004 for Wefts by doxygen 1.3.5