Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/makesrna/intern/rna_access.c')
-rw-r--r--source/blender/makesrna/intern/rna_access.c48
1 files changed, 33 insertions, 15 deletions
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index feacd47c98c..41c31dfebcb 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -36,6 +36,7 @@
#include "BLI_dynstr.h"
#include "BLI_ghash.h"
#include "BLI_math.h"
+#include "BLI_threads.h"
#include "BLI_utildefines.h"
#include "BLF_api.h"
@@ -882,8 +883,7 @@ bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
{
- if (identifier[0] == '[' && identifier[1] == '"') { /* " (dummy comment to avoid confusing some
- * function lists in text editors) */
+ if (identifier[0] == '[' && identifier[1] == '"') {
/* id prop lookup, not so common */
PropertyRNA *r_prop = NULL;
PointerRNA r_ptr; /* only support single level props */
@@ -967,19 +967,33 @@ const struct ListBase *RNA_struct_type_properties(StructRNA *srna)
return &srna->cont.properties;
}
-PropertyRNA *RNA_struct_type_find_property(StructRNA *srna, const char *identifier)
+PropertyRNA *RNA_struct_type_find_property_no_base(StructRNA *srna, const char *identifier)
{
return BLI_findstring_ptr(&srna->cont.properties, identifier, offsetof(PropertyRNA, identifier));
}
+/**
+ * \note #RNA_struct_find_property is a higher level alternative to this function
+ * which takes a #PointerRNA instead of a #StructRNA.
+ */
+PropertyRNA *RNA_struct_type_find_property(StructRNA *srna, const char *identifier)
+{
+ for (; srna; srna = srna->base) {
+ PropertyRNA *prop = RNA_struct_type_find_property_no_base(srna, identifier);
+ if (prop != NULL) {
+ return prop;
+ }
+ }
+ return NULL;
+}
+
FunctionRNA *RNA_struct_find_function(StructRNA *srna, const char *identifier)
{
#if 1
FunctionRNA *func;
- StructRNA *type;
- for (type = srna; type; type = type->base) {
+ for (; srna; srna = srna->base) {
func = (FunctionRNA *)BLI_findstring_ptr(
- &type->functions, identifier, offsetof(FunctionRNA, identifier));
+ &srna->functions, identifier, offsetof(FunctionRNA, identifier));
if (func) {
return func;
}
@@ -3002,7 +3016,7 @@ void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
BLI_assert(RNA_property_type(prop) == PROP_FLOAT);
BLI_assert(RNA_property_array_check(prop) == false);
/* useful to check on bad values but set function should clamp */
- /* BLI_assert(RNA_property_float_clamp(ptr, prop, &value) == 0); */
+ // BLI_assert(RNA_property_float_clamp(ptr, prop, &value) == 0);
if ((idprop = rna_idproperty_check(&prop, ptr))) {
RNA_property_float_clamp(ptr, prop, &value);
@@ -3676,6 +3690,8 @@ PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop;
IDProperty *idprop;
+ static ThreadMutex lock = BLI_MUTEX_INITIALIZER;
+
BLI_assert(RNA_property_type(prop) == PROP_POINTER);
if ((idprop = rna_idproperty_check(&prop, ptr))) {
@@ -3695,9 +3711,14 @@ PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
return pprop->get(ptr);
}
if (prop->flag & PROP_IDPROPERTY) {
- /* XXX temporary hack to add it automatically, reading should
- * never do any write ops, to ensure thread safety etc. */
+ /* NOTE: While creating/writing data in an accessor is really bad design-wise, this is
+ * currently very difficult to avoid in that case. So a global mutex is used to keep ensuring
+ * thread safety. */
+ BLI_mutex_lock(&lock);
+ /* NOTE: We do not need to check again for existence of the pointer after locking here, since
+ * this is also done in #RNA_property_pointer_add itself. */
RNA_property_pointer_add(ptr, prop);
+ BLI_mutex_unlock(&lock);
return RNA_property_pointer_get(ptr, prop);
}
return PointerRNA_NULL;
@@ -4972,10 +4993,7 @@ void rna_iterator_array_end(CollectionPropertyIterator *iter)
{
ArrayIterator *internal = &iter->internal.array;
- if (internal->free_ptr) {
- MEM_freeN(internal->free_ptr);
- internal->free_ptr = NULL;
- }
+ MEM_SAFE_FREE(internal->free_ptr);
}
PointerRNA rna_array_lookup_int(
@@ -6723,7 +6741,7 @@ bool RNA_struct_property_is_set_ex(PointerRNA *ptr, const char *identifier, bool
return RNA_property_is_set_ex(ptr, prop, use_ghost);
}
/* python raises an error */
- /* printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); */
+ // printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name);
return 0;
}
@@ -6735,7 +6753,7 @@ bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
return RNA_property_is_set(ptr, prop);
}
/* python raises an error */
- /* printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); */
+ // printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name);
return 0;
}