[Bf-blender-cvs] [5d3ee3d] asset-experiments: WIP code to make readfilelists jobs.

Bastien Montagne noreply at git.blender.org
Wed Dec 10 21:17:40 CET 2014


Commit: 5d3ee3d695557f667ffbd3ffd2c6fbee04c6ead6
Author: Bastien Montagne
Date:   Wed Dec 10 21:14:26 2014 +0100
Branches: asset-experiments
https://developer.blender.org/rB5d3ee3d695557f667ffbd3ffd2c6fbee04c6ead6

WIP code to make readfilelists jobs.

Only very partially working in this state, still needs some work.
Proof of concept seems rather interesting though.

Also, only pure filesystem stuff is implemented for now.

===================================================================

M	source/blender/editors/space_file/filelist.c
M	source/blender/editors/space_file/filelist.h
M	source/blender/editors/space_file/filesel.c
M	source/blender/editors/space_file/space_file.c
M	source/blender/windowmanager/WM_api.h

===================================================================

diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 7731cf0..3651b9f 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -49,6 +49,7 @@
 #include "BLI_fnmatch.h"
 #include "BLI_linklist.h"
 #include "BLI_math.h"
+#include "BLI_threads.h"
 #include "BLI_utildefines.h"
 
 #ifdef WIN32
@@ -93,14 +94,6 @@ typedef struct FileImage {
 	ImBuf *img;
 } FileImage;
 
-typedef struct ThumbnailJob {
-	ListBase loadimages;
-	const short *stop;
-	const short *do_update;
-	struct FileList *filelist;
-	ReportList reports;
-} ThumbnailJob;
-
 typedef struct FileListFilter {
 	bool hide_dot;
 	unsigned int filter;
@@ -117,14 +110,18 @@ typedef struct FileList {
 	char dir[FILE_MAX];
 	short prv_w;
 	short prv_h;
-	short changed;
+
+	bool force_reset;
+	bool filelist_ready;
+	bool need_sorting;
 
 	FileListFilter filter_data;
 
 	struct BlendHandle *libfiledata;
-	short hide_parent;
+	bool hide_parent;
 
 	void (*readf)(struct FileList *);
+	void (*read_jobf)(struct FileList *, short *stop, short *do_update, ThreadMutex *lock);
 	bool (*filterf)(struct direntry *file, const char *dir, FileListFilter *filter);
 
 	bool use_recursion;
@@ -464,6 +461,10 @@ static void filelist_read_main(struct FileList *filelist);
 static void filelist_read_library(struct FileList *filelist);
 static void filelist_read_dir(struct FileList *filelist);
 
+static void filelist_readjob_main(struct FileList *, short *stop, short *do_update, ThreadMutex *lock);
+static void filelist_readjob_library(struct FileList *, short *stop, short *do_update, ThreadMutex *lock);
+static void filelist_readjob_dir(struct FileList *, short *stop, short *do_update, ThreadMutex *lock);
+
 static void filelist_from_library(struct FileList *filelist, const bool add_parent, const bool use_filter);
 
 /* helper, could probably go in BKE actually? */
@@ -577,6 +578,11 @@ void filelist_filter(FileList *filelist)
 		return;
 	}
 
+	if (filelist->fidx) {
+		/* Assume it has already been filtered, nothing else to do! */
+		return;
+	}
+
 	fidx_tmp = MEM_mallocN(sizeof(*fidx_tmp) * (size_t)filelist->numfiles, __func__);
 
 	/* How many files are left after filter ? */
@@ -587,10 +593,6 @@ void filelist_filter(FileList *filelist)
 		}
 	}
 
-	if (filelist->fidx) {
-		MEM_freeN(filelist->fidx);
-		filelist->fidx = NULL;
-	}
 	/* Note: maybe we could even accept filelist->fidx to be filelist->numfiles -len allocated? */
 	filelist->fidx = (int *)MEM_mallocN(sizeof(*filelist->fidx) * (size_t)num_filtered, __func__);
 	memcpy(filelist->fidx, fidx_tmp, sizeof(*filelist->fidx) * (size_t)num_filtered);
