Cleanup metadata on server close

This commit is contained in:
falkTX 2019-09-25 02:04:22 +01:00 committed by Filipe Coelho
parent 0ee218826b
commit c74385603c
5 changed files with 49 additions and 20 deletions

View File

@ -130,6 +130,8 @@ class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnable
JackClient(JackSynchro* table);
virtual ~JackClient();
char* GetServerName() { return fServerName; }
virtual int Open(const char* server_name, const char* name, jack_uuid_t uuid, jack_options_t options, jack_status_t* status) = 0;
virtual int Close();

View File

@ -46,7 +46,7 @@ JackEngine::JackEngine(JackGraphManager* manager,
char self_connect_mode)
: JackLockAble(control->fServerName),
fSignal(control->fServerName),
fMetadata(NULL) // FIXME use control->fServerName?
fMetadata(true)
{
fGraphManager = manager;
fSynchroTable = table;

View File

@ -70,7 +70,7 @@ struct JackLibGlobals
fGraphManager = -1;
fEngineControl = -1;
fMetadata = new JackMetadata(NULL);
fMetadata = new JackMetadata(false);
// Filter SIGPIPE to avoid having client get a SIGPIPE when trying to access a died server.
#ifdef WIN32
@ -92,6 +92,7 @@ struct JackLibGlobals
JackMessageBuffer::Destroy();
delete fMetadata;
fMetadata = NULL;
// Restore old signal mask
#ifdef WIN32

View File

@ -1,6 +1,7 @@
/*
Copyright (C) 2011 David Robillard
Copyright (C) 2013 Paul Davis
Copyright (C) 2019 Filipe Coelho
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by
@ -22,6 +23,7 @@
#include "JackClient.h"
#include <string.h>
#include <sys/stat.h>
#include <limits.h>
@ -32,33 +34,54 @@ LIB_EXPORT const char* JACK_METADATA_PORT_GROUP = "http://jackaudio.org/metadata
LIB_EXPORT const char* JACK_METADATA_ICON_SMALL = "http://jackaudio.org/metadata/icon-small";
LIB_EXPORT const char* JACK_METADATA_ICON_LARGE = "http://jackaudio.org/metadata/icon-large";
namespace Jack
{
JackMetadata::JackMetadata(const char* server_name)
JackMetadata::JackMetadata(bool isEngine)
#if HAVE_DB
: fDB(NULL), fDBenv(NULL)
: fDB(NULL), fDBenv(NULL), fIsEngine(isEngine)
#endif
{
PropertyInit(server_name);
PropertyInit();
}
JackMetadata::~JackMetadata()
{
#if HAVE_DB
char dbpath[PATH_MAX + 1];
if (fDB) {
fDB->close (fDB, 0);
fDB = NULL;
}
if (fDBenv) {
fDBenv->close (fDBenv, 0);
fDBenv = 0;
fDBenv = NULL;
}
if (fIsEngine)
{
// cleanup after libdb, nasty!
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/metadata.db", jack_server_dir);
remove (dbpath);
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.001", jack_server_dir);
remove (dbpath);
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.002", jack_server_dir);
remove (dbpath);
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.003", jack_server_dir);
remove (dbpath);
// remove our custom dir
snprintf (dbpath, sizeof(dbpath), "%s/jack_db", jack_server_dir);
rmdir (dbpath);
}
#endif
}
int JackMetadata::PropertyInit(const char* server_name)
int JackMetadata::PropertyInit()
{
#if HAVE_DB
@ -76,7 +99,10 @@ int JackMetadata::PropertyInit(const char* server_name)
return -1;
}
if ((ret = fDBenv->open (fDBenv, jack_server_dir /*FIXME:(server_name, server_dir)*/, DB_CREATE | DB_INIT_LOCK | DB_INIT_MPOOL | DB_THREAD, 0)) != 0) {
snprintf (dbpath, sizeof(dbpath), "%s/jack_db", jack_server_dir);
mkdir (dbpath, S_IRWXU | S_IRWXG);
if ((ret = fDBenv->open (fDBenv, dbpath, DB_CREATE | DB_INIT_LOCK | DB_INIT_MPOOL | DB_THREAD, 0)) != 0) {
jack_error ("cannot open DB environment: %s", db_strerror (ret));
return -1;
}
@ -86,8 +112,7 @@ int JackMetadata::PropertyInit(const char* server_name)
return -1;
}
snprintf (dbpath, sizeof(dbpath), "%s/%s", jack_server_dir /*FIXME:(server_name, server_dir)*/, "metadata.db");
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/metadata.db", jack_server_dir);
if ((ret = fDB->open (fDB, NULL, dbpath, NULL, DB_HASH, DB_CREATE | DB_THREAD, 0666)) != 0) {
jack_error ("Cannot open metadata DB at %s: %s", dbpath, db_strerror (ret));
fDB->close (fDB, 0);
@ -152,7 +177,7 @@ int JackMetadata::SetProperty(JackClient* client, jack_uuid_t subject, const cha
return -1;
}
if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1;
}
@ -227,7 +252,7 @@ int JackMetadata::GetProperty(jack_uuid_t subject, const char* key, char** value
return -1;
}
if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1;
}
@ -319,7 +344,7 @@ int JackMetadata::GetProperties(jack_uuid_t subject, jack_description_t* desc)
memset (ustr, 0, JACK_UUID_STRING_SIZE);
jack_uuid_unparse (subject, ustr);
if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1;
}
@ -447,7 +472,7 @@ int JackMetadata::GetAllProperties(jack_description_t** descriptions)
jack_property_t* current_prop = NULL;
size_t len1, len2;
if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1;
}
@ -604,7 +629,7 @@ int JackMetadata::RemoveProperty(JackClient* client, jack_uuid_t subject, const
DBT d_key;
int ret;
if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1;
}
@ -645,7 +670,7 @@ int JackMetadata::RemoveProperties(JackClient* client, jack_uuid_t subject)
memset (ustr, 0, JACK_UUID_STRING_SIZE);
jack_uuid_unparse (subject, ustr);
if (PropertyInit(NULL)) {
if (PropertyInit() || fDB == NULL) {
return -1;
}
@ -720,7 +745,7 @@ int JackMetadata::RemoveAllProperties(JackClient* client)
int ret;
jack_uuid_t empty_uuid = JACK_UUID_EMPTY_INITIALIZER;
if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1;
}

View File

@ -77,9 +77,10 @@ class JackMetadata
#if HAVE_DB
DB* fDB;
DB_ENV* fDBenv;
const bool fIsEngine;
#endif
int PropertyInit(const char* server_name);
int PropertyInit();
int PropertyChangeNotify(JackClient* client, jack_uuid_t subject, const char* key, jack_property_change_t change);
#if HAVE_DB
@ -88,7 +89,7 @@ class JackMetadata
public:
JackMetadata(const char* server_name = NULL);
JackMetadata(bool isEngine);
~JackMetadata();
int GetProperty(jack_uuid_t subject, const char* key, char** value, char** type);