Depsgraph: Use atomics to tag ID when evaluating driver
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 8 Nov 2016 16:54:14 +0000 (17:54 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 8 Nov 2016 16:54:14 +0000 (17:54 +0100)
This is required since new dependency graph evaluates drivers in threads
so it was possible to have some partially written ID tag there.

source/blender/blenkernel/BKE_library.h
source/blender/blenkernel/intern/anim_sys.c
source/blender/blenkernel/intern/library.c

index 79373e343a6ce1515fef8539824ccac8d51fda66..1cc7014765c8330570536a0a980635ab280936ea 100644 (file)
@@ -129,6 +129,8 @@ void BKE_library_make_local(
         struct Main *bmain, const struct Library *lib, struct GHash *old_to_new_ids,
         const bool untagged_only, const bool set_fake);
 
+void BKE_id_tag_set_atomic(struct ID *id, int tag);
+void BKE_id_tag_clear_atomic(struct ID *id, int tag);
 
 /* use when "" is given to new_id() */
 #define ID_FALLBACK_NAME N_("Untitled")
index e3764adb9696a88a0558c0e06d5c618fd03ca99a..a5abc6beff8ac4af918ed52e599caefc1bc2d16c 100644 (file)
@@ -1657,7 +1657,7 @@ static bool animsys_write_rna_setting(PathResolvedRNA *anim_rna, const float val
                /* for cases like duplifarmes it's only a temporary so don't
                 * notify anyone of updates */
                if (!(id->tag & LIB_TAG_ANIM_NO_RECALC)) {
-                       id->tag |= LIB_TAG_ID_RECALC;
+                       BKE_id_tag_set_atomic(id, LIB_TAG_ID_RECALC);
                        DAG_id_type_tag(G.main, GS(id->name));
                }
        }
index 5d28a84ef18e78cee7867a612ebc8ca67f5af02f..5d23788f6f76a83a945eaa6971547b37551f3e47 100644 (file)
 #include "IMB_imbuf.h"
 #include "IMB_imbuf_types.h"
 
+#include "atomic_ops.h"
+
 /* GS reads the memory pointed at in a specific ordering. 
  * only use this definition, makes little and big endian systems
  * work fine, in conjunction with MAKE_ID */
@@ -1895,3 +1897,13 @@ void BKE_library_filepath_set(Library *lib, const char *filepath)
                BLI_path_abs(lib->filepath, basepath);
        }
 }
+
+void BKE_id_tag_set_atomic(ID *id, int tag)
+{
+       atomic_fetch_and_or_uint32((uint32_t *)&id->tag, tag);
+}
+
+void BKE_id_tag_clear_atomic(ID *id, int tag)
+{
+       atomic_fetch_and_and_uint32((uint32_t *)&id->tag, ~tag);
+}