fixing BMediaRoster::ReleaseNode()

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2915 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper
2003-03-14 23:12:11 +00:00
parent d2ecd5a91c
commit cf4e227786
7 changed files with 131 additions and 30 deletions
+43 -13
View File
@@ -17,14 +17,14 @@
const char *get_node_type(node_type t);
NodeManager::NodeManager() :
nextaddonid(1),
nextnodeid(1)
fNextAddOnID(1),
fNextNodeID(1),
fLocker(new BLocker("node manager locker")),
fDormantFlavorList(new List<dormant_flavor_info>),
fAddonPathMap(new Map<media_addon_id, entry_ref>),
fRegisteredNodeMap(new Map<media_node_id, registered_node>),
fDefaultManager(new DefaultManager)
{
fLocker = new BLocker("node manager locker");
fDormantFlavorList = new List<dormant_flavor_info>;
fAddonPathMap = new Map<media_addon_id, entry_ref>;
fRegisteredNodeMap = new Map<media_node_id, registered_node>;
fDefaultManager = new DefaultManager;
}
@@ -44,7 +44,7 @@ NodeManager::RegisterNode(media_node_id *nodeid, media_addon_id addon_id, int32
BAutolock lock(fLocker);
bool b;
registered_node rn;
rn.nodeid = nextnodeid;
rn.nodeid = fNextNodeID;
rn.addon_id = addon_id;
rn.addon_flavor_id = addon_flavor_id;
strcpy(rn.name, name);
@@ -54,10 +54,10 @@ NodeManager::RegisterNode(media_node_id *nodeid, media_addon_id addon_id, int32
rn.globalrefcount = 1;
rn.teamrefcount.Insert(team, 1);
b = fRegisteredNodeMap->Insert(nextnodeid, rn);
b = fRegisteredNodeMap->Insert(fNextNodeID, rn);
ASSERT(b);
*nodeid = nextnodeid;
nextnodeid += 1;
*nodeid = fNextNodeID;
fNextNodeID += 1;
TRACE("NodeManager::RegisterNode: node %ld, addon_id %ld, flavor_id %ld, name \"%s\", kinds %#Lx, port %ld, team %ld\n", *nodeid, addon_id, addon_flavor_id, name, kinds, port, team);
return B_OK;
}
@@ -145,11 +145,41 @@ NodeManager::DecrementGlobalRefCount(media_node_id nodeid, team_id team)
ASSERT(b);
}
rn->globalrefcount -= 1;
if (rn->globalrefcount == 0) {
printf("NodeManager::DecrementGlobalRefCount: detected released node is now unused, node %ld\n", nodeid);
FinalReleaseNode(nodeid);
}
TRACE("NodeManager::DecrementGlobalRefCount leave: node %ld, team %ld, count %ld, globalcount %ld\n", nodeid, team, debug_count, rn->globalrefcount);
return B_OK;
}
void
NodeManager::FinalReleaseNode(media_node_id nodeid)
{
BAutolock lock(fLocker);
registered_node *rn;
bool b;
status_t rv;
TRACE("NodeManager::FinalReleaseNode enter: node %ld\n", nodeid);
b = fRegisteredNodeMap->Get(nodeid, &rn);
if (!b) {
FATAL("NodeManager::FinalReleaseNode: Error: node %ld not found\n", nodeid);
return;
}
node_final_release_command cmd;
rv = SendToPort(rn->port, NODE_FINAL_RELEASE, &cmd, sizeof(cmd));
if (rv != B_OK) {
FATAL("NodeManager::FinalReleaseNode: Error: can't send command to node %ld\n", nodeid);
return;
}
}
status_t
NodeManager::GetCloneForId(media_node *node, media_node_id nodeid, team_id team)
{
@@ -445,8 +475,8 @@ NodeManager::RegisterAddon(const entry_ref &ref, media_addon_id *newid)
{
BAutolock lock(fLocker);
media_addon_id id;
id = nextaddonid;
nextaddonid += 1;
id = fNextAddOnID;
fNextAddOnID += 1;
printf("NodeManager::RegisterAddon: ref-name \"%s\", assigning id %ld\n", ref.name, id);