1*a0795c6fSMarcus Overhagen // NodeSyncThread.h [rewrite 14oct99] 2*a0795c6fSMarcus Overhagen // * PURPOSE 3*a0795c6fSMarcus Overhagen // Provide continuous synchronization notices on 4*a0795c6fSMarcus Overhagen // a particular BMediaNode. Notification is sent 5*a0795c6fSMarcus Overhagen // to a provided BMessenger. 6*a0795c6fSMarcus Overhagen // 7*a0795c6fSMarcus Overhagen // As long as a NodeSyncThread object exists its thread 8*a0795c6fSMarcus Overhagen // is running. The thread blocks indefinitely, waiting 9*a0795c6fSMarcus Overhagen // for a message to show up on an internal port. 10*a0795c6fSMarcus Overhagen // 11*a0795c6fSMarcus Overhagen // Sync-notice requests (via the +++++ sync() operation) 12*a0795c6fSMarcus Overhagen // trigger a message sent to that port. The thread wakes 13*a0795c6fSMarcus Overhagen // up, then calls BMediaRoster::SyncToNode() to wait 14*a0795c6fSMarcus Overhagen // until a particular performace time arrives for that node. 15*a0795c6fSMarcus Overhagen // 16*a0795c6fSMarcus Overhagen // If SyncToNode() times out, an M_TIMED_OUT message is sent; 17*a0795c6fSMarcus Overhagen // otherwise, an M_SYNC_COMPLETE message is sent. 18*a0795c6fSMarcus Overhagen // 19*a0795c6fSMarcus Overhagen // * HISTORY 20*a0795c6fSMarcus Overhagen // e.moon 14oct99 Rewrite begun. 21*a0795c6fSMarcus Overhagen 22*a0795c6fSMarcus Overhagen #ifndef __NodeSyncThread_H__ 23*a0795c6fSMarcus Overhagen #define __NodeSyncThread_H__ 24*a0795c6fSMarcus Overhagen 25*a0795c6fSMarcus Overhagen #include <MediaNode.h> 26*a0795c6fSMarcus Overhagen #include <Messenger.h> 27*a0795c6fSMarcus Overhagen #include <OS.h> 28*a0795c6fSMarcus Overhagen 29*a0795c6fSMarcus Overhagen #include "cortex_defs.h" 30*a0795c6fSMarcus Overhagen __BEGIN_CORTEX_NAMESPACE 31*a0795c6fSMarcus Overhagen 32*a0795c6fSMarcus Overhagen class NodeSyncThread { 33*a0795c6fSMarcus Overhagen public: // *** messages 34*a0795c6fSMarcus Overhagen enum message_t { 35*a0795c6fSMarcus Overhagen // 'nodeID' (int32) media_node_id value 36*a0795c6fSMarcus Overhagen // 'perfTime' (int64) the performance time 37*a0795c6fSMarcus Overhagen // 'position' (int64) corresponding (caller-provided) position 38*a0795c6fSMarcus Overhagen M_SYNC_COMPLETE =NodeSyncThread_message_base, 39*a0795c6fSMarcus Overhagen 40*a0795c6fSMarcus Overhagen // 'nodeID' (int32) media_node_id value 41*a0795c6fSMarcus Overhagen // 'error' (int32) status_t value from SyncToNode() 42*a0795c6fSMarcus Overhagen // 'perfTime' (int64) the performance time 43*a0795c6fSMarcus Overhagen // 'position' (int64) corresponding (caller-provided) position 44*a0795c6fSMarcus Overhagen M_SYNC_FAILED 45*a0795c6fSMarcus Overhagen }; 46*a0795c6fSMarcus Overhagen 47*a0795c6fSMarcus Overhagen public: // *** dtor/ctors 48*a0795c6fSMarcus Overhagen virtual ~NodeSyncThread(); 49*a0795c6fSMarcus Overhagen 50*a0795c6fSMarcus Overhagen NodeSyncThread( 51*a0795c6fSMarcus Overhagen const media_node& node, 52*a0795c6fSMarcus Overhagen BMessenger* messenger); 53*a0795c6fSMarcus Overhagen 54*a0795c6fSMarcus Overhagen public: // *** operations 55*a0795c6fSMarcus Overhagen // trigger a sync operation: when 'perfTime' arrives 56*a0795c6fSMarcus Overhagen // for the node, a M_SYNC_COMPLETE message with the given 57*a0795c6fSMarcus Overhagen // position value will be sent, unless the sync operation 58*a0795c6fSMarcus Overhagen // times out, in which case M_TIMED_OUT will be sent. 59*a0795c6fSMarcus Overhagen status_t sync( 60*a0795c6fSMarcus Overhagen bigtime_t perfTime, 61*a0795c6fSMarcus Overhagen bigtime_t position, 62*a0795c6fSMarcus Overhagen bigtime_t timeout); 63*a0795c6fSMarcus Overhagen 64*a0795c6fSMarcus Overhagen private: 65*a0795c6fSMarcus Overhagen 66*a0795c6fSMarcus Overhagen // the node to watch 67*a0795c6fSMarcus Overhagen media_node m_node; 68*a0795c6fSMarcus Overhagen 69*a0795c6fSMarcus Overhagen // the messenger to inform 70*a0795c6fSMarcus Overhagen BMessenger* m_messenger; 71*a0795c6fSMarcus Overhagen 72*a0795c6fSMarcus Overhagen // if the thread is running, it has exclusive write access 73*a0795c6fSMarcus Overhagen // to this flag. 74*a0795c6fSMarcus Overhagen volatile bool m_syncInProgress; 75*a0795c6fSMarcus Overhagen 76*a0795c6fSMarcus Overhagen // thread guts 77*a0795c6fSMarcus Overhagen thread_id m_thread; 78*a0795c6fSMarcus Overhagen port_id m_port; 79*a0795c6fSMarcus Overhagen char* m_portBuffer; 80*a0795c6fSMarcus Overhagen ssize_t m_portBufferSize; 81*a0795c6fSMarcus Overhagen 82*a0795c6fSMarcus Overhagen enum _op_codes { 83*a0795c6fSMarcus Overhagen M_TRIGGER 84*a0795c6fSMarcus Overhagen }; 85*a0795c6fSMarcus Overhagen 86*a0795c6fSMarcus Overhagen struct _sync_op { 87*a0795c6fSMarcus Overhagen bigtime_t targetTime; 88*a0795c6fSMarcus Overhagen bigtime_t position; 89*a0795c6fSMarcus Overhagen bigtime_t timeout; 90*a0795c6fSMarcus Overhagen }; 91*a0795c6fSMarcus Overhagen 92*a0795c6fSMarcus Overhagen static status_t _Sync( 93*a0795c6fSMarcus Overhagen void* cookie); 94*a0795c6fSMarcus Overhagen void _sync(); 95*a0795c6fSMarcus Overhagen }; 96*a0795c6fSMarcus Overhagen 97*a0795c6fSMarcus Overhagen __END_CORTEX_NAMESPACE 98*a0795c6fSMarcus Overhagen #endif /*__NodeSyncThread_H__*/ 99