Patchwork [RFC,v1,3/7] qdev-core: Introduce DEVICE super class cast macros

login
register
mail settings
Submitter Peter Crosthwaite
Date June 18, 2013, 9:45 a.m.
Message ID <7ddd1c80f6996331c7ff158c858d456cf62170cc.1371548267.git.peter.crosthwaite@xilinx.com>
Download mbox | patch
Permalink /patch/252205/
State New
Headers show

Comments

Peter Crosthwaite - June 18, 2013, 9:45 a.m.
From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

Add macros DEVICE_SUPER_CLASS and DEVICE_GET_SUPER_CLASS. These are the
similar to their respective non SUPER versions, except instead of
returning the class object for the concrete class, they return their
parent classes implementation (usually some form of abstract class).

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---

 include/hw/qdev-core.h | 4 ++++
 1 file changed, 4 insertions(+)
Michael S. Tsirkin - June 18, 2013, 10:12 a.m.
On Tue, Jun 18, 2013 at 07:45:36PM +1000, peter.crosthwaite@xilinx.com wrote:
> From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> 
> Add macros DEVICE_SUPER_CLASS and DEVICE_GET_SUPER_CLASS. These are the
> similar to their respective non SUPER versions, except instead of
> returning the class object for the concrete class, they return their
> parent classes implementation (usually some form of abstract class).
> 
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> ---
> 
>  include/hw/qdev-core.h | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> index 7fbffcb..96647c4 100644
> --- a/include/hw/qdev-core.h
> +++ b/include/hw/qdev-core.h
> @@ -16,6 +16,10 @@ enum {
>  #define DEVICE(obj) OBJECT_CHECK(DeviceState, (obj), TYPE_DEVICE)
>  #define DEVICE_CLASS(klass) OBJECT_CLASS_CHECK(DeviceClass, (klass), TYPE_DEVICE)
>  #define DEVICE_GET_CLASS(obj) OBJECT_GET_CLASS(DeviceClass, (obj), TYPE_DEVICE)
> +#define DEVICE_SUPER_CLASS(klass, typename) \
> +    DEVICE_CLASS(object_class_get_super(OBJECT_CLASS(klass), typename))
> +#define DEVICE_GET_SUPER_CLASS(obj, typename) \
> +    DEVICE_SUPER_CLASS(DEVICE_GET_CLASS(obj), typename)

DEVICE_GET_SUPER_CLASS is not a great name. It actually gets you
a device not a class.

I know this mirrors DEVICE_GET_CLASS that's not
a great name too.

Generally in cases where we change the type of object but in fact return
same pointer, it would be better to rename _GET to _CAST I think.

>  
>  typedef int (*qdev_initfn)(DeviceState *dev);
>  typedef int (*qdev_event)(DeviceState *dev);
> -- 
> 1.8.3.rc1.44.gb387c77.dirty

Patch

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index 7fbffcb..96647c4 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -16,6 +16,10 @@  enum {
 #define DEVICE(obj) OBJECT_CHECK(DeviceState, (obj), TYPE_DEVICE)
 #define DEVICE_CLASS(klass) OBJECT_CLASS_CHECK(DeviceClass, (klass), TYPE_DEVICE)
 #define DEVICE_GET_CLASS(obj) OBJECT_GET_CLASS(DeviceClass, (obj), TYPE_DEVICE)
+#define DEVICE_SUPER_CLASS(klass, typename) \
+    DEVICE_CLASS(object_class_get_super(OBJECT_CLASS(klass), typename))
+#define DEVICE_GET_SUPER_CLASS(obj, typename) \
+    DEVICE_SUPER_CLASS(DEVICE_GET_CLASS(obj), typename)
 
 typedef int (*qdev_initfn)(DeviceState *dev);
 typedef int (*qdev_event)(DeviceState *dev);