Mercurial > geeqie.yaz
diff src/filedata.c @ 1227:2df7be0cd20b
optimized get_mark_func
fixed reference counting bug
author | nadvornik |
---|---|
date | Fri, 26 Dec 2008 19:04:36 +0000 |
parents | ebfd305d902e |
children | 878718372aca |
line wrap: on
line diff
--- a/src/filedata.c Fri Dec 26 18:54:07 2008 +0000 +++ b/src/filedata.c Fri Dec 26 19:04:36 2008 +0000 @@ -142,7 +142,12 @@ void file_data_increment_version(FileData *fd) { fd->version++; - if (fd->parent) fd->parent->version++; + fd->valid_marks = 0; + if (fd->parent) + { + fd->parent->version++; + fd->parent->valid_marks = 0; + } } static void file_data_set_collate_keys(FileData *fd) @@ -1094,10 +1099,24 @@ gboolean file_data_get_mark(FileData *fd, gint n) { - if (file_data_get_mark_func[n]) + gboolean valid = (fd->valid_marks & (1 << n)); + if (file_data_get_mark_func[n] && !valid) { + guint old = fd->marks; gboolean value = (file_data_get_mark_func[n])(fd, n, file_data_mark_func_data[n]); - if (!value != !(fd->marks & (1 << n))) fd->marks = fd->marks ^ (1 << n); + if (!value != !(fd->marks & (1 << n))) + { + fd->marks = fd->marks ^ (1 << n); + } + fd->valid_marks |= (1 << n); + if (old && !fd->marks) /* keep files with non-zero marks in memory */ + { + file_data_unref(fd); + } + else if (!old && fd->marks) + { + file_data_ref(fd); + } } return !!(fd->marks & (1 << n)); @@ -1112,13 +1131,15 @@ void file_data_set_mark(FileData *fd, gint n, gboolean value) { - guint old = fd->marks; - if (!value == !(fd->marks & (1 << n))) return; - + guint old; + if (!value == !file_data_get_mark(fd, n)) return; + if (file_data_set_mark_func[n]) { (file_data_set_mark_func[n])(fd, n, value, file_data_mark_func_data[n]); } + + old = fd->marks; fd->marks = fd->marks ^ (1 << n);