std::list< etl::handle< studio::Module > > module_list_;
bool studio::App::use_colorspace_gamma=true;
+bool studio::App::single_threaded=true;
static int max_recent_files_=25;
int studio::App::get_max_recent_files() { return max_recent_files_; }
value=strprintf("%s",Distance::system_name(App::distance_system).c_str());
return true;
}
+ if(key=="single_threaded")
+ {
+ value=strprintf("%i",(int)App::single_threaded);
+ return true;
+ }
if(key=="auto_recover_backup_interval")
{
value=strprintf("%i",App::auto_recover->get_timeout());
App::distance_system=Distance::ident_system(value);;
return true;
}
+ if(key=="single_threaded")
+ {
+ int i(atoi(value.c_str()));
+ App::single_threaded=i;
+ return true;
+ }
return synfigapp::Settings::set_value(key,value);
}
ret.push_back("distance_system");
ret.push_back("file_history.size");
ret.push_back("use_colorspace_gamma");
+ ret.push_back("single_threaded");
ret.push_back("auto_recover_backup_interval");
return ret;
}
synfigapp::Main::settings().set_value("dock.dialog.2.size","1045 235");
synfigapp::Main::settings().set_value("pref.distance_system","pt");
synfigapp::Main::settings().set_value("pref.use_colorspace_gamma","1");
+ synfigapp::Main::settings().set_value("pref.single_threaded","0");
synfigapp::Main::settings().set_value("window.toolbox.pos","4 4");
}
}
};
std::list<tile_t> tile_queue;
-#ifndef SINGLE_THREADED
Glib::Mutex mutex;
-#endif // SINGLE_THREADED
#ifndef GLIB_DISPATCHER_BROKEN
Glib::Dispatcher tile_ready_signal;
}
void set_dead()
{
-#ifndef SINGLE_THREADED
- Glib::Mutex::Lock lock(mutex);
-#endif // SINGLE_THREADED
+ Glib::Mutex::Lock lock(mutex, NotLock);
+ if (!single_threaded()) lock.acquire();
alive_flag=false;
}
assert(surface);
if(!alive_flag)
return false;
-#ifndef SINGLE_THREADED
- Glib::Mutex::Lock lock(mutex);
-#endif // SINGLE_THREADED
+ Glib::Mutex::Lock lock(mutex, NotLock);
+ if (!single_threaded()) lock.acquire();
tile_queue.push_back(tile_t(surface,gx,gy));
if(tile_queue.size()==1)
{
void tile_ready()
{
-#ifndef SINGLE_THREADED
- Glib::Mutex::Lock lock(mutex);
-#endif // SINGLE_THREADED
+ Glib::Mutex::Lock lock(mutex, NotLock);
+ if (!single_threaded()) lock.acquire();
if(!alive_flag)
{
tile_queue.clear();
virtual void end_frame()
{
-#ifndef SINGLE_THREADED
- while(alive_flag)
+ if (!single_threaded())
{
- Glib::Mutex::Lock lock(mutex);
- if(!tile_queue.empty() && alive_flag)
+ while(alive_flag)
{
- if(cond_tile_queue_empty.timed_wait(mutex,Glib::TimeVal(0,BOREDOM_TIMEOUT)))
+ Glib::Mutex::Lock lock(mutex);
+ if(!tile_queue.empty() && alive_flag)
+ {
+ if(cond_tile_queue_empty.timed_wait(mutex,Glib::TimeVal(0,BOREDOM_TIMEOUT)))
+ break;
+ }
+ else
break;
}
- else
- break;
}
- Glib::Mutex::Lock lock(mutex);
-#endif // SINGLE_THREADED
+ Glib::Mutex::Lock lock(mutex, NotLock);
+ if (!single_threaded()) lock.acquire();
if(!alive_flag)
return;
return warm_target->end_frame();
int scanline_;
Surface surface;
-#ifndef SINGLE_THREADED
Glib::Mutex mutex;
-#endif // SINGLE_THREADED
#ifndef GLIB_DISPATCHER_BROKEN
Glib::Dispatcher frame_ready_signal;
void set_dead()
{
-#ifndef SINGLE_THREADED
- Glib::Mutex::Lock lock(mutex);
-#endif // SINGLE_THREADED
+ Glib::Mutex::Lock lock(mutex, NotLock);
+ if (!single_threaded()) lock.acquire();
alive_flag=false;
}
virtual void end_frame()
{
{
-#ifndef SINGLE_THREADED
- Glib::Mutex::Lock lock(mutex);
-#endif // SINGLE_THREADED
+ Glib::Mutex::Lock lock(mutex, NotLock);
+ if (!single_threaded()) lock.acquire();
if(!alive_flag)
return;
#else
frame_ready_signal();
#endif
- }
-
-#ifndef SINGLE_THREADED
- while(alive_flag && !ready_next)
- {
- Glib::Mutex::Lock lock(mutex);
- if(cond_frame_queue_empty.timed_wait(mutex,Glib::TimeVal(0,BOREDOM_TIMEOUT)))
- break;
}
-#endif // SINGLE_THREADED
+
+ if (!single_threaded())
+ while(alive_flag && !ready_next)
+ {
+ Glib::Mutex::Lock lock(mutex);
+ if(cond_frame_queue_empty.timed_wait(mutex,Glib::TimeVal(0,BOREDOM_TIMEOUT)))
+ break;
+ }
}
virtual Color * start_scanline(int scanline)
{
-#ifndef SINGLE_THREADED
- Glib::Mutex::Lock lock(mutex);
-#endif // SINGLE_THREADED
+ Glib::Mutex::Lock lock(mutex, NotLock);
+ if (!single_threaded()) lock.acquire();
return surface[scanline];
}
void frame_ready()
{
-#ifndef SINGLE_THREADED
- Glib::Mutex::Lock lock(mutex);
-#endif // SINGLE_THREADED
+ Glib::Mutex::Lock lock(mutex, NotLock);
+ if (!single_threaded()) lock.acquire();
if(alive_flag)
alive_flag=warm_target->add_frame(&surface);
- cond_frame_queue_empty.signal();
+ if (!single_threaded()) cond_frame_queue_empty.signal();
ready_next=true;
}
};
AsyncRenderer::AsyncRenderer(etl::handle<synfig::Target> target_,synfig::ProgressCallback *cb):
error(false),
success(false),
- cb(cb)
-#ifdef SINGLE_THREADED
- , updating(false)
-#endif // SINGLE_THREADED
+ cb(cb),
+ updating(false)
{
render_thread=0;
if(etl::handle<synfig::Target_Tile>::cast_dynamic(target_))
{
if(target)
{
-#ifndef SINGLE_THREADED
- Glib::Mutex::Lock lock(mutex);
-#endif // SINGLE_THREADED
+ Glib::Mutex::Lock lock(mutex, NotLock);
+ if (!single_threaded()) lock.acquire();
done_connection.disconnect();
if(render_thread)
{
signal_stop_();
-#ifndef SINGLE_THREADED
#if REJOIN_ON_STOP
- render_thread->join();
-#endif
+ if (!single_threaded()) render_thread->join();
#endif
// Make sure all the dispatch crap is cleared out
);
}
-#ifdef SINGLE_THREADED
void
AsyncRenderer::rendering_progress()
{
while(studio::App::events_pending()) studio::App::iteration(false);
updating = false;
}
-#endif // SINGLE_THREADED
void
AsyncRenderer::start_()
done_connection=signal_done_.connect(mem_fun(*this,&AsyncRenderer::stop));
#endif
-#ifdef SINGLE_THREADED
- synfig::info("%s:%d rendering in the same thread", __FILE__, __LINE__);
- target->signal_progress().connect(sigc::mem_fun(this,&AsyncRenderer::rendering_progress));
- render_thread = (Glib::Thread*)1;
- render_target();
-#else // SINGLE_THREADED
- render_thread=Glib::Thread::create(
- sigc::mem_fun(*this,&AsyncRenderer::render_target),
+ if (single_threaded())
+ {
+ synfig::info("%s:%d rendering in the same thread", __FILE__, __LINE__);
+ target->signal_progress().connect(sigc::mem_fun(this,&AsyncRenderer::rendering_progress));
+ render_thread = (Glib::Thread*)1;
+ render_target();
+ }
+ else
+ {
+ render_thread=Glib::Thread::create(
+ sigc::mem_fun(*this,&AsyncRenderer::render_target),
#if REJOIN_ON_STOP
- true
+ true
#else
- false
+ false
#endif
- );
- assert(render_thread);
-#endif // SINGLE_THREADED
+ );
+ assert(render_thread);
+ }
}
else
{
#endif
}
-#ifndef SINGLE_THREADED
- if(mutex.trylock())
-#endif // SINGLE_THREADED
+ if (single_threaded() || mutex.trylock())
{
#ifdef GLIB_DISPATCHER_BROKEN
done_connection=Glib::signal_timeout().connect(
#else
signal_done_.emit();
#endif
-#ifndef SINGLE_THREADED
- mutex.unlock();
-#endif // SINGLE_THREADED
+ if (!single_threaded()) mutex.unlock();
}
}
adj_gamma_b(2.2,0.1,3.0,0.025,0.025,0.025),
adj_recent_files(15,1,50,1,1,1),
adj_undo_depth(100,10,5000,1,1,1),
- toggle_use_colorspace_gamma(_("Visually Linear Color Selection"))
+ toggle_use_colorspace_gamma(_("Visually Linear Color Selection")),
+ toggle_single_threaded(_("Use Only a Single Thread"))
{
// Setup the buttons
// Misc - use_colorspace_gamma
misc_table->attach(toggle_use_colorspace_gamma, 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
+ // Misc - single_threaded
+ misc_table->attach(toggle_single_threaded, 0, 2, 4, 5, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
+
show_all_children();
}
// Set the use_colorspace_gamma flag
App::use_colorspace_gamma=toggle_use_colorspace_gamma.get_active();
+ // Set the single_threaded flag
+ App::single_threaded=toggle_single_threaded.get_active();
+
App::distance_system=Distance::System(widget_enum->get_value());
App::save_settings();
// Refresh the status of the use_colorspace_gamma flag
toggle_use_colorspace_gamma.set_active(App::use_colorspace_gamma);
+
+ // Refresh the status of the single_threaded flag
+ toggle_single_threaded.set_active(App::single_threaded);
}
GammaPattern::GammaPattern():