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

[Xen-devel] [RFC OPW] libxl: Use LOG and LOGE macros in READ_WRITE_EXACTLY macro



The new coding style makes use of the LOG* family of convenience
macros. They rely on the availability of a libxl__gc gc*, but making
it available can make the code more complicated. In this case I
think it does so especially, and I'd like to ask if it's worth
changing in this case and in similar cases.

Suggested-by: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
Signed-off-by: Kelley Nielsen <kelleynnn@xxxxxxxxx>
---
 tools/libxl/libxl_utils.c | 30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index 135778f..4238316 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -363,33 +363,49 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char 
*filename,
 
 #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)                    \
                                                                           \
-  int libxl_##rw##_exactly(libxl_ctx *ctx, int fd,                 \
+  int libxl_##rw##_exactly(libxl_ctx *ctx, int fd,                        \
                            constdata void *data, ssize_t sz,              \
                            const char *source, const char *what) {        \
+      GC_INIT(ctx);                                                       \
       ssize_t got;                                                        \
+      int ret = 0;                                                            \
                                                                           \
       while (sz > 0) {                                                    \
           got = rw(fd, data, sz);                                         \
           if (got == -1) {                                                \
               if (errno == EINTR) continue;                               \
-              if (!ctx) return errno;                                     \
-              LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to " #rw " 
%s%s%s", \
+              if (!ctx)                                                   \
+             {                                                           \
+                 ret = errno;                                            \
+                 goto out;                                               \
+             }                                                           \
+              LOGE(ERROR, "failed to " #rw " %s%s%s",                     \
                            what?what:"", what?" from ":"", source);       \
-              return errno;                                               \
+              ret = errno;                                                \
+             goto out;                                                   \
           }                                                               \
           if (got == 0) {                                                 \
-              if (!ctx) return EPROTO;                                    \
-              LIBXL__LOG(ctx, LIBXL__LOG_ERROR,                                
   \
+              if (!ctx)                                                   \
+             {                                                           \
+                 ret = EPROTO;                                           \
+                 goto out;                                               \
+             }                                                           \
+              LOG(ERROR,                                                  \
                      zero_is_eof                                          \
                      ? "file/stream truncated reading %s%s%s"             \
                      : "file/stream write returned 0! writing %s%s%s",    \
                      what?what:"", what?" from ":"", source);             \
-              return EPROTO;                                              \
+              ret = EPROTO;                                               \
+             goto out;                                                   \
           }                                                               \
           sz -= got;                                                      \
           data = (char*)data + got;                                       \
       }                                                                   \
       return 0;                                                           \
+                                                                          \
+  out:                                                                    \
+      GC_FREE;                                                            \
+      return ret;                                                         \
   }
 
 READ_WRITE_EXACTLY(read, 1, /* */)
-- 
1.8.1.2


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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