No functional change intended.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to trunk as r16-5206-g69b484f9481f53.

gcc/ChangeLog:
        * diagnostics/sarif-sink.cc (class unique_fd): New.
        (sarif_socket_sink::sarif_socket_sink): Convert "fd" arg and m_fd
        from int to unique_fd.
        (~sarif_socket_sink): Drop.
        (sarif_socket_sink::dump_kind): Update for m_fd becoming a
        unique_fd.
        (sarif_socket_sink::m_fd): Convert from "int" to "unique_fd".
        (maybe_open_sarif_sink_for_socket): Likewise for "sfd".

Signed-off-by: David Malcolm <[email protected]>
---
 gcc/diagnostics/sarif-sink.cc | 48 +++++++++++++++++++++++++++--------
 1 file changed, 38 insertions(+), 10 deletions(-)

diff --git a/gcc/diagnostics/sarif-sink.cc b/gcc/diagnostics/sarif-sink.cc
index ac0a27472551..6ca02b23c0f9 100644
--- a/gcc/diagnostics/sarif-sink.cc
+++ b/gcc/diagnostics/sarif-sink.cc
@@ -4126,6 +4126,38 @@ private:
   output_file m_output_file;
 };
 
+class unique_fd
+{
+public:
+  unique_fd () : m_ival (-1) {}
+  explicit unique_fd (int ival) : m_ival (ival) {}
+  unique_fd (const unique_fd &) = delete;
+  unique_fd (unique_fd &&other)
+  : m_ival (other.m_ival)
+  {
+    other.m_ival = -1;
+  }
+  ~unique_fd ()
+  {
+    if (m_ival != -1)
+      close (m_ival);
+  }
+  unique_fd &operator= (const unique_fd &other) = delete;
+  unique_fd &operator= (unique_fd &&other)
+  {
+    if (m_ival != -1)
+      close (m_ival);
+    m_ival = other.m_ival;
+    other.m_ival = -1;
+    return *this;
+  }
+
+  operator int () const { return m_ival; }
+
+private:
+  int m_ival;
+};
+
 class sarif_socket_sink : public sarif_sink
 {
 public:
@@ -4133,20 +4165,16 @@ public:
                     const line_maps *line_maps,
                     std::unique_ptr<sarif_serialization_format> 
serialization_format,
                     const sarif_generation_options &sarif_gen_opts,
-                    int fd)
+                    unique_fd fd)
   : sarif_sink (dc, line_maps,
                std::move (serialization_format),
                sarif_gen_opts),
-    m_fd (fd)
-  {
-  }
-  ~sarif_socket_sink ()
+    m_fd (std::move (fd))
   {
-    close (m_fd);
   }
   void dump_kind (FILE *out) const override
   {
-    fprintf (out, "sarif_socket_sink: fd=%i", m_fd);
+    fprintf (out, "sarif_socket_sink: fd=%i", int (m_fd));
   }
   bool machine_readable_stderr_p () const final override
   {
@@ -4210,7 +4238,7 @@ private:
     free (buf);
   }
 
-  int m_fd;
+  unique_fd m_fd;
 };
 
 /* Print the start of an embedded link to PP, as per 3.11.6.  */
@@ -4548,7 +4576,7 @@ maybe_open_sarif_sink_for_socket (context &dc)
   if (!socket_name)
     return;
 
-  int sfd = socket (AF_UNIX, SOCK_STREAM, 0);
+  unique_fd sfd (socket (AF_UNIX, SOCK_STREAM, 0));
   if (sfd == -1)
     fatal_error (UNKNOWN_LOCATION,
                 "unable to create socket");
@@ -4574,7 +4602,7 @@ maybe_open_sarif_sink_for_socket (context &dc)
      line_table,
      std::make_unique <sarif_serialization_format_json> (true),
      sarif_gen_opts,
-     sfd);
+     std::move (sfd));
   sink_->update_printer ();
   dc.add_sink (std::move (sink_));
 }
-- 
2.26.3

Reply via email to