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);
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();


+ 1
- 1
common/JackEngine.cpp 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;


+ 2
- 1
common/JackLibGlobals.h 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


+ 41
- 16
common/JackMetadata.cpp 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;
}



+ 3
- 2
common/JackMetadata.h 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);


Loading…
Cancel
Save