This allows slight code simplifications across the tree.

Signed-off-by: Ben Pfaff <b...@ovn.org>
---
 lib/ovsdb-data.c     |  5 ++---
 lib/ovsdb-error.c    | 29 +++++++++++++++++++++++------
 lib/ovsdb-error.h    |  3 ++-
 lib/ovsdb-idl.c      |  9 +++------
 ovsdb/file.c         |  7 ++-----
 ovsdb/ovsdb-server.c |  6 ++----
 tests/test-ovsdb.c   | 18 ++++++------------
 7 files changed, 40 insertions(+), 37 deletions(-)

diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c
index 5d560fd98b24..3ddf5f5bd539 100644
--- a/lib/ovsdb-data.c
+++ b/lib/ovsdb-data.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010, 2011, 2012, 2014, 2016 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2012, 2014, 2016, 2017 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -664,8 +664,7 @@ ovsdb_atom_from_string(union ovsdb_atom *atom,
             free(*range_end_atom);
             *range_end_atom = NULL;
         }
-        msg = ovsdb_error_to_string(error);
-        ovsdb_error_destroy(error);
+        msg = ovsdb_error_to_string_free(error);
     }
     return msg;
 }
diff --git a/lib/ovsdb-error.c b/lib/ovsdb-error.c
index d8161e6d7b9a..9b1af68c6ca3 100644
--- a/lib/ovsdb-error.c
+++ b/lib/ovsdb-error.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010, 2011, 2012, 2016 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2012, 2016, 2017 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -153,11 +153,9 @@ ovsdb_internal_error(struct ovsdb_error *inner_error,
     ds_put_format(&ds, " (%s %s)", program_name, VERSION);
 
     if (inner_error) {
-        char *s = ovsdb_error_to_string(inner_error);
+        char *s = ovsdb_error_to_string_free(inner_error);
         ds_put_format(&ds, " (generated from: %s)", s);
         free(s);
-
-        ovsdb_error_destroy(inner_error);
     }
 
     error = ovsdb_error("internal error", "%s", ds_cstr(&ds));
@@ -223,6 +221,8 @@ ovsdb_error_to_json(const struct ovsdb_error *error)
     return json;
 }
 
+/* Returns 'error' converted to a string suitable for use as an error message.
+ * The caller must free the returned string (with free()). */
 char *
 ovsdb_error_to_string(const struct ovsdb_error *error)
 {
@@ -240,6 +240,24 @@ ovsdb_error_to_string(const struct ovsdb_error *error)
     return ds_steal_cstr(&ds);
 }
 
+/* Returns 'error' converted to a string suitable for use as an error message.
+ * The caller must free the returned string (with free()).
+ *
+ * If 'error' is NULL, returns NULL.
+ *
+ * Also, frees 'error'. */
+char *
+ovsdb_error_to_string_free(struct ovsdb_error *error)
+{
+    if (error) {
+        char *s = ovsdb_error_to_string(error);
+        ovsdb_error_destroy(error);
+        return s;
+    } else {
+        return NULL;
+    }
+}
+
 const char *
 ovsdb_error_get_tag(const struct ovsdb_error *error)
 {
@@ -254,9 +272,8 @@ ovsdb_error_assert(struct ovsdb_error *error)
 {
     if (error) {
         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
-        char *s = ovsdb_error_to_string(error);
+        char *s = ovsdb_error_to_string_free(error);
         VLOG_ERR_RL(&rl, "unexpected ovsdb error: %s", s);
         free(s);
-        ovsdb_error_destroy(error);
     }
 }
diff --git a/lib/ovsdb-error.h b/lib/ovsdb-error.h
index da91b74999d1..ff9b889a8687 100644
--- a/lib/ovsdb-error.h
+++ b/lib/ovsdb-error.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010, 2011 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2016, 2017 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -64,6 +64,7 @@ struct ovsdb_error *ovsdb_error_clone(const struct 
ovsdb_error *)
     OVS_WARN_UNUSED_RESULT;
 
 char *ovsdb_error_to_string(const struct ovsdb_error *);
+char *ovsdb_error_to_string_free(struct ovsdb_error *);
 struct json *ovsdb_error_to_json(const struct ovsdb_error *);
 
 const char *ovsdb_error_get_tag(const struct ovsdb_error *);
diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
index 2a3405b6f93a..96e5c1f58bbf 100644
--- a/lib/ovsdb-idl.c
+++ b/lib/ovsdb-idl.c
@@ -1455,10 +1455,9 @@ ovsdb_idl_send_schema_request(struct ovsdb_idl *idl)
 static void
 log_error(struct ovsdb_error *error)
 {
-    char *s = ovsdb_error_to_string(error);
+    char *s = ovsdb_error_to_string_free(error);
     VLOG_WARN("error parsing database schema: %s", s);
     free(s);
-    ovsdb_error_destroy(error);
 }
 
 /* Frees 'schema', which is in the format returned by parse_schema(). */
@@ -1976,12 +1975,11 @@ ovsdb_idl_row_change__(struct ovsdb_idl_row *row, const 
struct json *row_json,
 
             ovsdb_datum_destroy(&datum, &column->type);
         } else {
-            char *s = ovsdb_error_to_string(error);
+            char *s = ovsdb_error_to_string_free(error);
             VLOG_WARN_RL(&syntax_rl, "error parsing column %s in row "UUID_FMT
                          " in table %s: %s", column_name,
                          UUID_ARGS(&row->uuid), table->class_->name, s);
             free(s);
-            ovsdb_error_destroy(error);
         }
     }
     return changed;
