[UNIX] Simplify the file descriptor handling in SharedMemory
[WebKit-https.git] / Source / WebKit2 / Platform / SharedMemory.h
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef SharedMemory_h
27 #define SharedMemory_h
28
29 #include <wtf/Forward.h>
30 #include <wtf/Noncopyable.h>
31 #include <wtf/RefCounted.h>
32
33 #if PLATFORM(GTK) || PLATFORM(EFL)
34 #include "Attachment.h"
35 #include <wtf/text/WTFString.h>
36 #endif
37
38 namespace IPC {
39 class ArgumentDecoder;
40 class ArgumentEncoder;
41 }
42
43 #if OS(DARWIN)
44 namespace WebCore {
45 class MachSendRight;
46 }
47 #endif
48
49 namespace WebKit {
50
51 class SharedMemory : public RefCounted<SharedMemory> {
52 public:
53     enum class Protection {
54         ReadOnly,
55         ReadWrite
56     };
57
58     class Handle {
59         WTF_MAKE_NONCOPYABLE(Handle);
60     public:
61         Handle();
62         ~Handle();
63
64         bool isNull() const;
65
66         void clear();
67
68         void encode(IPC::ArgumentEncoder&) const;
69         static bool decode(IPC::ArgumentDecoder&, Handle&);
70
71 #if USE(UNIX_DOMAIN_SOCKETS)
72         IPC::Attachment releaseAttachment() const;
73         void adoptAttachment(IPC::Attachment&&);
74 #endif
75     private:
76         friend class SharedMemory;
77 #if OS(DARWIN)
78         mutable mach_port_t m_port;
79         size_t m_size;
80 #elif USE(UNIX_DOMAIN_SOCKETS)
81         mutable IPC::Attachment m_attachment;
82 #endif
83     };
84
85     static RefPtr<SharedMemory> allocate(size_t);
86     static RefPtr<SharedMemory> create(void*, size_t, Protection);
87     static RefPtr<SharedMemory> map(const Handle&, Protection);
88
89     ~SharedMemory();
90
91     bool createHandle(Handle&, Protection);
92
93     size_t size() const { return m_size; }
94     void* data() const
95     {
96         ASSERT(m_data);
97         return m_data;
98     }
99
100     // Return the system page size in bytes.
101     static unsigned systemPageSize();
102
103 private:
104 #if OS(DARWIN)
105     WebCore::MachSendRight createSendRight(Protection) const;
106 #endif
107
108     size_t m_size;
109     void* m_data;
110     Protection m_protection;
111
112 #if OS(DARWIN)
113     mach_port_t m_port;
114 #elif USE(UNIX_DOMAIN_SOCKETS)
115     int m_fileDescriptor;
116 #endif
117 };
118
119 };
120
121 #endif // SharedMemory_h