DatabasePlugin: add method ReturnSong()

Allow the plugin to allocate the GetSong() return value.
This commit is contained in:
Max Kellermann
2012-08-15 23:28:19 +02:00
parent f45616e5f6
commit 3b8532f3fb
13 changed files with 85 additions and 14 deletions

View File

@@ -56,6 +56,8 @@ public:
virtual void Close() override;
virtual struct song *GetSong(const char *uri_utf8,
GError **error_r) const override;
virtual void ReturnSong(struct song *song) const;
virtual bool Visit(const DatabaseSelection &selection,
VisitDirectory visit_directory,
VisitSong visit_song,
@@ -191,6 +193,16 @@ ProxyDatabase::GetSong(const char *uri, GError **error_r) const
return nullptr;
}
void
ProxyDatabase::ReturnSong(struct song *song) const
{
assert(song != nullptr);
assert(song_in_database(song));
assert(song_is_detached(song));
song_free(song);
}
static bool
Visit(struct mpd_connection *connection, const char *uri,
bool recursive, VisitDirectory visit_directory, VisitSong visit_song,

View File

@@ -184,6 +184,10 @@ SimpleDatabase::Open(GError **error_r)
root = directory_new_root();
mtime = 0;
#ifndef NDEBUG
borrowed_song_count = 0;
#endif
GError *error = NULL;
if (!Load(&error)) {
directory_free(root);
@@ -204,6 +208,7 @@ void
SimpleDatabase::Close()
{
assert(root != NULL);
assert(borrowed_song_count == 0);
directory_free(root);
}
@@ -219,10 +224,25 @@ SimpleDatabase::GetSong(const char *uri, GError **error_r) const
if (song == NULL)
g_set_error(error_r, db_quark(), DB_NOT_FOUND,
"No such song: %s", uri);
#ifndef NDEBUG
else
++const_cast<unsigned &>(borrowed_song_count);
#endif
return song;
}
void
SimpleDatabase::ReturnSong(gcc_unused struct song *song) const
{
assert(song != nullptr);
#ifndef NDEBUG
assert(borrowed_song_count > 0);
--const_cast<unsigned &>(borrowed_song_count);
#endif
}
G_GNUC_PURE
const struct directory *
SimpleDatabase::LookupDirectory(const char *uri) const

View File

@@ -38,6 +38,10 @@ class SimpleDatabase : public Database {
time_t mtime;
#ifndef NDEBUG
unsigned borrowed_song_count;
#endif
public:
gcc_pure
struct directory *GetRoot() {
@@ -61,6 +65,8 @@ public:
virtual struct song *GetSong(const char *uri_utf8,
GError **error_r) const override;
virtual void ReturnSong(struct song *song) const;
virtual bool Visit(const DatabaseSelection &selection,
VisitDirectory visit_directory,
VisitSong visit_song,