#include "comm.h"
 #include "symbol.h"
 #include "event.h"
+#include "util.h"
 #include "thread-stack.h"
 #include "db-export.h"
 
+struct deferred_export {
+       struct list_head node;
+       struct comm *comm;
+};
+
+static int db_export__deferred(struct db_export *dbe)
+{
+       struct deferred_export *de;
+       int err;
+
+       while (!list_empty(&dbe->deferred)) {
+               de = list_entry(dbe->deferred.next, struct deferred_export,
+                               node);
+               err = dbe->export_comm(dbe, de->comm);
+               list_del(&de->node);
+               free(de);
+               if (err)
+                       return err;
+       }
+
+       return 0;
+}
+
+static void db_export__free_deferred(struct db_export *dbe)
+{
+       struct deferred_export *de;
+
+       while (!list_empty(&dbe->deferred)) {
+               de = list_entry(dbe->deferred.next, struct deferred_export,
+                               node);
+               list_del(&de->node);
+               free(de);
+       }
+}
+
+static int db_export__defer_comm(struct db_export *dbe, struct comm *comm)
+{
+       struct deferred_export *de;
+
+       de = zalloc(sizeof(struct deferred_export));
+       if (!de)
+               return -ENOMEM;
+
+       de->comm = comm;
+       list_add_tail(&de->node, &dbe->deferred);
+
+       return 0;
+}
+
 int db_export__init(struct db_export *dbe)
 {
        memset(dbe, 0, sizeof(struct db_export));
+       INIT_LIST_HEAD(&dbe->deferred);
        return 0;
 }
 
+int db_export__flush(struct db_export *dbe)
+{
+       return db_export__deferred(dbe);
+}
+
 void db_export__exit(struct db_export *dbe)
 {
+       db_export__free_deferred(dbe);
        call_return_processor__free(dbe->crp);
        dbe->crp = NULL;
 }
        comm->db_id = ++dbe->comm_last_db_id;
 
        if (dbe->export_comm) {
-               err = dbe->export_comm(dbe, comm);
+               if (main_thread->comm_set)
+                       err = dbe->export_comm(dbe, comm);
+               else
+                       err = db_export__defer_comm(dbe, comm);
                if (err)
                        return err;
        }
 
 #define __PERF_DB_EXPORT_H
 
 #include <linux/types.h>
+#include <linux/list.h>
 
 struct perf_evsel;
 struct machine;
        u64 sample_last_db_id;
        u64 call_path_last_db_id;
        u64 call_return_last_db_id;
+       struct list_head deferred;
 };
 
 int db_export__init(struct db_export *dbe);
+int db_export__flush(struct db_export *dbe);
 void db_export__exit(struct db_export *dbe);
 int db_export__evsel(struct db_export *dbe, struct perf_evsel *evsel);
 int db_export__machine(struct db_export *dbe, struct machine *machine);