darktable-org / darktable-org/lua-scripts

help wanted: strange / unknown behaviour of gui.create_job

Open
#381 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Lua
Stars
219
Forks
142
PR merge metrics
No merged PRs in 30d

Description

I'm currently writing (or, trying to write 🙄) a lua script that will generate the preview cache for selected images (without leaving dt to start the external program...). Basically, it seems to work but I see two strange things that I don't understand right now.

First, the essential parts of my script:

local function stop_job( job )
  job.valid = false
end

local function create_previews()
  job = dt.gui.create_job( "generating previews", true, stop_job )
  local images = dt.gui.action_images
  for i,image in pairs(images) do
    if job.valid then
      image:generate_cache( true, 0, 8 )
      job.percent = i / #images
      dt.control.sleep( 1 ) -- without this, the job cannot be aborted
    else
      break
    end
  end
  if job.valid then -- without this, dt crashes with an exception in dt_pthread_mutex_destroy() after aborting the job
    job.valid = false
  end
end

the create_previews function will be called from a registered action.

My two questions:

  1. Without the sleep() I cannot stop the running job. After starting the job, the progress bar is shown and when I hit the 'X' nothing happens until the for loop processed all images. Then the stop_job() is called. With the sleep the stop_job is called after processing the current image and the job terminates as desired.

  2. When I set the job.valid to false after the loop it only works as long as the job is not terminated via the stop_job function. As this already sets the job to invalid I guess it is already destroyed and in the second job.valid=false dt crashes with an exception in dt_pthread_mutex_destroy.

Both phenomena are completely understandable, but: I see a lot of scripts that execute job.valid=false twice (when aborted) and seem to rely on stopping without a call to sleep(). Hmmm. What I'm missing here?

I hope you can clarify this,
thanks a lot!
Christian

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the shown registered action and reproduce dt.gui.create_job cancellation both with and without dt.control.sleep. Trace the job.valid lifecycle around stop_job and the final assignment, using the Lua API implementation or existing scripts mentioned by the issue. Done means the cancellation behavior and safe job-lifecycle usage are clarified or corrected without the reported crash.

Written by the indexing model from the issue text.

Assessment

Tech stack
lua
Domain
api
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.