On 06/01/2011 12:27 PM, Matthias Bolte wrote:
2011/6/1 Adam Litke <agl(a)us.ibm.com>:
> * src/remote/remote_protocol.x: provide defines for the new entry points
> * src/remote/remote_driver.c daemon/remote.c: implement the client and
> server side
> * daemon/remote_generator.pl: Specify the manually-written functions
>
> Signed-off-by: Adam Litke <agl(a)us.ibm.com>
> ---
+static int remoteDomainBlockPull(virDomainPtr domain,
+ const char *path,
+ virDomainBlockPullInfoPtr info,
+ unsigned int flags)
+{
+ int rv = -1;
+ remote_domain_block_pull_args args;
+ remote_domain_block_pull_ret ret;
+ struct private_data *priv = domain->conn->privateData;
+
+ remoteDriverLock(priv);
+
+ make_nonnull_domain(&args.dom, domain);
+ args.path = (char *)path;
+ args.flags = flags;
+
+ if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_BLOCK_PULL,
+ (xdrproc_t)xdr_remote_domain_block_pull_args, (char *)&args,
+ (xdrproc_t)xdr_remote_domain_block_pull_ret, (char *)&ret) == -1)
+ goto done;
+
+ if (info) {
+ info->cur = ret.info.cur;
+ info->end = ret.info.end;
+ }
+ rv = 0;
+
+done:
+ remoteDriverUnlock(priv);
+ return rv;
+}
From the generator point-of-view I would want to avoid having the info
parameter being NULLable, as this differs from the common pattern and
results in special case code in the generator.
From an API user's point of view, I think it's nice to allow
NULL for
the info struct. The user may not care about the current progress
information. I could fix this at the global libvirt level by allocating
a dummy struct to pass down to the driver implementations if the user
passed NULL. Would that be acceptable?
> +struct remote_domain_block_pull_info {
> + unsigned hyper cur;
> + unsigned hyper end;
> +};
> +struct remote_domain_block_pull_ret {
> + remote_domain_block_pull_info info;
> +};
> +struct remote_domain_get_block_pull_info_ret {
> + remote_domain_block_pull_info info;
> +};
From the generator point-of-view I would avoid this approach of
putting a struct in a struct because that differs from the common
approach and results in special case code in the generator. It should
look like this
struct remote_domain_block_pull_ret {
unsigned hyper cur;
unsigned hyper end;
};
struct remote_domain_get_block_pull_info_ret {
unsigned hyper cur;
unsigned hyper end;
};
Ok, I will make this change.
--
Adam Litke
IBM Linux Technology Center