projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: RCU read-side lock released too early in destroy_agent_app
[lttng-tools.git]
/
src
/
bin
/
lttng-sessiond
/
agent.c
diff --git
a/src/bin/lttng-sessiond/agent.c
b/src/bin/lttng-sessiond/agent.c
index dbeec9dabf5a387a1a78fefd25c866cc61ee1b80..1eb64c25e32b937282bd5f1b45c7442d3909b188 100644
(file)
--- a/
src/bin/lttng-sessiond/agent.c
+++ b/
src/bin/lttng-sessiond/agent.c
@@
-16,6
+16,7
@@
*/
#define _GNU_SOURCE
*/
#define _GNU_SOURCE
+#define _LGPL_SOURCE
#include <assert.h>
#include <urcu/uatomic.h>
#include <assert.h>
#include <urcu/uatomic.h>
@@
-528,7
+529,8
@@
error:
*
* Return the number of events or else a negative value.
*/
*
* Return the number of events or else a negative value.
*/
-int agent_list_events(struct lttng_event **events)
+int agent_list_events(struct lttng_event **events,
+ enum lttng_domain_type domain)
{
int ret;
size_t nbmem, count = 0;
{
int ret;
size_t nbmem, count = 0;
@@
-538,6
+540,8
@@
int agent_list_events(struct lttng_event **events)
assert(events);
assert(events);
+ DBG2("Agent listing events for domain %d", domain);
+
nbmem = UST_APP_EVENT_LIST_SIZE;
tmp_events = zmalloc(nbmem * sizeof(*tmp_events));
if (!tmp_events) {
nbmem = UST_APP_EVENT_LIST_SIZE;
tmp_events = zmalloc(nbmem * sizeof(*tmp_events));
if (!tmp_events) {
@@
-552,6
+556,11
@@
int agent_list_events(struct lttng_event **events)
ssize_t nb_ev;
struct lttng_event *agent_events;
ssize_t nb_ev;
struct lttng_event *agent_events;
+ /* Skip domain not asked by the list. */
+ if (app->domain != domain) {
+ continue;
+ }
+
nb_ev = list_events(app, &agent_events);
if (nb_ev < 0) {
ret = nb_ev;
nb_ev = list_events(app, &agent_events);
if (nb_ev < 0) {
ret = nb_ev;
@@
-671,6
+680,8
@@
void agent_add_app(struct agent_app *app)
/*
* Delete agent application from the global hash table.
/*
* Delete agent application from the global hash table.
+ *
+ * rcu_read_lock() must be held by the caller.
*/
void agent_delete_app(struct agent_app *app)
{
*/
void agent_delete_app(struct agent_app *app)
{
@@
-682,9
+693,7
@@
void agent_delete_app(struct agent_app *app)
DBG3("Agent deleting app pid: %d and sock: %d", app->pid, app->sock->fd);
iter.iter.node = &app->node.node;
DBG3("Agent deleting app pid: %d and sock: %d", app->pid, app->sock->fd);
iter.iter.node = &app->node.node;
- rcu_read_lock();
ret = lttng_ht_del(agent_apps_ht_by_sock, &iter);
ret = lttng_ht_del(agent_apps_ht_by_sock, &iter);
- rcu_read_unlock();
assert(!ret);
}
assert(!ret);
}
@@
-763,6
+772,7
@@
struct agent *agent_create(enum lttng_domain_type domain)
ret = agent_init(agt);
if (ret < 0) {
free(agt);
ret = agent_init(agt);
if (ret < 0) {
free(agt);
+ agt = NULL;
goto error;
}
goto error;
}
@@
-890,7
+900,7
@@
struct agent_event *agent_find_event(const char *name, int loglevel,
return caa_container_of(node, struct agent_event, node);
error:
return caa_container_of(node, struct agent_event, node);
error:
- DBG3("Agent NOT found %s.", name);
+ DBG3("Agent
event
NOT found %s.", name);
return NULL;
}
return NULL;
}
@@
-903,6
+913,7
@@
void agent_destroy_event(struct agent_event *event)
{
assert(event);
{
assert(event);
+ free(event->filter);
free(event);
}
free(event);
}
@@
-946,7
+957,7
@@
void agent_destroy(struct agent *agt)
}
rcu_read_unlock();
}
rcu_read_unlock();
-
lttng_ht_destroy
(agt->events);
+
ht_cleanup_push
(agt->events);
}
/*
}
/*
This page took
0.025533 seconds
and
4
git commands to generate.