Index: src/graphics.h.in =================================================================== RCS file: /cvs/octave/src/graphics.h.in,v retrieving revision 1.48 diff -c -p -r1.48 graphics.h.in *** src/graphics.h.in 22 Jan 2008 19:42:48 -0000 1.48 --- src/graphics.h.in 23 Jan 2008 09:39:49 -0000 *************** public: *** 2625,2630 **** --- 2625,2642 ---- return instance_ok () ? instance->do_figure_handle_list () : Matrix (); } + static void lock (void) + { + if (instance_ok ()) + instance->do_lock (); + } + + static void unlock (void) + { + if (instance_ok ()) + instance->do_unlock (); + } + private: static gh_manager *instance; *************** private: *** 2708,2713 **** --- 2720,2729 ---- { return figure_list.empty () ? graphics_handle () : figure_list.front (); } + + void do_lock (void); + + void do_unlock (void); }; Index: src/graphics.cc =================================================================== RCS file: /cvs/octave/src/graphics.cc,v retrieving revision 1.78 diff -c -p -r1.78 graphics.cc *** src/graphics.cc 22 Jan 2008 20:32:00 -0000 1.78 --- src/graphics.cc 23 Jan 2008 09:39:49 -0000 *************** gh_manager::do_free (const graphics_hand *** 703,708 **** --- 703,742 ---- } } + #if defined (__WIN32__) && ! defined (__CYGWIN__) + CRITICAL_SECTION __go_lock__; + #else + pthread_mutex_t __go_lock__; + #endif + static bool __go_lock_initialized__ = false; + + void + gh_manager::do_lock (void) + { + #if defined (__WIN32__) && ! defined (__CYGWIN__) + if (! __go_lock_initialized__) + { + InitializeCriticalSection (&__go_lock__); + __go_lock_initialized__ = true; + } + + EnterCriticalSection (&__go_lock__); + #else + // FIXME: implement this + #endif + } + + void + gh_manager::do_unlock (void) + { + #if defined (__WIN32__) && ! defined (__CYGWIN__) + if (__go_lock_initialized__) + LeaveCriticalSection (&__go_lock__); + #else + // FIXME: implement this + #endif + } + gh_manager *gh_manager::instance = 0; static void *************** Return true if @var{h} is a graphics han *** 1912,1922 **** --- 1946,1960 ---- { octave_value retval; + gh_manager::lock (); + if (args.length () == 1) retval = is_handle (args(0)); else print_usage (); + gh_manager::unlock (); + return retval; } *************** for the graphics handle @var{h}.\n\ *** 1929,1934 **** --- 1967,1974 ---- { octave_value retval; + gh_manager::lock (); + int nargin = args.length (); if (nargin > 0) *************** for the graphics handle @var{h}.\n\ *** 1965,1970 **** --- 2005,2012 ---- else print_usage (); + gh_manager::unlock (); + return retval; } *************** values or lists respectively.\n\ *** 1980,1985 **** --- 2022,2029 ---- octave_value retval; octave_value_list vlist; + gh_manager::lock (); + int nargin = args.length (); if (nargin == 1 || nargin == 2) *************** values or lists respectively.\n\ *** 2036,2041 **** --- 2080,2087 ---- retval = vlist(0); } + gh_manager::unlock (); + return retval; } *************** values or lists respectively.\n\ *** 2050,2055 **** --- 2096,2103 ---- octave_value retval; octave_value_list vlist; + gh_manager::lock (); + int nargin = args.length (); if (nargin == 1) *************** values or lists respectively.\n\ *** 2091,2096 **** --- 2139,2146 ---- retval = vlist(0); } + gh_manager::unlock (); + return retval; } *************** Undocumented internal function.\n\ *** 2144,2149 **** --- 2194,2201 ---- { octave_value retval; + gh_manager::lock (); + if (args.length () > 0) { double val = args(0).double_value (); *************** Undocumented internal function.\n\ *** 2188,2204 **** --- 2240,2262 ---- else print_usage (); + gh_manager::unlock (); + return retval; } #define GO_BODY(TYPE) \ octave_value retval; \ \ + gh_manager::lock (); \ + \ if (args.length () > 0) \ retval = make_graphics_object (#TYPE, args); \ else \ print_usage (); \ \ + gh_manager::unlock (); \ + \ return retval DEFUN (__go_axes__, args, , *************** Undocumented internal function.\n\ *** 2263,2268 **** --- 2321,2328 ---- { octave_value_list retval; + gh_manager::lock (); + if (args.length () == 1) { graphics_handle h = octave_NaN; *************** Undocumented internal function.\n\ *** 2298,2303 **** --- 2358,2365 ---- else print_usage (); + gh_manager::unlock (); + return retval; } *************** Undocumented internal function.\n\ *** 2321,2326 **** --- 2383,2390 ---- return retval; } + gh_manager::lock (); + if (nargin == 1 || nargin == 2) { graphics_handle h = octave_NaN; *************** Undocumented internal function.\n\ *** 2346,2351 **** --- 2410,2417 ---- else print_usage (); + gh_manager::unlock (); + return retval; } *************** DEFUN (__go_handles__, , , *** 2355,2361 **** Undocumented internal function.\n\ @end deftypefn") { ! return octave_value (gh_manager::handle_list ()); } DEFUN (__go_figure_handles__, , , --- 2421,2435 ---- Undocumented internal function.\n\ @end deftypefn") { ! octave_value retval; ! ! gh_manager::lock (); ! ! retval = gh_manager::handle_list (); ! ! gh_manager::unlock (); ! ! return retval; } DEFUN (__go_figure_handles__, , , *************** DEFUN (__go_figure_handles__, , , *** 2364,2370 **** Undocumented internal function.\n\ @end deftypefn") { ! return octave_value (gh_manager::figure_handle_list ()); } static void --- 2438,2452 ---- Undocumented internal function.\n\ @end deftypefn") { ! octave_value retval; ! ! gh_manager::lock (); ! ! retval = gh_manager::figure_handle_list (); ! ! gh_manager::unlock (); ! ! return retval; } static void *************** Undocumented internal function.\n\ *** 2385,2390 **** --- 2467,2474 ---- octave_value retval; + gh_manager::lock (); + unwind_protect::begin_frame ("Fdrawnow"); unwind_protect::add (clear_drawnow_request); *************** Undocumented internal function.\n\ *** 2492,2497 **** --- 2576,2583 ---- unwind_protect::run_frame ("Fdrawnow"); + gh_manager::unlock (); + return retval; } *************** octave_value *** 2499,2504 **** --- 2585,2592 ---- get_property_from_handle (double handle, const std::string &property, const std::string &func) { + gh_manager::lock (); + graphics_object obj = gh_manager::get_object (handle); octave_value retval; *************** get_property_from_handle (double handle, *** 2510,2515 **** --- 2598,2605 ---- else error ("%s: invalid handle (= %g)", func.c_str(), handle); + gh_manager::unlock (); + return retval; } *************** bool *** 2517,2522 **** --- 2607,2614 ---- set_property_in_handle (double handle, const std::string &property, const octave_value &arg, const std::string &func) { + gh_manager::lock (); + graphics_object obj = gh_manager::get_object (handle); int ret = false; *************** set_property_in_handle (double handle, c *** 2530,2535 **** --- 2622,2629 ---- else error ("%s: invalid handle (= %g)", func.c_str(), handle); + gh_manager::unlock (); + return ret; }