|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library
On 21/09/15 17:17, Ian Jackson wrote:
> Andrew Cooper writes ("Re: [Xen-devel] [PATCH RFC tools 1/6] tools: Refactor
> "xentoollog" into its own library"):
>> On 10/06/15 12:36, Ian Campbell wrote:
>>> +
>>> +#define XTL_NEW_LOGGER(LOGGER,buffer) ({ \
>>> + xentoollog_logger_##LOGGER *new_consumer; \
>>> + \
>>> + (buffer).vtable.vmessage = LOGGER##_vmessage; \
>>> + (buffer).vtable.progress = LOGGER##_progress; \
>>> + (buffer).vtable.destroy = LOGGER##_destroy; \
>>> + \
>>> + new_consumer = malloc(sizeof(*new_consumer)); \
>>> + if (!new_consumer) { \
>>> + xtl_log((xentoollog_logger*)&buffer, \
>>> + XTL_CRITICAL, errno, "xtl", \
>>> + "failed to allocate memory for new message logger"); \
>>> + } else { \
>>> + *new_consumer = buffer; \
>>> + } \
>>> + \
>>> + new_consumer; \
>>> +});
> Ian Campbell just pointed me at this.
>
>> This macro should be ditched.
>>
>> It is a gnu-ism which shouldn't be present in the public library header,
> Do you mean that statement expressions (originally a GNU extension)
> should be avoided in tools code ? A quick git-grep discovered that
> xenctrl already contains numerous statement expressions.
It is fine (in principle) to be used internally. Not in a public header
for what is supposed to be a clean API.
>
>> violates several principles of least supprise,
> This is just invective.
/me googles and discovered a new word. I stand by my statement.
It requires the user to embed one structure inside another structure
(with half a undocumented magic name), under a specific undocumented
field name, and have three functions (with half undocumented magic
names) in scope with undocumented types. It also mandates an original
copy of the half-magically-named struct in scope to be partially
initialised, just to have another copy created in the heap.
The error handling is also broken; It will follow a wild function
pointer, if vtable is not the first element in the structure (again
undocumented).
This macro is not fit for any purpose it attempts to perform.
https://github.com/xenserver/xen-4.5.pg/blob/master/master/xenguest.patch#L609
is the correct way to use a setup like this, even if it does require
embedding other data alongside it.
>
>> and can literally only be
>> used by its sole user in xtl_logger_stdio.c because of its internal
>> expectations of xentoollog_logger_stdiostream. (Its sole user could do
>> the above in a cleaner manner anyway.)
> There is only one place in tree that calls this because there are only
> two in-tree loggers and the other one
> (tools/ocaml/libs/xentoollog/xentoollog_stubs.c) chose not to use it.
> It seems to me that stub_xtl_create_logger could use this macro.
Or better yet, ditch it completely.
All that needs to happen is for struct xentoollog_logger to have the
three function pointers filled in appropriately. This in turn does not
mandate that the structure is allocated from the heap, or the prescribed
layout/naming scheme.
>
>> As part of the tidyup, we should choose a particular C standard (89,
>> probably) and ensure that the API/ABI complies with `gcc -std=c$VER
>> -pedantic`. This will help to provide a consistent API on other
>> platforms (I seem to recall an effort to port libvchan to windows.)
> -pedantic is certainly a bad idea.
Pedantic is absolutely the correct answer. It will cause gcc to reject
any non C compliant statements.
The APIs of each of these new libraries should be just as usable on
windows systems as Linux systems.
~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |