xref: /haiku/src/apps/cortex/NodeManager/NodeSyncThread.h (revision a0795c6fe30e25338049a952326c61deb7a343b6)
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