On Sun, Dec 8, 2024 at 5:09 PM Zhao Liu <zhao1....@intel.com> wrote: > > This has the same issue as timers, in that you could have (especially once > > someone adds named GPIOs) multiple handlers. So we need the same kind of > > Fn-based thing here too. > > I will refer to the timer callback prototype you suggested and try that > way. Will you rework the timer binding soon? (I'm sorry for bringing such > burden to you).
No, I have written a utility that can be used for all callbacks but I'll leave it to you to use it for timers. Both because you have already started the work, and because it helps if one person writes the code and one uses it. > Additionally, the current DeviceImpl trait is quite special. Although in > Rust, DeviceImpl traits are implemented for device states, DeviceImpl is > actually used for device classes. > > Semantically, it might be more natural for DeviceImpl to be a trait for > device classes. However, parameters of its methods are DeviceState, so > it makes sense as a trait for states in Rust. > > This seems to be a different design before C and Rust Qdev. I agree that there are differences in how you write the code, due to the fact that Rust supports associating functions and traits to a struct, while C only has a global namespace. Also, functions in a trait can look like both "normal" and static methods, so it's easier to place all functions in DeviceState. The DeviceClass part is mostly automatic. So if Xyz is a struct corresponding to a QOM type, it will: - include a field of type Abc corresponding to the direct superclass - implement virtual methods for all superclasses through traits such as AbcImpl or DefImpl, up to ObjectImpl - expose its virtual methods to C thorough a blanket implementation of ClassInitImpl<AbcClass> or ClassInitImpl<DefClass> - invoke methods through blanket implementations of AbcMethods, AbcClassMethods etc. for all superclasses and the structure of all the blanket implementation is always the same: pub trait DeviceClassMethods: IsA<DeviceState> {...} impl<T> DeviceClassMethods for T where T: IsA<DeviceState> {} pub trait DeviceMethods: ObjectDeref where Self::Target: IsA<DeviceState>, {...} impl<R: ObjectDeref> DeviceMethods for R where R::Target: IsA<DeviceState> {} impl<T> ClassInitImpl<DeviceClass> for T where T: ClassInitImpl<ObjectClass> + DeviceImpl {...} In the future, developers will not need to worry much about these, but for some time every new device will probably need a few new functions or even modules in qemu_api. Paolo