[libc-commits] [libc] bcc2021 - [libc] Prevent changing ownership of the port once opened

Joseph Huber via libc-commits libc-commits at lists.llvm.org
Wed May 10 16:34:37 PDT 2023


Author: Joseph Huber
Date: 2023-05-10T18:34:29-05:00
New Revision: bcc2021efdab6148fed03899648731e1cda8cfa8

URL: https://github.com/llvm/llvm-project/commit/bcc2021efdab6148fed03899648731e1cda8cfa8
DIFF: https://github.com/llvm/llvm-project/commit/bcc2021efdab6148fed03899648731e1cda8cfa8.diff

LOG: [libc] Prevent changing ownership of the port once opened

The Port type has stipuations that the same exact mask used to open it
needs to close it. This can currently be violated by calling its move
constructor to put it somewhere else. We still need the move constructor
to handle the open and closing functions. So, we simply make these
constructors private and only allow a few classes to have move
priviledges on it.

Reviewed By: JonChesterfield, lntue

Differential Revision: https://reviews.llvm.org/D150118

Added: 
    

Modified: 
    libc/src/__support/RPC/rpc.h

Removed: 
    


################################################################################
diff  --git a/libc/src/__support/RPC/rpc.h b/libc/src/__support/RPC/rpc.h
index 55ce6700380f5..ae905bccbc657 100644
--- a/libc/src/__support/RPC/rpc.h
+++ b/libc/src/__support/RPC/rpc.h
@@ -250,16 +250,22 @@ template <bool InvertInbox> struct Process {
 /// processes. A port is conceptually an index into the memory provided by the
 /// underlying process that is guarded by a lock bit.
 template <bool T> struct Port {
-  // TODO: This should be move-only.
   LIBC_INLINE Port(Process<T> &process, uint64_t lane_mask, uint64_t index,
                    uint32_t out)
       : process(process), lane_mask(lane_mask), index(index), out(out) {}
+  LIBC_INLINE ~Port() = default;
+
+private:
   LIBC_INLINE Port(const Port &) = delete;
   LIBC_INLINE Port &operator=(const Port &) = delete;
   LIBC_INLINE Port(Port &&) = default;
   LIBC_INLINE Port &operator=(Port &&) = default;
-  LIBC_INLINE ~Port() = default;
 
+  friend struct Client;
+  friend struct Server;
+  friend class cpp::optional<Port<T>>;
+
+public:
   template <typename U> LIBC_INLINE void recv(U use);
   template <typename F> LIBC_INLINE void send(F fill);
   template <typename F, typename U>


        


More information about the libc-commits mailing list