Flush UST buffers after stop and wait quiescent
[lttng-tools.git] / lttng-sessiond / ust-app.c
index 377600f3d2f2347ce52765b43c5fbec19ceddff7..73dc770c9391f3fac295d6e16b58fcfefa195ac9 100644 (file)
@@ -163,6 +163,9 @@ void delete_ust_app_session(int sock, struct ust_app_session *ua_sess)
        ret = hashtable_destroy(ua_sess->channels);
        assert(!ret);
 
+       if (ua_sess->handle != -1) {
+               ustctl_release_handle(sock, ua_sess->handle);
+       }
        free(ua_sess);
 }
 
@@ -565,6 +568,8 @@ static int open_ust_metadata(struct ust_app *app,
                goto error;
        }
 
+       ua_sess->metadata->handle = ua_sess->metadata->obj->handle;
+
 error:
        return ret;
 }
@@ -1925,7 +1930,9 @@ error_rcu_unlock:
 int ust_app_stop_trace(struct ltt_ust_session *usess, struct ust_app *app)
 {
        int ret = 0;
+       struct cds_lfht_iter iter;
        struct ust_app_session *ua_sess;
+       struct ust_app_channel *ua_chan;
 
        DBG("Stopping tracing for ust app pid %d", app->key.pid);
 
@@ -1937,21 +1944,16 @@ int ust_app_stop_trace(struct ltt_ust_session *usess, struct ust_app *app)
                goto error_rcu_unlock;
        }
 
-#if 0  /* only useful when periodical flush will be supported */
-       /* need to keep a handle on shm in session for this. */
-       /* Flush all buffers before stopping */
-       ret = ustctl_flush_buffer(usess->sock, usess->metadata->obj);
-       if (ret < 0) {
-               ERR("UST metadata flush failed");
-       }
-
-       cds_list_for_each_entry(ustchan, &usess->channels.head, list) {
-               ret = ustctl_flush_buffer(usess->sock, ustchan->obj);
+       cds_lfht_for_each_entry(ua_sess->channels, &iter, ua_chan, node) {
+               ret = ustctl_sock_flush_buffer(app->key.sock, ua_chan->obj);
                if (ret < 0) {
-                       ERR("UST flush buffer error");
+                       ERR("UST app PID %d channel %s flush failed",
+                                       app->key.pid, ua_chan->name);
+                       ERR("Ended with ret %d", ret);
+                       /* Continuing flushing all buffers */
+                       continue;
                }
        }
-#endif
 
        /* This inhibits UST tracing */
        ret = ustctl_stop_session(app->key.sock, ua_sess->handle);
@@ -1965,6 +1967,13 @@ int ust_app_stop_trace(struct ltt_ust_session *usess, struct ust_app *app)
        /* Quiescent wait after stopping trace */
        ustctl_wait_quiescent(app->key.sock);
 
+       /* Flush all buffers before stopping */
+       ret = ustctl_sock_flush_buffer(app->key.sock, ua_sess->metadata->obj);
+       if (ret < 0) {
+               ERR("UST app PID %d metadata flush failed", app->key.pid);
+               ERR("Ended with ret %d", ret);
+       }
+
        return 0;
 
 error_rcu_unlock:
This page took 0.023737 seconds and 4 git commands to generate.