diff liboctave/cmd-edit.cc @ 7936:78400fde223e

Support for backend-to-octave event management
author John W. Eaton <jwe@octave.org>
date Thu, 17 Jul 2008 07:58:50 -0400
parents 8e14a01ffe9f
children 0ef13e15319b
line wrap: on
line diff
--- a/liboctave/cmd-edit.cc
+++ b/liboctave/cmd-edit.cc
@@ -45,6 +45,7 @@
 #include "lo-error.h"
 #include "lo-utils.h"
 #include "oct-env.h"
+#include "oct-mutex.h"
 #include "oct-time.h"
 
 command_editor *command_editor::instance = 0;
@@ -53,6 +54,8 @@
 
 std::set<command_editor::event_hook_fcn> command_editor::event_hook_set;
 
+static octave_mutex event_hook_lock;
+
 #if defined (USE_READLINE)
 
 #include <cstdio>
@@ -852,8 +855,14 @@
 int
 command_editor::event_handler (void)
 {
-  for (event_hook_set_iterator p = event_hook_set.begin ();
-       p != event_hook_set.end (); p++)
+  event_hook_lock.lock ();
+
+  std::set<event_hook_fcn> hook_set (event_hook_set);
+
+  event_hook_lock.unlock ();
+
+  for (event_hook_set_iterator p = hook_set.begin ();
+       p != hook_set.end (); p++)
     {
       event_hook_fcn f = *p;
 
@@ -1160,6 +1169,8 @@
 void
 command_editor::add_event_hook (event_hook_fcn f)
 {
+  octave_autolock guard (event_hook_lock);
+
   if (instance_ok ())
     {
       event_hook_set.insert (f);
@@ -1171,6 +1182,8 @@
 void
 command_editor::remove_event_hook (event_hook_fcn f)
 {
+  octave_autolock guard (event_hook_lock);
+
   if (instance_ok ())
     {
       event_hook_set_iterator p = event_hook_set.find (f);