In theory, once the destroy stream ht function is called with the hash
table, it should be empty. However, for some fatal errors, it might not
so it's imperative that we gracefully delete the stream and free it
using an RCU call so both hash tables (stream and the one for the
pending command) are synchronized.
Simply freeing the stream could have created possible fd leaks and
invalid node for the data pending hash table.
Signed-off-by: David Goulet <dgoulet@efficios.com>
int ret;
struct lttng_ht_iter iter;
int ret;
struct lttng_ht_iter iter;
+ DBG("Consumer delete channel key %d", channel->key);
+
pthread_mutex_lock(&consumer_data.lock);
switch (consumer_data.type) {
pthread_mutex_lock(&consumer_data.lock);
switch (consumer_data.type) {
*/
static void destroy_data_stream_ht(struct lttng_ht *ht)
{
*/
static void destroy_data_stream_ht(struct lttng_ht *ht)
{
struct lttng_ht_iter iter;
struct lttng_consumer_stream *stream;
struct lttng_ht_iter iter;
struct lttng_consumer_stream *stream;
rcu_read_lock();
cds_lfht_for_each_entry(ht->ht, &iter.iter, stream, node.node) {
rcu_read_lock();
cds_lfht_for_each_entry(ht->ht, &iter.iter, stream, node.node) {
- ret = lttng_ht_del(ht, &iter);
- assert(!ret);
-
- call_rcu(&stream->node.head, consumer_free_stream);
+ /*
+ * Ignore return value since we are currently cleaning up so any error
+ * can't be handled.
+ */
+ (void) consumer_del_stream(stream, ht);
*/
static void destroy_stream_ht(struct lttng_ht *ht)
{
*/
static void destroy_stream_ht(struct lttng_ht *ht)
{
struct lttng_ht_iter iter;
struct lttng_consumer_stream *stream;
struct lttng_ht_iter iter;
struct lttng_consumer_stream *stream;
rcu_read_lock();
cds_lfht_for_each_entry(ht->ht, &iter.iter, stream, node.node) {
rcu_read_lock();
cds_lfht_for_each_entry(ht->ht, &iter.iter, stream, node.node) {
- ret = lttng_ht_del(ht, &iter);
- assert(!ret);
-
- call_rcu(&stream->node.head, consumer_free_stream);
+ /*
+ * Ignore return value since we are currently cleaning up so any error
+ * can't be handled.
+ */
+ (void) consumer_del_metadata_stream(stream, ht);