[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 12/15] libxl: Use GC_INIT and GC_FREE everywhere



Ian Campbell writes ("Re: [Xen-devel] [PATCH 12/15] libxl: Use GC_INIT and 
GC_FREE everywhere"):
> On Mon, 2011-12-05 at 18:10 +0000, Ian Jackson wrote:
> >     GC_FREE;
> 
> I suppose this really relates to the earlier patch which adds these
> macros but wouldn't "GC_FREE();" be nicer?

I don't normally write zero-adic statement macros that way.  I guess
this is just one of those stylistic points like whether to put parens
around the argument to return.

We don't currently have any other zero-adic statement macros in libxl,
nor any macros which depend on or introduce names in the caller's
namespace, apart from those we inherit from flex.

My personal view is that non-hygienic statement macros are unusual
enough that it's worth drawing attention to them by using a special
syntax.  After all, their semantics are not normally very like
functions because they refer to objects, including local variables,
not explicitly named in the call.  Often they declare variables or
labels, and those kinds of statements don't contain any ().  So I
think the empty () are misleading - they hint that the thing is a
function, when it really isn't enough like a function.

In the rest of the xen tree we seem to have these without the "()" [1]:
    tools/libxen/test/test_event_handling.c:        CLEANUP;
    tools/blktap2/drivers/lock.c:                XSLEEP;
and these with the "()" [2]:
    xen/drivers/acpi/osl.c:         BUG();
    xen/arch/ia64/asm-offsets.c:    BLANK();
    xen/common/inflate.c:    NEXTBYTE();

Of these:

 CLEANUP    non-hygienic block
 NEXTBYTE() non-hygienic block wrapped up in () to make it an expression
 XSLEEP     hygienic expression (a call to usleep)
 BUG()      hygienic expression (a call to asm)
 BLANK()    something in some kind of table, not really relevant here

This doesn't seem to provide any consistent rule.

Perhaps the right answer is a patch to the coding standard.  One
option for this below.  This is a bit of a bikeshed issue of course.

Ian.

[1] find * -name \*.c | xargs egrep '^[   ]*[A-Z][A-Z]*\;' |less
[2] find * -name \*.c | xargs egrep '^[   ]*[A-Z][A-Z]*\(\)' |less
  in both cases only one hit per macro mentioned


diff --git a/tools/libxl/CODING_STYLE b/tools/libxl/CODING_STYLE
index 110a48f..69fedb9 100644
--- a/tools/libxl/CODING_STYLE
+++ b/tools/libxl/CODING_STYLE
@@ -133,3 +133,25 @@ Rationale: a consistent (except for functions...) bracing 
style reduces
 ambiguity and avoids needless churn when lines are added or removed.
 Furthermore, it is the libxenlight coding style.
 
+
+6. Macros
+
+Naturally, macros (other than function-like ones which can be used
+just like functions eg evaluate their arguments each exactly once
+etc.) should be named in ALL_CAPITALS.  Expansions, and references to
+arguments should be protected with appropriate ( ), and code
+with appropriate do{ ... }while(0) blocks.
+
+A zero-argument macro which expands to a non-constant expression, or
+to an ordinary block, should be defined with empty parens like this:
+  #define MACRO() ....
+
+A zero-argument macro which expands to a constant expression; or whose
+expansion relies on (or introduces) declarations, labels, etc., in the
+containing scope; or which expands to another kind of code fragment,
+should be defined like this:
+  #define MACRO ...
+
+Macros expanding to declarations and/or statements should not include
+any trailing ";" so that they may be used like this:
+  MACRO(arguments);

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.