summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-10-02 00:38:59 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-10-02 00:38:59 -0400
commit70a24bceffdd539df3fab3c7b649279732926185 (patch)
tree85f8dd5a9c384f83711d8c7ce4c0e1139769e5c9
parent03e8c06e1ca9a41fe81851c452327f1e567ae546 (diff)
downloadjack1-70a24bceffdd539df3fab3c7b649279732926185.tar.gz
add code to remove metadata for ports and clients when ports and clients are deleted/cleaned up
m---------jack0
-rw-r--r--jackd/Makefile.am4
-rw-r--r--jackd/clientengine.c11
-rw-r--r--jackd/clientengine.h2
-rw-r--r--jackd/engine.c76
-rw-r--r--libjack/metadata.c40
m---------tools0
7 files changed, 96 insertions, 37 deletions
diff --git a/jack b/jack
-Subproject bec4aa8b94f684c0dd38029e0c7ab91f41e6bfc
+Subproject 383c13c50ab517b79cf28bd3e594a9e6e21f505
diff --git a/jackd/Makefile.am b/jackd/Makefile.am
index 94f521e..30d0ac2 100644
--- a/jackd/Makefile.am
+++ b/jackd/Makefile.am
@@ -50,8 +50,8 @@ libjackserver_la_SOURCES = engine.c clientengine.c transengine.c controlapi.c \
../libjack/messagebuffer.c ../libjack/pool.c ../libjack/port.c \
../libjack/midiport.c ../libjack/ringbuffer.c ../libjack/shm.c \
../libjack/thread.c ../libjack/time.c ../libjack/transclient.c \
- ../libjack/unlock.c ../libjack/uuid.c
-libjackserver_la_LIBADD = simd.lo @OS_LDFLAGS@
+ ../libjack/unlock.c ../libjack/uuid.c ../libjack/metadata.c
+libjackserver_la_LIBADD = simd.lo -ldb @OS_LDFLAGS@
libjackserver_la_LDFLAGS = -export-dynamic -version-info @JACK_SO_VERSION@
simd.lo: $(srcdir)/../libjack/simd.c
diff --git a/jackd/clientengine.c b/jackd/clientengine.c
index 4ab8417..1bad277 100644
--- a/jackd/clientengine.c
+++ b/jackd/clientengine.c
@@ -42,6 +42,7 @@
#include "transengine.h"
#include <jack/uuid.h>
+#include <jack/metadata.h>
#include "libjack/local.h"
@@ -51,6 +52,7 @@ jack_client_disconnect_ports (jack_engine_t *engine,
{
JSList *node;
jack_port_internal_t *port;
+ char buf[JACK_UUID_STRING_SIZE];
/* call tree **** MUST HOLD *** engine->client_lock */
@@ -1061,8 +1063,17 @@ jack_mark_client_socket_error (jack_engine_t *engine, int fd)
void
jack_client_delete (jack_engine_t *engine, jack_client_internal_t *client)
{
+ jack_uuid_t uuid;
+ jack_uuid_copy (uuid, client->control->uuid);
+
jack_client_registration_notify (engine, (const char*) client->control->name, 0);
+ jack_remove_properties (NULL, uuid);
+ /* have to do the notification ourselves, since the client argument
+ to jack_remove_properties() was NULL
+ */
+ jack_property_change_notify (engine, PropertyDeleted, uuid, NULL);
+
if (jack_client_is_internal (client)) {
free (client->private_client);
diff --git a/jackd/clientengine.h b/jackd/clientengine.h
index a3d6371..1d49b28 100644
--- a/jackd/clientengine.h
+++ b/jackd/clientengine.h
@@ -62,4 +62,6 @@ int jack_check_clients (jack_engine_t* engine, int with_timeout_check);
void jack_remove_clients (jack_engine_t* engine, int* exit_freewheeling);
void jack_client_registration_notify (jack_engine_t *engine,
const char* name, int yn);
+void jack_property_change_notify (jack_engine_t *engine, jack_property_change_t change, jack_uuid_t uuid, const char* key);
+
void jack_remove_client (jack_engine_t *engine, jack_client_internal_t *client);
diff --git a/jackd/engine.c b/jackd/engine.c
index 6959d27..460a80f 100644
--- a/jackd/engine.c
+++ b/jackd/engine.c
@@ -41,6 +41,7 @@
#include <jack/thread.h>
#include <jack/uuid.h>
+#include <jack/metadata.h>
#include "internal.h"
#include "engine.h"
@@ -141,7 +142,6 @@ static void jack_do_reserve_name (jack_engine_t *engine, jack_request_t *req);
static void jack_do_session_reply (jack_engine_t *engine, jack_request_t *req );
static void jack_compute_new_latency (jack_engine_t *engine);
static int jack_do_has_session_cb (jack_engine_t *engine, jack_request_t *req);
-static void jack_property_change_notify (jack_engine_t *engine, jack_property_change_t change, jack_uuid_t uuid, const char* key);
static inline int
jack_rolling_interval (jack_time_t period_usecs)
@@ -4275,6 +4275,16 @@ jack_get_free_port (jack_engine_t *engine)
void
jack_port_release (jack_engine_t *engine, jack_port_internal_t *port)
{
+ char buf[JACK_UUID_STRING_SIZE];
+ jack_uuid_unparse (port->shared->uuid, buf);
+ if (jack_remove_properties (NULL, port->shared->uuid) > 0) {
+ /* have to do the notification ourselves, since the client argument
+ to jack_remove_properties() was NULL
+ */
+ jack_property_change_notify (engine, PropertyDeleted, port->shared->uuid, NULL);
+ }
+
+
pthread_mutex_lock (&engine->port_lock);
port->shared->in_use = 0;
port->shared->alias1[0] = '\0';
@@ -4452,6 +4462,7 @@ jack_port_do_unregister (jack_engine_t *engine, jack_request_t *req)
jack_client_internal_t *client;
jack_port_shared_t *shared;
jack_port_internal_t *port;
+ jack_uuid_t uuid;
if (req->x.port_info.port_id < 0 ||
req->x.port_info.port_id > engine->port_max) {
@@ -4471,6 +4482,8 @@ jack_port_do_unregister (jack_engine_t *engine, jack_request_t *req)
return -1;
}
+ jack_uuid_copy (uuid, shared->uuid);
+
jack_lock_graph (engine);
if ((client = jack_client_internal_by_id (engine, shared->client_id))
== NULL) {
@@ -4482,8 +4495,7 @@ jack_port_do_unregister (jack_engine_t *engine, jack_request_t *req)
port = &engine->internal_ports[req->x.port_info.port_id];
jack_port_clear_connections (engine, port);
- jack_port_release (engine,
- &engine->internal_ports[req->x.port_info.port_id]);
+ jack_port_release (engine, &engine->internal_ports[req->x.port_info.port_id]);
client->ports = jack_slist_remove (client->ports, port);
jack_port_registration_notify (engine, req->x.port_info.port_id,
@@ -4621,20 +4633,16 @@ jack_port_registration_notify (jack_engine_t *engine,
}
void
-jack_property_change_notify (jack_engine_t *engine,
- jack_property_change_t change,
- jack_uuid_t uuid,
- const char* key)
+jack_client_registration_notify (jack_engine_t *engine,
+ const char* name, int yn)
{
jack_event_t event;
jack_client_internal_t *client;
JSList *node;
- event.type = PropertyChange;
- event.z.property_change = change;
- jack_uuid_copy (event.x.uuid, uuid);
- event.y.key_size = strlen (key) + 1;
-
+ event.type = (yn ? ClientRegistered : ClientUnregistered);
+ snprintf (event.x.name, sizeof (event.x.name), "%s", name);
+
for (node = engine->clients; node; node = jack_slist_next (node)) {
client = (jack_client_internal_t *) node->data;
@@ -4643,9 +4651,14 @@ jack_property_change_notify (jack_engine_t *engine,
continue;
}
- if (client->control->port_register_cbset) {
- if (jack_deliver_event (engine, client, &event, key)) {
- jack_error ("cannot send port registration"
+ if (strcmp ((char*) client->control->name, (char*) name) == 0) {
+ /* do not notify client of its own registration */
+ continue;
+ }
+
+ if (client->control->client_register_cbset) {
+ if (jack_deliver_event (engine, client, &event)) {
+ jack_error ("cannot send client registration"
" notification to %s (%s)",
client->control->name,
strerror (errno));
@@ -4655,16 +4668,25 @@ jack_property_change_notify (jack_engine_t *engine,
}
void
-jack_client_registration_notify (jack_engine_t *engine,
- const char* name, int yn)
+jack_property_change_notify (jack_engine_t *engine,
+ jack_property_change_t change,
+ jack_uuid_t uuid,
+ const char* key)
{
jack_event_t event;
jack_client_internal_t *client;
JSList *node;
- event.type = (yn ? ClientRegistered : ClientUnregistered);
- snprintf (event.x.name, sizeof (event.x.name), "%s", name);
-
+ event.type = PropertyChange;
+ event.z.property_change = change;
+ jack_uuid_copy (event.x.uuid, uuid);
+
+ if (key) {
+ event.y.key_size = strlen (key) + 1;
+ } else {
+ event.y.key_size = 0;
+ }
+
for (node = engine->clients; node; node = jack_slist_next (node)) {
client = (jack_client_internal_t *) node->data;
@@ -4673,16 +4695,10 @@ jack_client_registration_notify (jack_engine_t *engine,
continue;
}
- if (strcmp ((char*) client->control->name, (char*) name) == 0) {
- /* do not notify client of its own registration */
- continue;
- }
-
- if (client->control->client_register_cbset) {
- if (jack_deliver_event (engine, client, &event)) {
- jack_error ("cannot send client registration"
- " notification to %s (%s)",
- client->control->name,
+ if (client->control->property_cbset) {
+ if (jack_deliver_event (engine, client, &event, key)) {
+ jack_error ("cannot send property change notification to %s (%s)",
+ client->control->name,
strerror (errno));
}
}
diff --git a/libjack/metadata.c b/libjack/metadata.c
index df460d9..5fc6f7b 100644
--- a/libjack/metadata.c
+++ b/libjack/metadata.c
@@ -27,6 +27,7 @@
#include "local.h"
static DB* db = NULL;
+static DB_ENV* db_env = NULL;
static int
jack_property_init (const char* server_name)
@@ -37,11 +38,21 @@ jack_property_init (const char* server_name)
/* idempotent */
- if (db) {
+ if (db_env) {
return 0;
}
- if ((ret = db_create (&db, NULL, 0)) != 0) {
+ if ((ret = db_env_create(&db_env, 0)) != 0) {
+ jack_error ("cannot initialize DB environment: %s\n", db_strerror(ret));
+ return -1;
+ }
+
+ if ((ret = db_env->open(db_env, jack_server_dir (server_name, server_dir), DB_CREATE | DB_INIT_LOCK | DB_INIT_MPOOL | DB_THREAD, 0)) != 0) {
+ jack_error ("cannot open DB environment: %s", db_strerror (ret));
+ return -1;
+ }
+
+ if ((ret = db_create (&db, db_env, 0)) != 0) {
jack_error ("Cannot initialize metadata DB (%s)", db_strerror (ret));
return -1;
}
@@ -67,6 +78,10 @@ jack_properties_uninit ()
db->close (db, 0);
db = NULL;
}
+ if (db_env) {
+ db_env->close (db_env, 0);
+ db_env = 0;
+ }
}
void
@@ -93,6 +108,14 @@ static int
jack_property_change_notify (jack_client_t* client, jack_uuid_t uuid, const char* key, jack_property_change_t change)
{
jack_request_t req;
+
+ /* the engine passes in a NULL client when it removes metadata during port or client removal
+ */
+
+ if (client == NULL) {
+ return 0;
+ }
+
req.type = PropertyChangeNotify;
req.x.property.change = change;
jack_uuid_copy (req.x.property.uuid, uuid);
@@ -562,6 +585,7 @@ jack_remove_properties (jack_client_t* client, jack_uuid_t subject)
int ret;
char ustr[JACK_UUID_STRING_SIZE];
int retval = 0;
+ uint32_t cnt = 0;
jack_uuid_unparse (subject, ustr);
@@ -569,7 +593,6 @@ jack_remove_properties (jack_client_t* client, jack_uuid_t subject)
return -1;
}
-
if ((ret = db->cursor (db, NULL, &cursor, 0)) != 0) {
jack_error ("Cannot create cursor for metadata search (%s)", db_strerror (ret));
return -1;
@@ -607,13 +630,20 @@ jack_remove_properties (jack_client_t* client, jack_uuid_t subject)
*/
retval = -1;
}
+ cnt++;
}
cursor->close (cursor);
- jack_property_change_notify (client, subject, NULL, PropertyDeleted);
+ if (cnt) {
+ jack_property_change_notify (client, subject, NULL, PropertyDeleted);
+ }
+
+ if (retval) {
+ return -1;
+ }
- return retval;
+ return cnt;
}
int
diff --git a/tools b/tools
-Subproject 6ac302ba8664e20c6c03d6da7fa8adeb7949925
+Subproject 0c64f246bdeef806e2938e3435a641bd4b716fe