92c66394a2
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34539 a95241bf-73f2-0310-859d-f6bbb57e9c96
85 lines
2.1 KiB
C++
85 lines
2.1 KiB
C++
/*
|
|
* Copyright 2002, Marcus Overhagen. All rights reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
#ifndef _DORMANT_NODE_MANAGER_H
|
|
#define _DORMANT_NODE_MANAGER_H
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <Locker.h>
|
|
#include <MediaAddOn.h>
|
|
|
|
|
|
class BPath;
|
|
|
|
|
|
namespace BPrivate {
|
|
namespace media {
|
|
|
|
// To instantiate a dormant node in the current address space, we need to
|
|
// either load the add-on from file and create a new BMediaAddOn class and
|
|
// cache the BMediaAddOn after that for later reuse, or reuse the cached
|
|
// BMediaAddOn if we already have one.
|
|
// This is handled by the DormantNodeManager.
|
|
//
|
|
// GetAddon() will provide a ready to use BMediaAddOn, while
|
|
// PutAddonDelayed() will unload it when it's no longer needed,
|
|
// but will delay the unloading slightly, because it is called
|
|
// from a node destructor of the loaded add-on.
|
|
|
|
class DormantNodeManager {
|
|
public:
|
|
DormantNodeManager();
|
|
~DormantNodeManager();
|
|
|
|
// Be careful, GetAddon and PutAddon[Delayed] must be balanced.
|
|
BMediaAddOn* GetAddOn(media_addon_id id);
|
|
void PutAddOn(media_addon_id id);
|
|
void PutAddOnDelayed(media_addon_id id);
|
|
|
|
// For use by media_addon_server only
|
|
media_addon_id RegisterAddOn(const char* path);
|
|
void UnregisterAddOn(media_addon_id id);
|
|
|
|
// query the server for the path
|
|
status_t FindAddOnPath(BPath* path, media_addon_id id);
|
|
|
|
private:
|
|
struct loaded_add_on_info {
|
|
BMediaAddOn* add_on;
|
|
image_id image;
|
|
int32 use_count;
|
|
};
|
|
|
|
// returns the addon or NULL if it needs to be loaded
|
|
BMediaAddOn* _LookupAddOn(media_addon_id id);
|
|
|
|
// manage loading and unloading add-ons from images
|
|
status_t _LoadAddOn(const char* path, media_addon_id id,
|
|
BMediaAddOn** _newAddOn,
|
|
image_id* _newImage);
|
|
void _UnloadAddOn(BMediaAddOn* addOn,
|
|
image_id image);
|
|
|
|
private:
|
|
typedef std::map<media_addon_id, loaded_add_on_info> AddOnMap;
|
|
|
|
BLocker fLock;
|
|
AddOnMap fAddOnMap;
|
|
};
|
|
|
|
|
|
extern DormantNodeManager* gDormantNodeManager;
|
|
|
|
|
|
} // namespace media
|
|
} // namespace BPrivate
|
|
|
|
|
|
using BPrivate::media::gDormantNodeManager;
|
|
|
|
|
|
#endif /* _DORMANT_NODE_MANAGER_H */
|