@@ -4186,11 +4184,10 @@ ovsdb_idl_txn_process_insert_reply(struct 
ovsdb_idl_txn_insert *insert,
 
     error = ovsdb_atom_from_json(&uuid, &uuid_type, json_uuid, NULL);
     if (error) {
-        char *s = ovsdb_error_to_string(error);
+        char *s = ovsdb_error_to_string_free(error);
         VLOG_WARN_RL(&syntax_rl, "\"insert\" reply \"uuid\" is not a JSON "
                      "UUID: %s", s);
         free(s);
-        ovsdb_error_destroy(error);
         return false;
     }
 
diff --git a/ovsdb/file.c b/ovsdb/file.c
index 6a406da2a838..2f07bba3d30c 100644
--- a/ovsdb/file.c
+++ b/ovsdb/file.c
@@ -237,11 +237,9 @@ ovsdb_file_open__(const char *file_name,
         /* Log error but otherwise ignore it.  Probably the database just got
          * truncated due to power failure etc. and we should use its current
          * contents. */
-        char *msg = ovsdb_error_to_string(error);
+        char *msg = ovsdb_error_to_string_free(error);
         VLOG_ERR("%s", msg);
         free(msg);
-
-        ovsdb_error_destroy(error);
     }
 
     if (!read_only) {
@@ -608,8 +606,7 @@ ovsdb_file_commit(struct ovsdb_replica *replica,
     {
         error = ovsdb_file_compact(file);
         if (error) {
-            char *s = ovsdb_error_to_string(error);
-            ovsdb_error_destroy(error);
+            char *s = ovsdb_error_to_string_free(error);
             VLOG_WARN("%s: compacting database failed (%s), retrying in "
                       "%d seconds",
                       file->file_name, s, COMPACT_RETRY_MSEC / 1000);
diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c
index 1e0c20486e38..4754a517d316 100644
--- a/ovsdb/ovsdb-server.c
+++ b/ovsdb/ovsdb-server.c
@@ -916,10 +916,9 @@ update_remote_status(const struct ovsdb_jsonrpc_server 
*jsonrpc,
         db = node->data;
         error = ovsdb_txn_commit(db->txn, false);
         if (error) {
-            char *msg = ovsdb_error_to_string(error);
+            char *msg = ovsdb_error_to_string_free(error);
             VLOG_ERR_RL(&rl, "Failed to update remote status: %s", msg);
             free(msg);
-            ovsdb_error_destroy(error);
         }
     }
 }
@@ -1157,10 +1156,9 @@ ovsdb_server_compact(struct unixctl_conn *conn, int argc,
 
             error = ovsdb_file_compact(db->file);
             if (error) {
-                char *s = ovsdb_error_to_string(error);
+                char *s = ovsdb_error_to_string_free(error);
                 ds_put_format(&reply, "%s\n", s);
                 free(s);
-                ovsdb_error_destroy(error);
             }
 
             n++;
diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
index 5037258cd4c8..cf9ad0c1938d 100644
--- a/tests/test-ovsdb.c
+++ b/tests/test-ovsdb.c
@@ -269,8 +269,7 @@ print_and_free_json(struct json *json)
 static void
 print_and_free_ovsdb_error(struct ovsdb_error *error)
 {
-    char *string = ovsdb_error_to_string(error);
-    ovsdb_error_destroy(error);
+    char *string = ovsdb_error_to_string_free(error);
     puts(string);
     free(string);
 }
@@ -279,8 +278,7 @@ static void
 check_ovsdb_error(struct ovsdb_error *error)
 {
     if (error) {
-        char *s = ovsdb_error_to_string(error);
-        ovsdb_error_destroy(error);
+        char *s = ovsdb_error_to_string_free(error);
         ovs_fatal(0, "%s", s);
     }
 }
@@ -344,10 +342,9 @@ do_log_io(struct ovs_cmdl_context *ctx)
             ovs_fatal(0, "unknown log-io command \"%s\"", command);
         }
         if (error) {
-            char *s = ovsdb_error_to_string(error);
+            char *s = ovsdb_error_to_string_free(error);
             printf("%s: %s failed: %s\n", name, command, s);
             free(s);
-            ovsdb_error_destroy(error);
         } else {
             printf("%s: %s successful\n", name, command);
         }
@@ -450,8 +447,7 @@ do_diff_data(struct ovs_cmdl_context *ctx)
         /* Apply diff to 'old' to create'reincarnation'. */
         error = ovsdb_datum_apply_diff(&reincarnation, &old, &diff, &type);
         if (error) {
-            char *string = ovsdb_error_to_string(error);
-            ovsdb_error_destroy(error);
+            char *string = ovsdb_error_to_string_free(error);
             ovs_fatal(0, "%s", string);
         }
 
@@ -873,10 +869,9 @@ do_parse_conditions(struct ovs_cmdl_context *ctx)
         if (!error) {
             print_and_free_json(ovsdb_condition_to_json(&cnd));
         } else {
-            char *s = ovsdb_error_to_string(error);
+            char *s = ovsdb_error_to_string_free(error);
             ovs_error(0, "%s", s);
             free(s);
-            ovsdb_error_destroy(error);
             exit_code = 1;
         }
         json_destroy(json);
@@ -1044,10 +1039,9 @@ do_parse_mutations(struct ovs_cmdl_context *ctx)
         if (!error) {
             print_and_free_json(ovsdb_mutation_set_to_json(&set));
         } else {
-            char *s = ovsdb_error_to_string(error);
+            char *s = ovsdb_error_to_string_free(error);
             ovs_error(0, "%s", s);
             free(s);
-            ovsdb_error_destroy(error);
             exit_code = 1;
         }
         json_destroy(json);
-- 
2.10.2

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to