提交 8f08f28f 编写于 作者: M Michal Privoznik

gendispatch: Introduce @sparseflag for our calls

Now, not all APIs are going to support sparse streams. To some it
makes no sense at all, e.g. virDomainOpenConsole() or
virDomainOpenChannel(). To others, we will need a special flag to
indicate that client wants to enable sparse streams. Instead of
having to write RPC dispatchers by hand we can just annotate in
our .x files that a certain flag to certain RPC call enables this
feature. For instance:

     /**
      * @generate: both
      * @ReadStream: 1
      * @sparseflag: VIR_SPARSE_STREAM
      * @acl: storage_vol:data_read
      */
     REMOTE_PROC_DOMAIN_SOME_API = XXX,

Therefore, whenever client calls virDomainSomeAPI(..,
VIR_SPARSE_STREAM); daemon will mark that down and send stream
skips when possible.
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
上级 89547964
......@@ -281,6 +281,13 @@ while (<PROTOCOL>) {
$calls{$name}->{streamflag} = "none";
}
if (exists $opts{sparseflag}) {
die "\@sparseflag requires stream" unless $calls{$name}->{streamflag} ne "none";
$calls{$name}->{sparseflag} = $opts{sparseflag};
} else {
$calls{$name}->{sparseflag} = "none";
}
$calls{$name}->{acl} = $opts{acl};
$calls{$name}->{aclfilter} = $opts{aclfilter};
......@@ -982,6 +989,11 @@ elsif ($mode eq "server") {
if ($call->{streamflag} ne "none") {
print " virStreamPtr st = NULL;\n";
print " daemonClientStreamPtr stream = NULL;\n";
if ($call->{sparseflag} ne "none") {
print " const bool sparse = args->flags & $call->{sparseflag};\n"
} else {
print " const bool sparse = false;\n";
}
}
print "\n";
......@@ -1024,7 +1036,7 @@ elsif ($mode eq "server") {
print " if (!(st = virStreamNew(priv->conn, VIR_STREAM_NONBLOCK)))\n";
print " goto cleanup;\n";
print "\n";
print " if (!(stream = daemonCreateClientStream(client, st, remoteProgram, &msg->header, false)))\n";
print " if (!(stream = daemonCreateClientStream(client, st, remoteProgram, &msg->header, sparse)))\n";
print " goto cleanup;\n";
print "\n";
}
......@@ -1727,6 +1739,11 @@ elsif ($mode eq "client") {
if ($call->{streamflag} ne "none") {
print " virNetClientStreamPtr netst = NULL;\n";
if ($call->{sparseflag} ne "none") {
print " const bool sparse = flags & $call->{sparseflag};\n"
} else {
print " const bool sparse = false;\n";
}
}
print "\n";
......@@ -1738,7 +1755,7 @@ elsif ($mode eq "client") {
if ($call->{streamflag} ne "none") {
print "\n";
print " if (!(netst = virNetClientStreamNew(st, priv->remoteProgram, $call->{constname}, priv->counter, false)))\n";
print " if (!(netst = virNetClientStreamNew(st, priv->remoteProgram, $call->{constname}, priv->counter, sparse)))\n";
print " goto done;\n";
print "\n";
print " if (virNetClientAddStream(priv->client, netst) < 0) {\n";
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册