blob: 3d53b58b64572e4713fd33de62557ca094d65f83 [file] [log] [blame]
The Android Open Source Project52d4c302009-03-03 19:29:09 -08001//
2// Copyright 2005 The Android Open Source Project
3//
4// Inter-process shared memory.
5//
6#ifndef __LIBS_SHMEM_H
7#define __LIBS_SHMEM_H
8
9#ifdef HAVE_ANDROID_OS
10#error DO NOT USE THIS FILE IN THE DEVICE BUILD
11#endif
12
13#include "Semaphore.h"
14
15namespace android {
16
17/*
18 * Platform-independent shared memory. Each object can be used to
19 * create a chunk of memory that is shared between processes.
20 *
21 * For convenience, a semaphore is associated with each segment.
22 * (Whether this should have been done in a subclass is debatable.)
23 *
24 * The "key" is usually the process ID of the process that created the
25 * segment. The goal is to avoid clashing with other processes that are
26 * trying to do the same thing. It's a little awkward to use when you
27 * want to have multiple shared segments created in one process. In
28 * SysV you can work around this by using a "private" key and sharing
29 * the shmid with your friends, in Win32 you can use a string, but we're
30 * in lowest-common-denominator mode here. Assuming we have 16-bit PIDs,
31 * the upper 16 bits can be used to serialize keys.
32 *
33 * When the object goes out of scope, the shared memory segment is
34 * detached from the process. If the object was responsible for creating
35 * the segment, it is also marked for destruction on SysV systems. This
36 * will make it impossible for others to attach to.
37 *
38 * On some systems, the length returned by getLength() may be different
39 * for parent and child due to page size rounding.
40 */
41class Shmem {
42public:
43 Shmem(void);
44 virtual ~Shmem(void);
45
46 /*
47 * Create a new shared memory segment, with the specified size. If
48 * "deleteExisting" is set, any existing segment will be deleted first
49 * (useful for SysV IPC).
50 *
51 * Returns "true" on success, "false" on failure.
52 */
53 bool create(int key, long size, bool deleteExisting);
54
55 /*
56 * Attach to a shared memory segment. Use this from the process that
57 * didn't create the segment.
58 *
59 * Returns "true" on success, "false" on failure.
60 */
61 bool attach(int key);
62
63 /*
64 * Get the memory segment address and length. These will not change
65 * for the lifetime of the object, so it's okay to cache the results.
66 *
67 * On failure, getAddr() returns NULL and getLength() returns -1.
68 */
69 void* getAddr(void);
70 long getLength(void);
71
72 /*
73 * Lock or unlock the shared memory segment. This is useful if you
74 * are updating pieces of shared data. The segment is initially
75 * "unlocked".
76 *
77 * This does *not* lock down the segment in the virtual paging system.
78 * It's just a mutex.
79 */
80 void lock(void);
81 void unlock(void);
82 bool tryLock(void);
83
84private:
85 Semaphore mSem; // uses the same value for "key"
86 unsigned long mHandle; // shmid(int) or HANDLE
87 void* mAddr; // address
88 long mLength; // length of segment (cached)
89 bool mCreator; // true if we created the segment
90 int mKey; // key passed in as arg
91};
92
93}; // namespace android
94
95#endif // __LIBS_SHMEM_H