Browse Source

Correct ressource leak in JackCoreMidiOutputPort.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4615 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.9.8
sletz 13 years ago
parent
commit
cf1cf045d9
3 changed files with 60 additions and 53 deletions
  1. +58
    -52
      common/JackControlAPI.cpp
  2. +1
    -0
      example-clients/midi_latency_test.c
  3. +1
    -1
      macosx/coremidi/JackCoreMidiOutputPort.cpp

+ 58
- 52
common/JackControlAPI.cpp View File

@@ -875,66 +875,72 @@ jackctl_server_open(
jackctl_server *server_ptr, jackctl_server *server_ptr,
jackctl_driver *driver_ptr) jackctl_driver *driver_ptr)
{ {
if (!server_ptr || !driver_ptr) {
return false;
}
try {


int rc = jack_register_server(server_ptr->name.str, server_ptr->replace_registry.b);
switch (rc)
{
case EEXIST:
jack_error("`%s' server already active", server_ptr->name.str);
goto fail;
case ENOSPC:
jack_error("too many servers already active");
goto fail;
case ENOMEM:
jack_error("no access to shm registry");
goto fail;
}
if (!server_ptr || !driver_ptr) {
return false;
}


jack_log("server `%s' registered", server_ptr->name.str);
int rc = jack_register_server(server_ptr->name.str, server_ptr->replace_registry.b);
switch (rc)
{
case EEXIST:
jack_error("`%s' server already active", server_ptr->name.str);
goto fail;
case ENOSPC:
jack_error("too many servers already active");
goto fail;
case ENOMEM:
jack_error("no access to shm registry");
goto fail;
}


/* clean up shared memory and files from any previous
* instance of this server name */
jack_cleanup_shm();
JackTools::CleanupFiles(server_ptr->name.str);
jack_log("server `%s' registered", server_ptr->name.str);


if (!server_ptr->realtime.b && server_ptr->client_timeout.i == 0) {
server_ptr->client_timeout.i = 500; /* 0.5 sec; usable when non realtime. */
}
/* clean up shared memory and files from any previous
* instance of this server name */
jack_cleanup_shm();
JackTools::CleanupFiles(server_ptr->name.str);


/* check port max value before allocating server */
if (server_ptr->port_max.ui > PORT_NUM_MAX) {
jack_error("JACK server started with too much ports %d (when port max can be %d)", server_ptr->port_max.ui, PORT_NUM_MAX);
goto fail;
}
if (!server_ptr->realtime.b && server_ptr->client_timeout.i == 0) {
server_ptr->client_timeout.i = 500; /* 0.5 sec; usable when non realtime. */
}


/* get the engine/driver started */
server_ptr->engine = new JackServer(
server_ptr->sync.b,
server_ptr->temporary.b,
server_ptr->client_timeout.i,
server_ptr->realtime.b,
server_ptr->realtime_priority.i,
server_ptr->port_max.ui,
server_ptr->verbose.b,
(jack_timer_type_t)server_ptr->clock_source.ui,
server_ptr->name.str);
if (server_ptr->engine == NULL)
{
jack_error("Failed to create new JackServer object");
goto fail_unregister;
}
/* check port max value before allocating server */
if (server_ptr->port_max.ui > PORT_NUM_MAX) {
jack_error("JACK server started with too much ports %d (when port max can be %d)", server_ptr->port_max.ui, PORT_NUM_MAX);
goto fail;
}


rc = server_ptr->engine->Open(driver_ptr->desc_ptr, driver_ptr->set_parameters);
if (rc < 0)
{
jack_error("JackServer::Open() failed with %d", rc);
goto fail_delete;
}
/* get the engine/driver started */
server_ptr->engine = new JackServer(
server_ptr->sync.b,
server_ptr->temporary.b,
server_ptr->client_timeout.i,
server_ptr->realtime.b,
server_ptr->realtime_priority.i,
server_ptr->port_max.ui,
server_ptr->verbose.b,
(jack_timer_type_t)server_ptr->clock_source.ui,
server_ptr->name.str);
if (server_ptr->engine == NULL)
{
jack_error("Failed to create new JackServer object");
goto fail_unregister;
}


return true;
rc = server_ptr->engine->Open(driver_ptr->desc_ptr, driver_ptr->set_parameters);
if (rc < 0)
{
jack_error("JackServer::Open() failed with %d", rc);
goto fail_delete;
}

return true;

} catch (std::exception e) {
jack_error("jackctl_server_open error...");
}


fail_delete: fail_delete:
delete server_ptr->engine; delete server_ptr->engine;


+ 1
- 0
example-clients/midi_latency_test.c View File

@@ -187,6 +187,7 @@ destroy_semaphore(semaphore_t semaphore, int id)
{ {
char name[128]; char name[128];
sprintf(name, "midi_sem_%d", id); sprintf(name, "midi_sem_%d", id);
sem_close(semaphore);
sem_unlink(name); sem_unlink(name);
} }
#else #else


+ 1
- 1
macosx/coremidi/JackCoreMidiOutputPort.cpp View File

@@ -54,7 +54,7 @@ JackCoreMidiOutputPort::JackCoreMidiOutputPort(double time_ratio,
JackCoreMidiOutputPort::~JackCoreMidiOutputPort() JackCoreMidiOutputPort::~JackCoreMidiOutputPort()
{ {
delete thread; delete thread;
sem_destroy(thread_queue_semaphore);
sem_close(thread_queue_semaphore);
sem_unlink(semaphore_name); sem_unlink(semaphore_name);
delete read_queue; delete read_queue;
delete thread_queue; delete thread_queue;


Loading…
Cancel
Save