On Tue, Mar 04, 2014 at 03:00:50PM +0100, Paolo Bonzini wrote:
> This allows the superclass to set various policies on the memory
> region that the subclass creates.
> 
> Suggested-by: Igor Mammedov <imamm...@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>
> ---
>  backends/hostmem-file.c  |  9 ++++-----
>  backends/hostmem-ram.c   |  8 +++-----
>  backends/hostmem.c       | 12 ++++++++++--
>  include/sysemu/hostmem.h |  2 ++
>  4 files changed, 19 insertions(+), 12 deletions(-)
> 
> diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
> index 8c6ea5d..7e91665 100644
> --- a/backends/hostmem-file.c
> +++ b/backends/hostmem-file.c
> @@ -30,10 +30,9 @@ struct HostMemoryBackendFile {
>  };
>  
>  static void
> -file_backend_memory_init(UserCreatable *uc, Error **errp)
> +file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
>  {
> -    HostMemoryBackend *backend = MEMORY_BACKEND(uc);
> -    HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(uc);
> +    HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(backend);
>  
>      if (!backend->size) {
>          error_setg(errp, "can't create backend with size 0");
> @@ -58,9 +57,9 @@ file_backend_memory_init(UserCreatable *uc, Error **errp)
>  static void
>  file_backend_class_init(ObjectClass *oc, void *data)
>  {
> -    UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
> +    HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc);
>  
> -    ucc->complete = file_backend_memory_init;
> +    bc->alloc = file_backend_memory_alloc;
>  }
>  
>  static char *get_mem_path(Object *o, Error **errp)
> diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
> index ce06fbe..e4d244a 100644
> --- a/backends/hostmem-ram.c
> +++ b/backends/hostmem-ram.c
> @@ -16,10 +16,8 @@
>  
>  
>  static void
> -ram_backend_memory_init(UserCreatable *uc, Error **errp)
> +ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
>  {
> -    HostMemoryBackend *backend = MEMORY_BACKEND(uc);
> -
>      if (!backend->size) {
>          error_setg(errp, "can't create backend with size 0");
>          return;
> @@ -33,9 +31,9 @@ ram_backend_memory_init(UserCreatable *uc, Error **errp)
>  static void
>  ram_backend_class_init(ObjectClass *oc, void *data)
>  {
> -    UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
> +    HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc);
>  
> -    ucc->complete = ram_backend_memory_init;
> +    bc->alloc = ram_backend_memory_alloc;
>  }
>  
>  static const TypeInfo ram_backend_info = {
> diff --git a/backends/hostmem.c b/backends/hostmem.c
> index 06817dd..7d6199f 100644
> --- a/backends/hostmem.c
> +++ b/backends/hostmem.c
> @@ -69,8 +69,16 @@ static void host_memory_backend_finalize(Object *obj)
>  static void
>  host_memory_backend_memory_init(UserCreatable *uc, Error **errp)
>  {
> -    error_setg(errp, "memory_init is not implemented for type [%s]",
> -               object_get_typename(OBJECT(uc)));
> +    HostMemoryBackend *backend = MEMORY_BACKEND(uc);
> +    HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc);
> +
> +    if (!bc->alloc) {
> +        error_setg(errp, "memory_init is not implemented for type [%s]",

s/memory_init/memory_alloc/ ?

> +                   object_get_typename(OBJECT(uc)));
> +        return;
> +    }
> +
> +    bc->alloc(backend, errp);
>  }
>  
>  MemoryRegion *
> diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
> index bc3ffb3..4738107 100644
> --- a/include/sysemu/hostmem.h
> +++ b/include/sysemu/hostmem.h
> @@ -34,6 +34,8 @@ typedef struct HostMemoryBackendClass 
> HostMemoryBackendClass;
>   */
>  struct HostMemoryBackendClass {
>      ObjectClass parent_class;
> +
> +    void (*alloc)(HostMemoryBackend *backend, Error **errp);
>  };
>  
>  /**
> -- 
> 1.8.5.3
> 

Reply via email to