]> git.neil.brown.name Git - edlib.git/commitdiff
editor: use event:on-idle to free marks.
authorNeilBrown <neil@brown.name>
Fri, 9 Jun 2023 03:21:27 +0000 (13:21 +1000)
committerNeilBrown <neil@brown.name>
Wed, 28 Jun 2023 07:51:40 +0000 (17:51 +1000)
Delayed-free of marks now happens with event:on-idle

Signed-off-by: NeilBrown <neil@brown.name>
core-editor.c

index a0270d723f735f1d5f523e0c116a8ea47d1c3913..4a9ecb4d9866af30366af8352b710303b4a4d642 100644 (file)
@@ -312,7 +312,7 @@ DEF_CMD(editor_free_panes)
        return 1;
 }
 
-DEF_CMD(editor_clean_up)
+DEF_CMD(editor_free_marks)
 {
        struct ed_info *ei = ci->home->data;
 
@@ -321,6 +321,14 @@ DEF_CMD(editor_clean_up)
                ei->mark_free_list = (struct mark*)m->all.next;
                __mark_free(m);
        }
+
+       return 1;
+}
+
+DEF_CMD(editor_clean_up)
+{
+       struct ed_info *ei = ci->home->data;
+
        while (ei->store) {
                struct store *s = ei->store;
                ei->store = s->next;
@@ -446,14 +454,16 @@ void editor_delayed_free(struct pane *ed safe, struct pane *p safe)
 
 void editor_delayed_mark_free(struct mark *m safe)
 {
-       struct pane *p = pane_root(m->owner);
-       struct ed_info *ei = p ? p->data : NULL;
+       struct pane *ed = pane_root(m->owner);
+       struct ed_info *ei = ed ? ed->data : NULL;
 
        if (!ei) {
                __mark_free(m);
                return;
        }
        ASSERT(ei->magic==ED_MAGIC);
+       if (!ei->mark_free_list)
+               call_comm("event:on-idle", ed, &editor_free_marks, 2);
        m->all.next = (void*)ei->mark_free_list;
        ei->mark_free_list = m;
 }