@@ -648,20 +650,39 @@ FileList *filelist_new(short type)
 	switch (type) {
 		case FILE_MAIN:
 			p->readf = filelist_read_main;
+			p->read_jobf = filelist_readjob_main;
 			p->filterf = is_filtered_main;
 			break;
 		case FILE_LOADLIB:
 			p->readf = filelist_read_library;
+			p->read_jobf = filelist_readjob_library;
 			p->filterf = is_filtered_lib;
 			break;
 		default:
 			p->readf = filelist_read_dir;
+			p->read_jobf = filelist_readjob_dir;
 			p->filterf = is_filtered_file;
 			break;
 	}
 	return p;
 }
 
+void filelist_clear(struct FileList *filelist)
+{
+	if (!filelist) {
+		return;
+	}
+
+	if (filelist->fidx) {
+		MEM_freeN(filelist->fidx);
+		filelist->fidx = NULL;
+	}
+
+	BLI_free_filelist(filelist->filelist, filelist->numfiles);
+	filelist->numfiles = 0;
+	filelist->filelist = NULL;
+	filelist->numfiltered = 0;
+}
 
 void filelist_free(struct FileList *filelist)
 {
@@ -728,16 +749,17 @@ const char *filelist_dir(struct FileList *filelist)
 
 void filelist_setdir(struct FileList *filelist, const char *dir)
 {
-	BLI_strncpy(filelist->dir, dir, sizeof(filelist->dir));
+	if (!STREQ(filelist->dir, dir)) {
+		BLI_strncpy(filelist->dir, dir, sizeof(filelist->dir));
+		filelist->force_reset = true;
+	}
 }
 
 void filelist_setrecursive(struct FileList *filelist, const bool use_recursion)
 {
 	if (filelist->use_recursion != use_recursion) {
 		filelist->use_recursion = use_recursion;
-
-		filelist_freelib(filelist);
-		filelist_free(filelist);
+		filelist->force_reset = true;
 	}
 }
 
@@ -747,9 +769,19 @@ void filelist_imgsize(struct FileList *filelist, short w, short h)
 	filelist->prv_h = h;
 }
 
-short filelist_changed(struct FileList *filelist)
+bool filelist_force_reset(struct FileList *filelist)
+{
+	return filelist->force_reset;
+}
+
+bool filelist_is_ready(struct FileList *filelist)
+{
+	return filelist->filelist_ready;
+}
+
+bool filelist_need_sorting(struct FileList *filelist)
 {
-	return filelist->changed;
+	return filelist->need_sorting;
 }
 
 static struct direntry *filelist_geticon_get_file(struct FileList *filelist, const int index)
