lkc->fd = 0;
lkc->stream_count = 0;
+ lkc->event_count = 0;
lkc->enabled = 1;
lkc->ctx = NULL;
/* Init linked list */
ev->attr.probe.symbol_name, LTTNG_SYM_NAME_LEN);
break;
case LTTNG_EVENT_FUNCTION:
+ attr->instrumentation = LTTNG_KERNEL_KRETPROBE;
+ attr->u.kretprobe.addr = ev->attr.probe.addr;
+ attr->u.kretprobe.offset = ev->attr.probe.offset;
+ attr->u.kretprobe.offset = ev->attr.probe.offset;
+ strncpy(attr->u.kretprobe.symbol_name,
+ ev->attr.probe.symbol_name, LTTNG_SYM_NAME_LEN);
+ break;
+ case LTTNG_EVENT_FUNCTION_ENTRY:
attr->instrumentation = LTTNG_KERNEL_FUNCTION;
strncpy(attr->u.ftrace.symbol_name,
ev->attr.ftrace.symbol_name, LTTNG_SYM_NAME_LEN);
void trace_destroy_kernel_channel(struct ltt_kernel_channel *channel)
{
- struct ltt_kernel_stream *stream;
- struct ltt_kernel_event *event;
+ struct ltt_kernel_stream *stream, *stmp;
+ struct ltt_kernel_event *event, *etmp;
DBG("[trace] Closing channel fd %d", channel->fd);
/* Close kernel fd */
free(channel->channel);
/* For each stream in the channel list */
- cds_list_for_each_entry(stream, &channel->stream_list.head, list) {
+ cds_list_for_each_entry_safe(stream, stmp, &channel->stream_list.head, list) {
trace_destroy_kernel_stream(stream);
}
/* For each event in the channel list */
- cds_list_for_each_entry(event, &channel->events_list.head, list) {
+ cds_list_for_each_entry_safe(event, etmp, &channel->events_list.head, list) {
trace_destroy_kernel_event(event);
}
void trace_destroy_kernel_session(struct ltt_kernel_session *session)
{
- struct ltt_kernel_channel *channel;
+ struct ltt_kernel_channel *channel, *ctmp;
DBG("[trace] Closing session fd %d", session->fd);
/* Close kernel fds */
trace_destroy_kernel_metadata(session->metadata);
}
- cds_list_for_each_entry(channel, &session->channel_list.head, list) {
+ cds_list_for_each_entry_safe(channel, ctmp, &session->channel_list.head, list) {
trace_destroy_kernel_channel(channel);
}