Bug 559408: Arena pool macros to methods. (r=gal)
[mozilla-central.git] / ipc / glue / SharedMemorySysV.h
blob20b3a5e723fa111a4e5cc1822f18b0b3f6a9f8e4
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 * vim: sw=2 ts=8 et :
3 */
4 /* ***** BEGIN LICENSE BLOCK *****
5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
7 * The contents of this file are subject to the Mozilla Public License Version
8 * 1.1 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://www.mozilla.org/MPL/
12 * Software distributed under the License is distributed on an "AS IS" basis,
13 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14 * for the specific language governing rights and limitations under the
15 * License.
17 * The Original Code is Mozilla IPC.
19 * The Initial Developer of the Original Code is
20 * The Mozilla Foundation
21 * Portions created by the Initial Developer are Copyright (C) 2010
22 * the Initial Developer. All Rights Reserved.
24 * Contributor(s):
26 * Alternatively, the contents of this file may be used under the terms of
27 * either the GNU General Public License Version 2 or later (the "GPL"), or
28 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29 * in which case the provisions of the GPL or the LGPL are applicable instead
30 * of those above. If you wish to allow use of your version of this file only
31 * under the terms of either the GPL or the LGPL, and not to allow others to
32 * use your version of this file under the terms of the MPL, indicate your
33 * decision by deleting the provisions above and replace them with the notice
34 * and other provisions required by the GPL or the LGPL. If you do not delete
35 * the provisions above, a recipient may use your version of this file under
36 * the terms of any one of the MPL, the GPL or the LGPL.
38 * ***** END LICENSE BLOCK ***** */
40 #ifndef mozilla_ipc_SharedMemorySysV_h
41 #define mozilla_ipc_SharedMemorySysV_h
43 #ifdef OS_LINUX
45 // SysV shared memory isn't available on Windows, but we define the
46 // following macro so that #ifdefs are clearer (compared to #ifdef
47 // OS_LINUX).
48 #define MOZ_HAVE_SHAREDMEMORYSYSV
50 #include "SharedMemory.h"
52 #include "nsDebug.h"
54 #include <errno.h>
55 #include <fcntl.h>
56 #include <string.h>
57 #include <sys/ipc.h>
58 #include <sys/shm.h>
61 // This is a low-level wrapper around platform shared memory. Don't
62 // use it directly; use Shmem allocated through IPDL interfaces.
65 namespace mozilla {
66 namespace ipc {
69 class SharedMemorySysV : public SharedMemory
71 public:
72 typedef int Handle;
74 SharedMemorySysV() :
75 mHandle(-1),
76 mData(nsnull),
77 mSize(0)
81 SharedMemorySysV(Handle aHandle) :
82 mHandle(aHandle),
83 mData(nsnull),
84 mSize(0)
88 virtual ~SharedMemorySysV()
90 shmdt(mData);
91 mHandle = -1;
92 mData = nsnull;
93 mSize = 0;
97 NS_OVERRIDE
98 virtual bool Create(size_t aNbytes)
100 int id = shmget(IPC_PRIVATE, aNbytes, IPC_CREAT | 0600);
101 if (id == -1)
102 return false;
104 mHandle = id;
106 if (!Map(aNbytes))
107 return false;
109 return true;
112 NS_OVERRIDE
113 virtual bool Map(size_t nBytes)
115 // already mapped
116 if (mData)
117 return true;
119 if (!IsHandleValid(mHandle))
120 return false;
122 void* mem = shmat(mHandle, nsnull, 0);
123 if (mem == (void*) -1) {
124 char warning[256];
125 snprintf(warning, sizeof(warning)-1,
126 "shmat(): %s (%d)\n", strerror(errno), errno);
128 NS_WARNING(warning);
130 return false;
133 // Mark the handle as deleted so that, should this process go away, the
134 // segment is cleaned up.
135 shmctl(mHandle, IPC_RMID, 0);
137 mData = mem;
138 mSize = nBytes;
140 #ifdef NS_DEBUG
141 struct shmid_ds info;
142 if (shmctl(mHandle, IPC_STAT, &info) < 0)
143 return false;
145 NS_ABORT_IF_FALSE(nBytes <= info.shm_segsz,
146 "Segment doesn't have enough space!");
147 #endif
149 return true;
152 NS_OVERRIDE
153 virtual size_t Size() const
155 return mSize;
158 NS_OVERRIDE
159 virtual void* memory() const
161 return mData;
164 NS_OVERRIDE
165 virtual SharedMemoryType Type() const
167 return TYPE_SYSV;
170 Handle GetHandle() const
172 NS_ABORT_IF_FALSE(IsHandleValid(mHandle), "invalid handle");
173 return mHandle;
176 static Handle NULLHandle()
178 return -1;
181 static bool IsHandleValid(Handle aHandle)
183 return aHandle != -1;
186 private:
187 Handle mHandle;
188 void* mData;
189 size_t mSize;
192 } // namespace ipc
193 } // namespace mozilla
195 #endif // OS_LINUX
197 #endif // ifndef mozilla_ipc_SharedMemorySysV_h