Browse Source

Cleanup metadata on server close

tags/v1.9.13
parent
commit
c74385603c
5 changed files with 49 additions and 20 deletions
  1. +2
    -0
      common/JackClient.h
  2. +1
    -1
      common/JackEngine.cpp
  3. +2
    -1
      common/JackLibGlobals.h
  4. +41
    -16
      common/JackMetadata.cpp
  5. +3
    -2
      common/JackMetadata.h

+ 2
- 0
common/JackClient.h View File

@@ -130,6 +130,8 @@ class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnable


JackClient(JackSynchro* table); JackClient(JackSynchro* table);
virtual ~JackClient(); 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 Open(const char* server_name, const char* name, jack_uuid_t uuid, jack_options_t options, jack_status_t* status) = 0;
virtual int Close(); virtual int Close();


+ 1
- 1
common/JackEngine.cpp View File

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


+ 2
- 1
common/JackLibGlobals.h View File

@@ -70,7 +70,7 @@ struct JackLibGlobals
fGraphManager = -1; fGraphManager = -1;
fEngineControl = -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. // Filter SIGPIPE to avoid having client get a SIGPIPE when trying to access a died server.
#ifdef WIN32 #ifdef WIN32
@@ -92,6 +92,7 @@ struct JackLibGlobals
JackMessageBuffer::Destroy(); JackMessageBuffer::Destroy();


delete fMetadata; delete fMetadata;
fMetadata = NULL;


// Restore old signal mask // Restore old signal mask
#ifdef WIN32 #ifdef WIN32


+ 41
- 16
common/JackMetadata.cpp View File

@@ -1,6 +1,7 @@
/* /*
Copyright (C) 2011 David Robillard Copyright (C) 2011 David Robillard
Copyright (C) 2013 Paul Davis Copyright (C) 2013 Paul Davis
Copyright (C) 2019 Filipe Coelho


This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU Lesser General Public License as published by
@@ -22,6 +23,7 @@
#include "JackClient.h" #include "JackClient.h"


#include <string.h> #include <string.h>
#include <sys/stat.h>
#include <limits.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_SMALL = "http://jackaudio.org/metadata/icon-small";
LIB_EXPORT const char* JACK_METADATA_ICON_LARGE = "http://jackaudio.org/metadata/icon-large"; LIB_EXPORT const char* JACK_METADATA_ICON_LARGE = "http://jackaudio.org/metadata/icon-large";



namespace Jack namespace Jack
{ {


JackMetadata::JackMetadata(const char* server_name)
JackMetadata::JackMetadata(bool isEngine)
#if HAVE_DB #if HAVE_DB
: fDB(NULL), fDBenv(NULL)
: fDB(NULL), fDBenv(NULL), fIsEngine(isEngine)
#endif #endif
{ {
PropertyInit(server_name);
PropertyInit();
} }


JackMetadata::~JackMetadata() JackMetadata::~JackMetadata()
{ {
#if HAVE_DB #if HAVE_DB
char dbpath[PATH_MAX + 1];

if (fDB) { if (fDB) {
fDB->close (fDB, 0); fDB->close (fDB, 0);
fDB = NULL; fDB = NULL;
} }
if (fDBenv) { if (fDBenv) {
fDBenv->close (fDBenv, 0); 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 #endif
} }


int JackMetadata::PropertyInit(const char* server_name)
int JackMetadata::PropertyInit()
{ {
#if HAVE_DB #if HAVE_DB


@@ -76,7 +99,10 @@ int JackMetadata::PropertyInit(const char* server_name)
return -1; 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)); jack_error ("cannot open DB environment: %s", db_strerror (ret));
return -1; return -1;
} }
@@ -86,8 +112,7 @@ int JackMetadata::PropertyInit(const char* server_name)
return -1; 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) { 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)); jack_error ("Cannot open metadata DB at %s: %s", dbpath, db_strerror (ret));
fDB->close (fDB, 0); fDB->close (fDB, 0);
@@ -152,7 +177,7 @@ int JackMetadata::SetProperty(JackClient* client, jack_uuid_t subject, const cha
return -1; return -1;
} }


if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1; return -1;
} }


@@ -227,7 +252,7 @@ int JackMetadata::GetProperty(jack_uuid_t subject, const char* key, char** value
return -1; return -1;
} }


if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1; return -1;
} }


@@ -319,7 +344,7 @@ int JackMetadata::GetProperties(jack_uuid_t subject, jack_description_t* desc)
memset (ustr, 0, JACK_UUID_STRING_SIZE); memset (ustr, 0, JACK_UUID_STRING_SIZE);
jack_uuid_unparse (subject, ustr); jack_uuid_unparse (subject, ustr);


if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1; return -1;
} }


@@ -447,7 +472,7 @@ int JackMetadata::GetAllProperties(jack_description_t** descriptions)
jack_property_t* current_prop = NULL; jack_property_t* current_prop = NULL;
size_t len1, len2; size_t len1, len2;


if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1; return -1;
} }


@@ -604,7 +629,7 @@ int JackMetadata::RemoveProperty(JackClient* client, jack_uuid_t subject, const
DBT d_key; DBT d_key;
int ret; int ret;


if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1; return -1;
} }


@@ -645,7 +670,7 @@ int JackMetadata::RemoveProperties(JackClient* client, jack_uuid_t subject)
memset (ustr, 0, JACK_UUID_STRING_SIZE); memset (ustr, 0, JACK_UUID_STRING_SIZE);
jack_uuid_unparse (subject, ustr); jack_uuid_unparse (subject, ustr);


if (PropertyInit(NULL)) {
if (PropertyInit() || fDB == NULL) {
return -1; return -1;
} }


@@ -720,7 +745,7 @@ int JackMetadata::RemoveAllProperties(JackClient* client)
int ret; int ret;
jack_uuid_t empty_uuid = JACK_UUID_EMPTY_INITIALIZER; jack_uuid_t empty_uuid = JACK_UUID_EMPTY_INITIALIZER;


if (PropertyInit(NULL)) {
if (PropertyInit()) {
return -1; return -1;
} }




+ 3
- 2
common/JackMetadata.h View File

@@ -77,9 +77,10 @@ class JackMetadata
#if HAVE_DB #if HAVE_DB
DB* fDB; DB* fDB;
DB_ENV* fDBenv; DB_ENV* fDBenv;
const bool fIsEngine;
#endif #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); int PropertyChangeNotify(JackClient* client, jack_uuid_t subject, const char* key, jack_property_change_t change);


#if HAVE_DB #if HAVE_DB
@@ -88,7 +89,7 @@ class JackMetadata


public: public:


JackMetadata(const char* server_name = NULL);
JackMetadata(bool isEngine);
~JackMetadata(); ~JackMetadata();


int GetProperty(jack_uuid_t subject, const char* key, char** value, char** type); int GetProperty(jack_uuid_t subject, const char* key, char** value, char** type);


Loading…
Cancel
Save