[Libvir] PATCH 2/4: Xen driver support for serial/paralle
jim at meyering.net
Fri Apr 25 22:03:33 UTC 2008
"Daniel P. Berrange" <berrange at redhat.com> wrote:
> On Fri, Apr 25, 2008 at 03:11:44AM -0400, Daniel Veillard wrote:
>> On Thu, Apr 24, 2008 at 10:14:49PM +0100, Daniel P. Berrange wrote:
>> > On Thu, Apr 24, 2008 at 10:42:34PM +0200, Jim Meyering wrote:
>> > > All of the virBufferAddLit and virBufferVSprintf calls
>> > > above can fail with ENOMEM. I see that there are *many* more
>> > > virBufferAddLit and virBufferVSprintf calls that ignore their
>> > > return values (over 300), so maybe I'm missing something.
>> > Yes, the entire set of Xen drivers is basically fubar wrt to checking
>> > virBufferXXX return values. I felt that needed addresing independantly
>> > changing everything in one go, so didn't try to address that in this
>> > patch.
>> Maybe the best is to store in the buffer the fact that there have been
>> an error at some point, and check that value before extracting the content
>> in a single place, that would make the code cleaner, and makes harder to
>> miss one test.
> So we've two options:
> - Make all the virBuffer* functions be void, and keep an internal
> error flag to be checked at the end
> - Annotate all the virBuffer* functions with __attribute((warn_unused_result))
> which forces the caller to check the return value
> I'm acutally inclined to go for the former, since it'll let us remove a
> large number of 'goto no_memory' statements giving clearer code
> I think I'd also like to mak the virBuffer struct private, so people
> can't access the data field directly - force them to go via an API to
> get hold of the internal char * - this lets us ensure they don't access
> the data if an error has occurred.
Sounds good. As a second step, I guess.
If we're revamping, then it'd be good to move away from the
pointer-hiding typedef in the current implementation:
typedef virBuffer *virBufferPtr;
That makes it hard to declare such a parameter const,
as it will have to be in the string-extracting or
The alternative is to use e.g.,
typedef const virBuffer *virBufferConstPtr;
but that's far less readable and doesn't scale well.
More information about the libvir-list