mirror of https://github.com/KLayout/klayout.git
Sync mode for tiling progress enhanced - with progress now.
This commit is contained in:
parent
f323c830d7
commit
7c4c928632
|
|
@ -327,11 +327,14 @@ public:
|
||||||
: tl::JobBase (nworkers),
|
: tl::JobBase (nworkers),
|
||||||
mp_proc (proc),
|
mp_proc (proc),
|
||||||
m_has_tiles (has_tiles),
|
m_has_tiles (has_tiles),
|
||||||
m_progress (0)
|
m_progress_count (0),
|
||||||
|
m_progress (std::string ())
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void start (const std::string &job_description);
|
||||||
|
|
||||||
bool has_tiles () const
|
bool has_tiles () const
|
||||||
{
|
{
|
||||||
return m_has_tiles;
|
return m_has_tiles;
|
||||||
|
|
@ -340,18 +343,18 @@ public:
|
||||||
void next_progress ()
|
void next_progress ()
|
||||||
{
|
{
|
||||||
tl::MutexLocker locker (&m_mutex);
|
tl::MutexLocker locker (&m_mutex);
|
||||||
++m_progress;
|
++m_progress_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_progress (tl::RelativeProgress &progress)
|
void update_progress ()
|
||||||
{
|
{
|
||||||
unsigned int p;
|
unsigned int p;
|
||||||
{
|
{
|
||||||
tl::MutexLocker locker (&m_mutex);
|
tl::MutexLocker locker (&m_mutex);
|
||||||
p = m_progress;
|
p = m_progress_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
progress.set (p, true /*force yield*/);
|
m_progress.set (p, true /*force yield*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
TilingProcessor *processor () const
|
TilingProcessor *processor () const
|
||||||
|
|
@ -361,11 +364,14 @@ public:
|
||||||
|
|
||||||
virtual tl::Worker *create_worker ();
|
virtual tl::Worker *create_worker ();
|
||||||
|
|
||||||
|
virtual void after_sync_task (tl::Task *task);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TilingProcessor *mp_proc;
|
TilingProcessor *mp_proc;
|
||||||
bool m_has_tiles;
|
bool m_has_tiles;
|
||||||
unsigned int m_progress;
|
unsigned int m_progress_count;
|
||||||
tl::Mutex m_mutex;
|
tl::Mutex m_mutex;
|
||||||
|
tl::RelativeProgress m_progress;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TilingProcessorTask
|
class TilingProcessorTask
|
||||||
|
|
@ -601,9 +607,25 @@ TilingProcessorJob::create_worker ()
|
||||||
return new TilingProcessorWorker (this);
|
return new TilingProcessorWorker (this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TilingProcessorJob::after_sync_task (tl::Task * /*task*/)
|
||||||
|
{
|
||||||
|
// This needs to be done here as there is no external loop to do this
|
||||||
|
update_progress ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TilingProcessorJob::start (const std::string &job_description)
|
||||||
|
{
|
||||||
|
m_progress = tl::RelativeProgress (job_description, tasks (), 1);
|
||||||
|
tl::JobBase::start ();
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
// The tiling processor implementation
|
// The tiling processor implementation
|
||||||
|
|
||||||
|
tl::Mutex TilingProcessor::s_output_lock;
|
||||||
|
|
||||||
TilingProcessor::TilingProcessor ()
|
TilingProcessor::TilingProcessor ()
|
||||||
: m_tile_width (0.0), m_tile_height (0.0),
|
: m_tile_width (0.0), m_tile_height (0.0),
|
||||||
m_ntiles_w (0), m_ntiles_h (0),
|
m_ntiles_w (0), m_ntiles_h (0),
|
||||||
|
|
@ -781,7 +803,7 @@ TilingProcessor::output (const std::string &name, db::Edges &edges)
|
||||||
tl::Variant
|
tl::Variant
|
||||||
TilingProcessor::receiver (const std::vector<tl::Variant> &args)
|
TilingProcessor::receiver (const std::vector<tl::Variant> &args)
|
||||||
{
|
{
|
||||||
tl::MutexLocker locker (&m_output_mutex);
|
tl::MutexLocker locker (&s_output_lock);
|
||||||
|
|
||||||
if (args.size () != 1) {
|
if (args.size () != 1) {
|
||||||
throw tl::Exception (tl::to_string (tr ("_rec function requires one argument: the handle of the output channel")));
|
throw tl::Exception (tl::to_string (tr ("_rec function requires one argument: the handle of the output channel")));
|
||||||
|
|
@ -803,7 +825,7 @@ TilingProcessor::receiver (const std::vector<tl::Variant> &args)
|
||||||
void
|
void
|
||||||
TilingProcessor::put (size_t ix, size_t iy, const db::Box &tile, const std::vector<tl::Variant> &args)
|
TilingProcessor::put (size_t ix, size_t iy, const db::Box &tile, const std::vector<tl::Variant> &args)
|
||||||
{
|
{
|
||||||
tl::MutexLocker locker (&m_output_mutex);
|
tl::MutexLocker locker (&s_output_lock);
|
||||||
|
|
||||||
if (args.size () < 2 || args.size () > 3) {
|
if (args.size () < 2 || args.size () > 3) {
|
||||||
throw tl::Exception (tl::to_string (tr ("_output function requires two or three arguments: handle and object and a clip flag (optional)")));
|
throw tl::Exception (tl::to_string (tr ("_output function requires two or three arguments: handle and object and a clip flag (optional)")));
|
||||||
|
|
@ -930,11 +952,6 @@ TilingProcessor::execute (const std::string &desc)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: there should be a general scheme of how thread-specific progress is merged
|
|
||||||
// into a global one ..
|
|
||||||
size_t todo_count = ntiles_w * ntiles_h * m_scripts.size ();
|
|
||||||
tl::RelativeProgress progress (desc, todo_count, 1);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
@ -946,10 +963,10 @@ TilingProcessor::execute (const std::string &desc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
job.start ();
|
job.start (desc);
|
||||||
while (job.is_running ()) {
|
while (job.is_running ()) {
|
||||||
// This may throw an exception, if the cancel button has been pressed.
|
// This may throw an exception, if the cancel button has been pressed.
|
||||||
job.update_progress (progress);
|
job.update_progress ();
|
||||||
job.wait (100);
|
job.wait (100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -644,6 +644,14 @@ public:
|
||||||
*/
|
*/
|
||||||
void execute (const std::string &desc);
|
void execute (const std::string &desc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the output mutex for operations not using the output method
|
||||||
|
*/
|
||||||
|
static tl::Mutex &output_lock ()
|
||||||
|
{
|
||||||
|
return s_output_lock;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class TilingProcessorWorker;
|
friend class TilingProcessorWorker;
|
||||||
friend class TilingProcessorOutputFunction;
|
friend class TilingProcessorOutputFunction;
|
||||||
|
|
@ -689,8 +697,8 @@ private:
|
||||||
bool m_dbu_specific_set;
|
bool m_dbu_specific_set;
|
||||||
bool m_scale_to_dbu;
|
bool m_scale_to_dbu;
|
||||||
std::vector<std::string> m_scripts;
|
std::vector<std::string> m_scripts;
|
||||||
tl::Mutex m_output_mutex;
|
|
||||||
tl::Eval m_top_eval;
|
tl::Eval m_top_eval;
|
||||||
|
static tl::Mutex s_output_lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue