This fix should prevent TimeSource control thread from using random semaphores,
by no longer using an uninitialized Blocker object. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13465 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -22,8 +22,8 @@ namespace BPrivate { namespace media {
|
|||||||
class BMediaRosterEx;
|
class BMediaRosterEx;
|
||||||
class TimeSourceObject;
|
class TimeSourceObject;
|
||||||
class SystemTimeSourceObject;
|
class SystemTimeSourceObject;
|
||||||
|
class SlaveNodes;
|
||||||
struct TimeSourceTransmit;
|
struct TimeSourceTransmit;
|
||||||
struct SlaveNodes;
|
|
||||||
} }
|
} }
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,15 +36,38 @@ struct TimeSourceTransmit // sizeof(TimeSourceTransmit) must be <= TS_AREA_SIZE
|
|||||||
float drift[TS_INDEX_COUNT];
|
float drift[TS_INDEX_COUNT];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SlaveNodes
|
#define SLAVE_NODES_COUNT 300
|
||||||
|
|
||||||
|
// XXX TODO: storage for slave nodes uses public data members, this should be changed
|
||||||
|
|
||||||
|
class SlaveNodes
|
||||||
{
|
{
|
||||||
#define SLAVE_NODES_COUNT 300
|
public:
|
||||||
BLocker locker;
|
SlaveNodes();
|
||||||
int32 count;
|
~SlaveNodes();
|
||||||
media_node_id node_id[SLAVE_NODES_COUNT];
|
public:
|
||||||
port_id node_port[SLAVE_NODES_COUNT];
|
BLocker * locker;
|
||||||
|
int32 count;
|
||||||
|
media_node_id node_id[SLAVE_NODES_COUNT];
|
||||||
|
port_id node_port[SLAVE_NODES_COUNT];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
SlaveNodes::SlaveNodes()
|
||||||
|
{
|
||||||
|
locker = new BLocker("BTimeSource SlaveNodes");
|
||||||
|
count = 0;
|
||||||
|
memset(node_id, 0, sizeof(node_id));
|
||||||
|
memset(node_port, 0, sizeof(node_port));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SlaveNodes::~SlaveNodes()
|
||||||
|
{
|
||||||
|
delete locker;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} }
|
} }
|
||||||
|
|
||||||
|
|
||||||
@@ -57,8 +80,7 @@ BTimeSource::~BTimeSource()
|
|||||||
CALLED();
|
CALLED();
|
||||||
if (fArea > 0)
|
if (fArea > 0)
|
||||||
delete_area(fArea);
|
delete_area(fArea);
|
||||||
if (fSlaveNodes)
|
delete fSlaveNodes;
|
||||||
free(fSlaveNodes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
@@ -206,23 +228,13 @@ BTimeSource::BTimeSource() :
|
|||||||
fStarted(false),
|
fStarted(false),
|
||||||
fArea(-1),
|
fArea(-1),
|
||||||
fBuf(NULL),
|
fBuf(NULL),
|
||||||
fSlaveNodes((BPrivate::media::SlaveNodes*)malloc(sizeof(BPrivate::media::SlaveNodes))),
|
fSlaveNodes(new BPrivate::media::SlaveNodes),
|
||||||
fIsRealtime(false)
|
fIsRealtime(false)
|
||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
AddNodeKind(B_TIME_SOURCE);
|
AddNodeKind(B_TIME_SOURCE);
|
||||||
// printf("##### BTimeSource::BTimeSource() name %s, id %ld\n", Name(), ID());
|
// printf("##### BTimeSource::BTimeSource() name %s, id %ld\n", Name(), ID());
|
||||||
|
|
||||||
if (fSlaveNodes == NULL) {
|
|
||||||
ERROR("BTimeSource::BTimeSource() fSlaveNodes == NULL\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// initialize the slave node storage
|
|
||||||
fSlaveNodes->count = 0;
|
|
||||||
memset(&fSlaveNodes->node_id, 0, SLAVE_NODES_COUNT * sizeof(media_node_id));
|
|
||||||
memset(&fSlaveNodes->node_port, 0, SLAVE_NODES_COUNT * sizeof(port_id));
|
|
||||||
|
|
||||||
// This constructor is only called by real time sources that inherit
|
// This constructor is only called by real time sources that inherit
|
||||||
// BTimeSource. We create the communication area in FinishCreate(),
|
// BTimeSource. We create the communication area in FinishCreate(),
|
||||||
// since we don't have a correct ID() until this node is registered.
|
// since we don't have a correct ID() until this node is registered.
|
||||||
@@ -320,6 +332,8 @@ BTimeSource::BroadcastTimeWarp(bigtime_t at_real_time,
|
|||||||
bigtime_t new_performance_time)
|
bigtime_t new_performance_time)
|
||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
|
ASSERT(fSlaveNodes != NULL);
|
||||||
|
|
||||||
// calls BMediaNode::TimeWarp() of all slaved nodes
|
// calls BMediaNode::TimeWarp() of all slaved nodes
|
||||||
|
|
||||||
TRACE("BTimeSource::BroadcastTimeWarp: at_real_time %Ld, new_performance_time %Ld\n", at_real_time, new_performance_time);
|
TRACE("BTimeSource::BroadcastTimeWarp: at_real_time %Ld, new_performance_time %Ld\n", at_real_time, new_performance_time);
|
||||||
@@ -342,6 +356,8 @@ void
|
|||||||
BTimeSource::SendRunMode(run_mode mode)
|
BTimeSource::SendRunMode(run_mode mode)
|
||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
|
ASSERT(fSlaveNodes != NULL);
|
||||||
|
|
||||||
// send the run mode change to all slaved nodes
|
// send the run mode change to all slaved nodes
|
||||||
|
|
||||||
BAutolock lock(fSlaveNodes->locker);
|
BAutolock lock(fSlaveNodes->locker);
|
||||||
@@ -470,9 +486,11 @@ BTimeSource::AddMe(BMediaNode *node)
|
|||||||
void
|
void
|
||||||
BTimeSource::DirectAddMe(const media_node &node)
|
BTimeSource::DirectAddMe(const media_node &node)
|
||||||
{
|
{
|
||||||
CALLED();
|
|
||||||
// XXX this code has race conditions and is pretty dumb, and it
|
// XXX this code has race conditions and is pretty dumb, and it
|
||||||
// XXX won't detect nodes that crash and don't remove themself.
|
// XXX won't detect nodes that crash and don't remove themself.
|
||||||
|
|
||||||
|
CALLED();
|
||||||
|
ASSERT(fSlaveNodes != NULL);
|
||||||
BAutolock lock(fSlaveNodes->locker);
|
BAutolock lock(fSlaveNodes->locker);
|
||||||
|
|
||||||
if (fSlaveNodes->count == SLAVE_NODES_COUNT) {
|
if (fSlaveNodes->count == SLAVE_NODES_COUNT) {
|
||||||
@@ -503,7 +521,9 @@ BTimeSource::DirectRemoveMe(const media_node &node)
|
|||||||
{
|
{
|
||||||
// XXX this code has race conditions and is pretty dumb, and it
|
// XXX this code has race conditions and is pretty dumb, and it
|
||||||
// XXX won't detect nodes that crash and don't remove themself.
|
// XXX won't detect nodes that crash and don't remove themself.
|
||||||
|
|
||||||
CALLED();
|
CALLED();
|
||||||
|
ASSERT(fSlaveNodes != NULL);
|
||||||
BAutolock lock(fSlaveNodes->locker);
|
BAutolock lock(fSlaveNodes->locker);
|
||||||
|
|
||||||
if (fSlaveNodes->count == 0) {
|
if (fSlaveNodes->count == 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user