[Bf-blender-cvs] [6329fee2977] asset-browser: Don't run thread-unsafe file-list reading in threads
Julian Eisel
noreply at git.blender.org
Thu Dec 10 20:30:49 CET 2020
Commit: 6329fee297718e6a421ae628025150c09ded45f3
Author: Julian Eisel
Date: Thu Dec 10 18:23:23 2020 +0100
Branches: asset-browser
https://developer.blender.org/rB6329fee297718e6a421ae628025150c09ded45f3
Don't run thread-unsafe file-list reading in threads
===================================================================
M source/blender/editors/space_file/filelist.c
===================================================================
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index c694fe29078..9a51864967e 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -432,7 +432,10 @@ enum {
/* FileList.type_flags */
enum FileListTypeFlags {
+ /** The file list has references to main data (IDs) and needs special care. */
FL_USES_MAIN_DATA = (1 << 0),
+ /** The file list type is not thread-safe. */
+ FL_NO_THREADS = (1 << 2),
};
#define SPECIAL_IMG_SIZE 256
@@ -1735,11 +1738,10 @@ void filelist_settype(FileList *filelist, short type)
filelist->filterf = is_filtered_lib;
break;
case FILE_MAIN_ASSET:
- /* TODO this may not be thread safe, main data may change. */
filelist->checkdirf = filelist_checkdir_main_assets;
filelist->read_jobf = filelist_readjob_main_assets;
filelist->filterf = is_filtered_main_assets;
- filelist->type_flags |= FL_USES_MAIN_DATA;
+ filelist->type_flags |= FL_USES_MAIN_DATA | FL_NO_THREADS;
break;
default:
filelist->checkdirf = filelist_checkdir_dir;
@@ -3251,7 +3253,7 @@ static void filelist_readjob_main_assets(Main *current_main,
short *UNUSED(stop),
short *do_update,
float *UNUSED(progress),
- ThreadMutex *lock)
+ ThreadMutex *UNUSED(lock))
{
BLI_assert(BLI_listbase_is_empty(&filelist->filelist.entries) &&
(filelist->filelist.nbr_entries == FILEDIR_NBR_ENTRIES_UNSET));
@@ -3287,16 +3289,12 @@ static void filelist_readjob_main_assets(Main *current_main,
FOREACH_MAIN_ID_END;
if (nbr_entries) {
- BLI_mutex_lock(lock);
-
*do_update = true;
BLI_movelisttolist(&filelist->filelist.entries, &tmp_entries);
filelist->filelist.nbr_entries += nbr_entries;
filelist->filelist.nbr_entries_filtered = filelist->filelist.entry_idx_start =
filelist->filelist.entry_idx_end = -1;
-
- BLI_mutex_unlock(lock);
}
}
@@ -3431,22 +3429,38 @@ void filelist_readjob_start(FileList *filelist, const bContext *C)
filelist->flags &= ~(FL_FORCE_RESET | FL_IS_READY);
filelist->flags |= FL_IS_PENDING;
+ /* Init even for single threaded execution. Called functions use it. */
BLI_mutex_init(&flrj->lock);
- /* setup job */
- wm_job = WM_jobs_get(CTX_wm_manager(C),
- CTX_wm_window(C),
- CTX_data_scene(C),
- "Listing Dirs...",
- WM_JOB_PROGRESS,
- WM_JOB_TYPE_FILESEL_READDIR);
- WM_jobs_customdata_set(wm_job, flrj, filelist_readjob_free);
- WM_jobs_timer(wm_job, 0.01, NC_SPACE | ND_SPACE_FILE_LIST, NC_SPACE | ND_SPACE_FILE_LIST);
- WM_jobs_callbacks(
- wm_job, filelist_readjob_startjob, NULL, filelist_readjob_update, filelist_readjob_endjob);
-
- /* start the job */
- WM_jobs_start(CTX_wm_manager(C), wm_job);
+ if (filelist->type_flags & FL_NO_THREADS) {
+ short dummy_stop = false;
+ short dummy_do_update = false;
+ float dummy_progress = 0.0f;
+
+ /* Single threaded execution. Just directly call the callbacks. */
+ filelist_readjob_startjob(flrj, &dummy_stop, &dummy_do_update, &dummy_progress);
+ filelist_readjob_endjob(flrj);
+ filelist_readjob_free(flrj);
+
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+ return;
+ }
+ else {
+ /* setup job */
+ wm_job = WM_jobs_get(CTX_wm_manager(C),
+ CTX_wm_window(C),
+ CTX_data_scene(C),
+ "Listing Dirs...",
+ WM_JOB_PROGRESS,
+ WM_JOB_TYPE_FILESEL_READDIR);
+ WM_jobs_customdata_set(wm_job, flrj, filelist_readjob_free);
+ WM_jobs_timer(wm_job, 0.01, NC_SPACE | ND_SPACE_FILE_LIST, NC_SPACE | ND_SPACE_FILE_LIST);
+ WM_jobs_callbacks(
+ wm_job, filelist_readjob_startjob, NULL, filelist_readjob_update, filelist_readjob_endjob);
+
+ /* start the job */
+ WM_jobs_start(CTX_wm_manager(C), wm_job);
+ }
}
void filelist_readjob_stop(wmWindowManager *wm, Scene *owner_scene)
More information about the Bf-blender-cvs
mailing list