@@ -961,31 +993,45 @@ int filelist_find(struct FileList *filelist, const char *filename)
 void filelist_setfilter_options(FileList *filelist, const bool hide_dot, const unsigned int filter,
                                 const unsigned int filter_id, const char *filter_glob, const char *filter_search)
 {
-	filelist->filter_data.hide_dot = hide_dot;
+	if (filelist->filter_data.hide_dot != hide_dot ||
+	    filelist->filter_data.filter != filter ||
+	    filelist->filter_data.filter_id != filter_id ||
+	    !STREQ(filelist->filter_data.filter_glob, filter_glob) ||
+	    !(filter_search[0] == '*' ? STRPREFIX(filelist->filter_data.filter_search, filter_search) : STRPREFIX(filelist->filter_data.filter_search + 1, filter_search)))
+	{
+		filelist->filter_data.hide_dot = hide_dot;
 
-	filelist->filter_data.filter = filter;
-	filelist->filter_data.filter_id = filter_id;
-	BLI_strncpy(filelist->filter_data.filter_glob, filter_glob, sizeof(filelist->filter_data.filter_glob));
+		filelist->filter_data.filter = filter;
+		filelist->filter_data.filter_id = filter_id;
+		BLI_strncpy(filelist->filter_data.filter_glob, filter_glob, sizeof(filelist->filter_data.filter_glob));
 
-	{
-		int idx = 0;
-		const size_t max_search_len = sizeof(filelist->filter_data.filter_search) - 2;
-		const size_t slen = (size_t)min_ii((int)strlen(filter_search), (int)max_search_len);
+		{
+			int idx = 0;
+			const size_t max_search_len = sizeof(filelist->filter_data.filter_search) - 2;
+			const size_t slen = (size_t)min_ii((int)strlen(filter_search), (int)max_search_len);
 
-		if (slen == 0) {
-			filelist->filter_data.filter_search[0] = '\0';
-		}
-		else {
-			/* Implicitly add heading/trailing wildcards if needed. */
-			if (filter_search[idx] != '*') {
-				filelist->filter_data.filter_search[idx++] = '*';
+			if (slen == 0) {
+				filelist->filter_data.filter_search[0] = '\0';
 			}
-			memcpy(&filelist->filter_data.filter_search[idx], filter_search, slen);
-			idx += slen;
-			if (filelist->filter_data.filter_search[idx - 1] != '*') {
-				filelist->filter_data.filter_search[idx++] = '*';
+			else {
+				/* Implicitly add heading/trailing wildcards if needed. */
+				if (filter_search[idx] != '*') {
+					filelist->filter_data.filter_search[idx++] = '*';
+				}
+				memcpy(&filelist->filter_data.filter_search[idx], filter_search, slen);
+				idx += slen;
+				if (filelist->filter_data.filter_search[idx - 1] != '*') {
+					filelist->filter_data.filter_search[idx++] = '*';
+				}
+				filelist->filter_data.filter_search[idx] = '\0';
 			}
-			filelist->filter_data.filter_search[idx] = '\0';
+		}
+
+		/* And now, free filtered data so that we now we have to filter again. */
+		if (filelist->fidx) {
+			MEM_freeN(filelist->fidx);
+			filelist->fidx = NULL;
+			filelist->numfiltered = 0;
 		}
 	}
 }
@@ -1128,7 +1174,7 @@ static void filelist_setfiletypes(struct FileList *filelist)
 	}
 }
 
-static void filelist_merge_sublist(struct direntry **filelist_buff, int *filelist_buff_size, int *filelist_used_size,
+static void filelist_merge_sublist(struct direntry *filelist_org, struct direntry **filelist_buff, int *filelist_buff_size, int *filelist_used_size,
                                    const char *root, struct FileList *sublist)
 {
 	if (sublist->numfiles) {
@@ -1144,7 +1190,9 @@ static void filelist_merge_sublist(struct direntry **filelist_buff, int *filelis
 			new_filelist = malloc(sizeof(*new_filelist) * (size_t)*filelist_buff_size);
 			if (*filelist_buff && *filelist_used_size) {
 				memcpy(new_filelist, *filelist_buff, sizeof(*new_filelist) * (size_t)*filelist_used_size);
-				free(*filelist_buff);
+				if (*filelist_buff != filelist_org) {
+					free(*filelist_buff);
+				}
 			}
 			*filelist_buff = new_filelist;
 		}
@@ -1188,6 +1236,8 @@ static void filelist_read_dir(struct FileList *filelist)
 	BLI_cleanup_dir(G.main->name, filelist->dir);
 	filelist->numfiles = BLI_dir_contents(filelist->dir, &(filelist->filelist));
 
+	filelist_setfiletypes(filelist);
+
 	if (filelist->use_recursion && filelist->recursion_level < FILELIST_MAX_RECURSION) {
 		FileList *fl = filelist_new(FILE_UNIX);
 		file = filelist->filelist;
@@ -1206,7 +1256,7 @@ static void filelist_read_dir(struct FileList *filelist)
 			BLI_cleanup_dir(G.main->name, fl->dir);
 			filelist_read_dir(fl);
 
-			filelist_merge_sublist(&new_filelist, &new_filelist_buffsize, &new_filelist_size, filelist->dir, fl);
+			filelist_merge_sublist(NULL, &new_filelist, &new_filelist_buffsize, &new_filelist_size, filelist->dir, fl);
 
 			filelist_free(fl);
 		}
@@ -1226,8 +1276,7 @@ static void filelist_read_dir(struct FileList *filelist)
 		filelist->numfiles = final_filelist_size;
 	}
 
-	filelist_setfiletypes(filelist);
-	filelist_filter(filelist);
+	filelist->need_sorting = true;
 }
 
 static void filelist_read_main(struct FileList *filelist)
@@ -1281,7 +1330,7 @@ static void filelist_read_library(struct FileList *filelist)
 						BLI_cleanup_dir(G.main->name, fl->dir);
 						filelist_read_library(fl);
 
-						filelist_merge_sublist(&new_filelist, &new_filelist_buffsize, &new_filelist_size, filelist->dir, fl);
+						filelist_merge_sublist(NULL, &new_filelist, &new_filelist_buffsize, &new_filelist_size, filelist->dir, fl);
 
 						filelist_freelib(fl);
 						filelist_free(fl);
@@ -1292,18 +1341,21 @@ static void filelist_read_library(struct FileList *filelist)
 		MEM_freeN(fl);
 	}
 	else if (filelist->use_recursion) {
-		F

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list