Changeset 37

Show
Ignore:
Timestamp:
11/29/04 14:25:03 (19 years ago)
Author:
wagi
Message:

Added syncCall implementation.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/freebob/src/threads.h

    r29 r37  
    2222#define THREADS_H 
    2323 
     24#include <semaphore.h> 
     25 
    2426#include "workerthread.h" 
    2527 
     
    3739{ 
    3840public: 
    39     MemberFunctor0( const CalleePtr& pCallee, MemFunPtr pMemFun ) 
     41    MemberFunctor0( const CalleePtr& pCallee,  
     42                    MemFunPtr pMemFun,  
     43                    bool bDelete = true ) 
    4044        : m_pCallee( pCallee ) 
    4145        , m_pMemFun( pMemFun ) 
     46        , m_pSem( 0 ) 
     47        , m_bDelete( bDelete ) 
    4248        {} 
     49 
     50    MemberFunctor0( const CalleePtr& pCallee,  
     51                    MemFunPtr pMemFun,  
     52                    sem_t* pSem, 
     53                    bool bDelete = true ) 
     54        : m_pCallee( pCallee ) 
     55        , m_pMemFun( pMemFun ) 
     56        , m_pSem( pSem ) 
     57        , m_bDelete( bDelete ) 
     58        {} 
     59 
    4360    virtual ~MemberFunctor0() 
    4461        {} 
    4562 
    4663    virtual void operator() () 
    47         { ( ( *m_pCallee ).*m_pMemFun )(); } 
     64        {  
     65            ( ( *m_pCallee ).*m_pMemFun )();  
     66            if ( m_pSem ) { 
     67                sem_post( m_pSem); 
     68            } 
     69            if (m_bDelete) { 
     70                delete this; 
     71            } 
     72        } 
    4873 
    4974private: 
    5075    CalleePtr  m_pCallee; 
    5176    MemFunPtr  m_pMemFun; 
     77    sem_t* m_pSem; 
     78    bool       m_bDelete; 
    5279}; 
    5380 
     
    5784{ 
    5885public: 
    59     MemberFunctor1( const CalleePtr& pCallee, MemFunPtr pMemFun, Parm0 parm0 ) 
     86    MemberFunctor1( const CalleePtr& pCallee,  
     87                    MemFunPtr pMemFun,  
     88                    Parm0 parm0, 
     89                    bool bDelete = true) 
    6090        : m_pCallee( pCallee ) 
    6191        , m_pMemFun( pMemFun ) 
    6292        , m_parm0( parm0 ) 
     93        , m_pSem( 0 ) 
     94        , m_bDelete( bDelete )   
     95        {} 
     96 
     97    MemberFunctor1( const CalleePtr& pCallee,  
     98                    MemFunPtr pMemFun,  
     99                    Parm0 parm0, 
     100                    sem_t* pSem, 
     101                    bool bDelete = true ) 
     102        : m_pCallee( pCallee ) 
     103        , m_pMemFun( pMemFun ) 
     104        , m_parm0( parm0 ) 
     105        , m_pSem( 0 ) 
     106        , m_bDelete( bDelete ) 
    63107        {} 
    64108    virtual ~MemberFunctor1() 
     
    66110 
    67111    virtual void operator() () 
    68         { ( ( *m_pCallee ).*m_pMemFun )( m_parm0 ); } 
     112        {  
     113            ( ( *m_pCallee ).*m_pMemFun )( m_parm0 );  
     114            if (bDelete) { 
     115                delete this; 
     116            } 
     117        } 
    69118 
    70119private: 
     
    72121    MemFunPtr  m_pMemFun; 
    73122    Parm0      m_parm0; 
     123    sem_t* m_pSem; 
     124    bool       m_bDelete; 
    74125}; 
    75126 
     
    99150template< typename CalleePtr, typename Callee,  typename Ret > 
    100151inline void asyncCall( const CalleePtr& pCallee, 
    101                            Ret( Callee::*pFunction )( ) ) 
     152                      Ret( Callee::*pFunction )( ) ) 
    102153{ 
    103154    WorkerThread::instance()->addFunctor(new MemberFunctor0< CalleePtr, Ret ( Callee::* )( ) > ( pCallee,  pFunction )); 
    104155} 
    105156 
     157//////////////////////////////////////////////////////////////////////// 
     158 
     159template< typename CalleePtr, typename Callee,  typename Ret > 
     160inline void syncCall( const CalleePtr& pCallee, 
     161                      Ret( Callee::*pFunction )( ) ) 
     162{ 
     163    sem_t sem; 
     164    sem_init( &sem, 1, 0 ); 
     165 
     166    WorkerThread::instance()->addFunctor(new MemberFunctor0< CalleePtr, Ret ( Callee::* )( ) > ( pCallee,  pFunction, &sem )); 
     167 
     168    sem_wait( &sem ); 
     169    sem_destroy( &sem ); 
     170} 
     171 
    106172#endif 
     173 
     174 
  • trunk/freebob/src/workerthread.cpp

    r34 r37  
    8585 
    8686            ( *pFunctor )(); 
    87             delete pFunctor; 
    8887 
    8988            pthread_testcancel();