projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: run_command_wait() handle partial write
[lttng-tools.git]
/
src
/
bin
/
lttng-sessiond
/
channel.c
diff --git
a/src/bin/lttng-sessiond/channel.c
b/src/bin/lttng-sessiond/channel.c
index 88480c4b4e7b78fd63a2edc744618eadba0c36bc..f19dbec37f51697209c0ae1d678a1af7768e8533 100644
(file)
--- a/
src/bin/lttng-sessiond/channel.c
+++ b/
src/bin/lttng-sessiond/channel.c
@@
-41,6
+41,7
@@
struct lttng_channel *channel_new_default_attr(int dom,
{
struct lttng_channel *chan;
const char *channel_name = DEFAULT_CHANNEL_NAME;
{
struct lttng_channel *chan;
const char *channel_name = DEFAULT_CHANNEL_NAME;
+ struct lttng_channel_extended *extended_attr = NULL;
chan = zmalloc(sizeof(struct lttng_channel));
if (chan == NULL) {
chan = zmalloc(sizeof(struct lttng_channel));
if (chan == NULL) {
@@
-48,6
+49,14
@@
struct lttng_channel *channel_new_default_attr(int dom,
goto error_alloc;
}
goto error_alloc;
}
+ extended_attr = zmalloc(sizeof(struct lttng_channel_extended));
+ if (!extended_attr) {
+ PERROR("zmalloc channel extended init");
+ goto error;
+ }
+
+ chan->attr.extended.ptr = extended_attr;
+
/* Same for all domains. */
chan->attr.overwrite = DEFAULT_CHANNEL_OVERWRITE;
chan->attr.tracefile_size = DEFAULT_CHANNEL_TRACEFILE_SIZE;
/* Same for all domains. */
chan->attr.overwrite = DEFAULT_CHANNEL_OVERWRITE;
chan->attr.tracefile_size = DEFAULT_CHANNEL_TRACEFILE_SIZE;
@@
-63,6
+72,9
@@
struct lttng_channel *channel_new_default_attr(int dom,
chan->attr.switch_timer_interval = DEFAULT_KERNEL_CHANNEL_SWITCH_TIMER;
chan->attr.read_timer_interval = DEFAULT_KERNEL_CHANNEL_READ_TIMER;
chan->attr.live_timer_interval = DEFAULT_KERNEL_CHANNEL_LIVE_TIMER;
chan->attr.switch_timer_interval = DEFAULT_KERNEL_CHANNEL_SWITCH_TIMER;
chan->attr.read_timer_interval = DEFAULT_KERNEL_CHANNEL_READ_TIMER;
chan->attr.live_timer_interval = DEFAULT_KERNEL_CHANNEL_LIVE_TIMER;
+ extended_attr->blocking_timeout = DEFAULT_KERNEL_CHANNEL_BLOCKING_TIMEOUT;
+ extended_attr->monitor_timer_interval =
+ DEFAULT_KERNEL_CHANNEL_MONITOR_TIMER;
break;
case LTTNG_DOMAIN_JUL:
channel_name = DEFAULT_JUL_CHANNEL_NAME;
break;
case LTTNG_DOMAIN_JUL:
channel_name = DEFAULT_JUL_CHANNEL_NAME;
@@
-86,6
+98,9
@@
common_ust:
DEFAULT_UST_UID_CHANNEL_READ_TIMER;
chan->attr.live_timer_interval =
DEFAULT_UST_UID_CHANNEL_LIVE_TIMER;
DEFAULT_UST_UID_CHANNEL_READ_TIMER;
chan->attr.live_timer_interval =
DEFAULT_UST_UID_CHANNEL_LIVE_TIMER;
+ extended_attr->blocking_timeout = DEFAULT_UST_UID_CHANNEL_BLOCKING_TIMEOUT;
+ extended_attr->monitor_timer_interval =
+ DEFAULT_UST_UID_CHANNEL_MONITOR_TIMER;
break;
case LTTNG_BUFFER_PER_PID:
default:
break;
case LTTNG_BUFFER_PER_PID:
default:
@@
-97,7
+112,10
@@
common_ust:
chan->attr.read_timer_interval =
DEFAULT_UST_PID_CHANNEL_READ_TIMER;
chan->attr.live_timer_interval =
chan->attr.read_timer_interval =
DEFAULT_UST_PID_CHANNEL_READ_TIMER;
chan->attr.live_timer_interval =
- DEFAULT_UST_UID_CHANNEL_LIVE_TIMER;
+ DEFAULT_UST_PID_CHANNEL_LIVE_TIMER;
+ extended_attr->blocking_timeout = DEFAULT_UST_PID_CHANNEL_BLOCKING_TIMEOUT;
+ extended_attr->monitor_timer_interval =
+ DEFAULT_UST_PID_CHANNEL_MONITOR_TIMER;
break;
}
break;
break;
}
break;
@@
-113,11
+131,21
@@
common_ust:
return chan;
error:
return chan;
error:
+ free(extended_attr);
free(chan);
error_alloc:
return NULL;
}
free(chan);
error_alloc:
return NULL;
}
+void channel_attr_destroy(struct lttng_channel *channel)
+{
+ if (!channel) {
+ return;
+ }
+ free(channel->attr.extended.ptr);
+ free(channel);
+}
+
/*
* Disable kernel channel of the kernel session.
*/
/*
* Disable kernel channel of the kernel session.
*/
@@
-192,6
+220,15
@@
static int channel_validate(struct lttng_channel *attr)
return 0;
}
return 0;
}
+static int channel_validate_kernel(struct lttng_channel *attr)
+{
+ /* Kernel channels do not support blocking timeout. */
+ if (((struct lttng_channel_extended *)attr->attr.extended.ptr)->blocking_timeout) {
+ return -1;
+ }
+ return 0;
+}
+
/*
* Create kernel channel of the kernel session and notify kernel thread.
*/
/*
* Create kernel channel of the kernel session and notify kernel thread.
*/
@@
-233,6
+270,11
@@
int channel_kernel_create(struct ltt_kernel_session *ksession,
goto error;
}
goto error;
}
+ if (channel_validate_kernel(attr) < 0) {
+ ret = LTTNG_ERR_INVALID;
+ goto error;
+ }
+
/* Channel not found, creating it */
ret = kernel_create_channel(ksession, attr);
if (ret < 0) {
/* Channel not found, creating it */
ret = kernel_create_channel(ksession, attr);
if (ret < 0) {
@@
-249,7
+291,7
@@
int channel_kernel_create(struct ltt_kernel_session *ksession,
ret = LTTNG_OK;
error:
ret = LTTNG_OK;
error:
-
free
(defattr);
+
channel_attr_destroy
(defattr);
return ret;
}
return ret;
}
@@
-300,6
+342,7
@@
int channel_ust_create(struct ltt_ust_session *usess,
struct ltt_ust_channel *uchan = NULL;
struct lttng_channel *defattr = NULL;
enum lttng_domain_type domain = LTTNG_DOMAIN_UST;
struct ltt_ust_channel *uchan = NULL;
struct lttng_channel *defattr = NULL;
enum lttng_domain_type domain = LTTNG_DOMAIN_UST;
+ bool chan_published = false;
assert(usess);
assert(usess);
@@
-434,6
+477,7
@@
int channel_ust_create(struct ltt_ust_session *usess,
if (strncmp(uchan->name, DEFAULT_METADATA_NAME,
sizeof(uchan->name))) {
lttng_ht_add_unique_str(usess->domain_global.channels, &uchan->node);
if (strncmp(uchan->name, DEFAULT_METADATA_NAME,
sizeof(uchan->name))) {
lttng_ht_add_unique_str(usess->domain_global.channels, &uchan->node);
+ chan_published = true;
} else {
/*
* Copy channel attribute to session if this is metadata so if NO
} else {
/*
* Copy channel attribute to session if this is metadata so if NO
@@
-453,23
+497,23
@@
int channel_ust_create(struct ltt_ust_session *usess,
agt = agent_create(domain);
if (!agt) {
ret = LTTNG_ERR_NOMEM;
agt = agent_create(domain);
if (!agt) {
ret = LTTNG_ERR_NOMEM;
- goto error_
fre
e_chan;
+ goto error_
remov
e_chan;
}
agent_add(agt, usess->agents);
}
}
}
agent_add(agt, usess->agents);
}
}
-
free
(defattr);
+
channel_attr_destroy
(defattr);
return LTTNG_OK;
return LTTNG_OK;
+error_remove_chan:
+ if (chan_published) {
+ trace_ust_delete_channel(usess->domain_global.channels, uchan);
+ }
error_free_chan:
error_free_chan:
- /*
- * No need to remove the channel from the hash table because at this point
- * it was not added hence the direct call and no call_rcu().
- */
trace_ust_destroy_channel(uchan);
error:
trace_ust_destroy_channel(uchan);
error:
-
free
(defattr);
+
channel_attr_destroy
(defattr);
return ret;
}
return ret;
}
This page took
0.026267 seconds
and
4
git commands to generate.