-
-
Notifications
You must be signed in to change notification settings - Fork 3.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Merged by Bors] - Useful error message when two assets have the save UUID #3739
[Merged by Bors] - Useful error message when two assets have the save UUID #3739
Conversation
I think we should check whether the two assets actually have different types, as registration would ideally be idempotent. |
This will be handled by #3560 |
panic!("Error while registering new asset type. Asset with UUID: {:?} is already registered. Can not register another type with the same UUID", | ||
T::TYPE_UUID); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
could you also log std::any::type_name::<T>()
in the error?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ideally it would be possible to include the type name of the first type too, although I don't know if we store that information
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added type name, but i don't think there is a way to get the original type. We only have trait object, so we can't get the type from it.
@@ -93,6 +93,15 @@ impl AssetServer { | |||
} | |||
|
|||
pub(crate) fn register_asset_type<T: Asset>(&self) -> Assets<T> { | |||
if self |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
rather than grab a read lock and then a write lock immediately after, I think we should just grab a single write lock and reuse it across both cases (especially given that the "read only" case is the "unexpected" / "uncommon" case).
self.server.asset_lifecycles.write().insert( | ||
let mut asset_lifecycles = self.server.asset_lifecycles.write(); | ||
if asset_lifecycles.contains_key(&T::TYPE_UUID) { | ||
panic!("Error while registering new asset type: {:?} with UUID: {:?}. Another type with the same UUID is already registered. Can not register new asset type with the same UUID", | ||
std::any::type_name::<T>(), T::TYPE_UUID); | ||
} | ||
asset_lifecycles.insert( | ||
T::TYPE_UUID, | ||
Box::new(AssetLifecycleChannel::<T>::default()), | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
insert would return Some(_)
if the value already exists, so this could be just
if self
.server
.asset_lifecycles
.write()
.insert(
T::TYPE_UUID,
Box::new(AssetLifecycleChannel::<T>::default()),
)
.is_some()
{
panic!("Error while registering new asset type: {:?} with UUID: {:?}. Another type with the same UUID is already registered. Can not register new asset type with the same UUID.",
std::any::type_name::<T>(), T::TYPE_UUID);
}
bors r+ |
Objective
Fixes #2610 and #3731
Solution
Added check for TYPE_UUID duplication in
register_asset_type
with an error message