+void bt_object_null_freeze(struct bt_object *object)
+{
+}
+
+void bt_object_generic_freeze(struct bt_object *object)
+{
+ object->is_frozen = true;
+}
+
+void bt_object_array_freeze(struct bt_object *object)
+{
+ int i;
+ struct bt_object_array *typed_array_obj =
+ BT_OBJECT_TO_ARRAY(object);
+
+ for (i = 0; i < typed_array_obj->garray->len; ++i) {
+ struct bt_object *element_obj =
+ g_ptr_array_index(typed_array_obj->garray, i);
+
+ bt_object_freeze(element_obj);
+ }
+
+ bt_object_generic_freeze(object);
+}
+
+void bt_object_map_freeze(struct bt_object *object)
+{
+ GHashTableIter iter;
+ gpointer key, element_obj;
+ const struct bt_object_map *map_obj = BT_OBJECT_TO_MAP(object);
+
+ g_hash_table_iter_init(&iter, map_obj->ght);
+
+ while (g_hash_table_iter_next(&iter, &key, &element_obj)) {
+ bt_object_freeze(element_obj);
+ }
+
+ bt_object_generic_freeze(object);
+}
+
+static
+void (* const freeze_funcs[])(struct bt_object *) = {
+ [BT_OBJECT_TYPE_NULL] = bt_object_null_freeze,
+ [BT_OBJECT_TYPE_BOOL] = bt_object_generic_freeze,
+ [BT_OBJECT_TYPE_INTEGER] = bt_object_generic_freeze,
+ [BT_OBJECT_TYPE_FLOAT] = bt_object_generic_freeze,
+ [BT_OBJECT_TYPE_STRING] = bt_object_generic_freeze,
+ [BT_OBJECT_TYPE_ARRAY] = bt_object_array_freeze,
+ [BT_OBJECT_TYPE_MAP] = bt_object_map_freeze,
+};
+