1/*
2 * Copyright (c) 1999-2000, Eric Moon.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions, and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions, and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * 3. The name of the author may not be used to endorse or promote products
17 *    derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31
32// NodeSyncThread.h [rewrite 14oct99]
33// * PURPOSE
34//   Provide continuous synchronization notices on
35//   a particular BMediaNode.  Notification is sent
36//   to a provided BMessenger.
37//
38//   As long as a NodeSyncThread object exists its thread
39//   is running.  The thread blocks indefinitely, waiting
40//   for a message to show up on an internal port.
41//
42//   Sync-notice requests (via the +++++ sync() operation)
43//   trigger a message sent to that port.  The thread wakes
44//   up, then calls BMediaRoster::SyncToNode() to wait
45//   until a particular performace time arrives for that node.
46//
47//   If SyncToNode() times out, an M_TIMED_OUT message is sent;
48//   otherwise, an M_SYNC_COMPLETE message is sent.
49//
50// * HISTORY
51//   e.moon		14oct99		Rewrite begun.
52
53#ifndef __NodeSyncThread_H__
54#define __NodeSyncThread_H__
55
56#include <MediaNode.h>
57#include <Messenger.h>
58#include <OS.h>
59
60#include "cortex_defs.h"
61__BEGIN_CORTEX_NAMESPACE
62
63class NodeSyncThread {
64public:													// *** messages
65	enum message_t {
66		// 'nodeID' (int32)         media_node_id value
67		// 'perfTime' (int64)				the performance time
68		// 'position' (int64)       corresponding (caller-provided) position
69		M_SYNC_COMPLETE							=NodeSyncThread_message_base,
70
71		// 'nodeID' (int32)         media_node_id value
72		// 'error' (int32)					status_t value from SyncToNode()
73		// 'perfTime' (int64)				the performance time
74		// 'position' (int64)       corresponding (caller-provided) position
75		M_SYNC_FAILED
76	};
77
78public:													// *** dtor/ctors
79	virtual ~NodeSyncThread();
80
81	NodeSyncThread(
82		const media_node&						node,
83		BMessenger*									messenger);
84
85public:													// *** operations
86	// trigger a sync operation: when 'perfTime' arrives
87	// for the node, a M_SYNC_COMPLETE message with the given
88	// position value will be sent,  unless the sync operation
89	// times out, in which case M_TIMED_OUT will be sent.
90	status_t sync(
91		bigtime_t										perfTime,
92		bigtime_t										position,
93		bigtime_t										timeout);
94
95private:
96
97	// the node to watch
98	media_node										m_node;
99
100	// the messenger to inform
101	BMessenger*										m_messenger;
102
103	// if the thread is running, it has exclusive write access
104	// to this flag.
105	volatile bool									m_syncInProgress;
106
107	// thread guts
108	thread_id											m_thread;
109	port_id												m_port;
110	char*													m_portBuffer;
111	ssize_t												m_portBufferSize;
112
113	enum _op_codes {
114		M_TRIGGER
115	};
116
117	struct _sync_op {
118		bigtime_t 	targetTime;
119		bigtime_t		position;
120		bigtime_t		timeout;
121	};
122
123	static status_t _Sync(
124		void*												cookie);
125	void _sync();
126};
127
128__END_CORTEX_NAMESPACE
129#endif /*__NodeSyncThread_H__*/
130