Codebase list mozc / 5afb412
Resolve mutual dependency of base/mmap. Move SystemUtil::MaybeMLock and SystemUtil::MaybeMUnlock to Mmap to resolve the mutual dependency of base/mmap on base/file_util and base/system_util. By this CL, base/mmap becomes a single build target. BUG=none TEST=unittest Noriyuki Takahashi authored 8 years ago Yohei Yukawa committed 8 years ago
10 changed file(s) with 82 addition(s) and 84 deletion(s). Raw diff Collapse all Expand all
3636
3737 #include "base/file_stream.h"
3838 #include "base/logging.h"
39 #include "base/mmap.h"
4039 #include "base/number_util.h"
4140 #include "base/util.h"
4241 #include "testing/base/public/gunit.h"
4343
4444 #include "base/port.h"
4545 #include "base/logging.h"
46 #include "base/system_util.h"
4746 #include "base/util.h"
4847
4948 #ifdef OS_WIN
180179 return false;
181180 }
182181
183 SystemUtil::MaybeMLock(ptr, size_);
182 MaybeMLock(ptr, size_);
184183 text_ = reinterpret_cast<char *>(ptr);
185184 size_ = st.st_size;
186185 return true;
188187
189188 void Mmap::Close() {
190189 if (text_ != NULL) {
191 SystemUtil::MaybeMUnlock(text_, size_);
190 MaybeMUnlock(text_, size_);
192191 munmap(reinterpret_cast<char *>(text_), size_);
193192 }
194193
255254 }
256255 #endif // MOZC_USE_PEPPER_FILE_IO
257256
257 int Mmap::MaybeMLock(const void *addr, size_t len) {
258 // TODO(yukawa): Integrate mozc_cache service.
259 #if defined(OS_WIN) || defined(OS_ANDROID) || defined(__native_client__)
260 return -1;
261 #else // defined(OS_WIN) || defined(OS_ANDROID) ||
262 // defined(__native_client__)
263 return mlock(addr, len);
264 #endif // defined(OS_WIN) || defined(OS_ANDROID) ||
265 // defined(__native_client__)
266 }
267
268 int Mmap::MaybeMUnlock(const void *addr, size_t len) {
269 #if defined(OS_WIN) || defined(OS_ANDROID) || defined(__native_client__)
270 return -1;
271 #else // defined(OS_WIN) || defined(OS_ANDROID) ||
272 // defined(__native_client__)
273 return munlock(addr, len);
274 #endif // defined(OS_WIN) || defined(OS_ANDROID) ||
275 // defined(__native_client__)
276 }
277
258278 } // namespace mozc
3737 #include "base/port.h"
3838
3939 namespace mozc {
40
4041 class Mmap {
4142 public:
4243 Mmap();
43 ~Mmap() {
44 Close();
45 }
44 ~Mmap() { Close(); }
45
4646 bool Open(const char *filename, const char *mode = "r");
4747 void Close();
48
49 // Following mlock/munlock related functions work based on target environment.
50 // In the case of Android, Native Client, Windows, we don't want to call
51 // actual functions, so these functions do nothing and return -1. In other
52 // cases, these functions call actual mlock/munlock functions and return it's
53 // result.
54 // On Android, page-out is probably acceptable because
55 // - Smaller RAM on the device.
56 // - The storage is (usually) solid state thus page-in/out is expected to
57 // be faster.
58 // On Linux, in the kernel version >= 2.6.9, user process can mlock. In older
59 // kernel, it fails if the process is running in user priviledge.
60 // TODO(team): Check in mac that mlock is really necessary.
61 static int MaybeMLock(const void *addr, size_t len);
62 static int MaybeMUnlock(const void *addr, size_t len);
4863
4964 #ifndef MOZC_USE_PEPPER_FILE_IO
5065 char &operator[](size_t n) { return *(text_ + n); }
8196
8297 DISALLOW_COPY_AND_ASSIGN(Mmap);
8398 };
99
84100 } // namespace mozc
85101
86102 #endif // MOZC_BASE_MMAP_H_
9696 FileUtil::Unlink(filename);
9797 }
9898 }
99
100 #if defined(OS_WIN)
101 TEST(MmapTest, WindowsMaybeMLockTest) {
102 size_t data_len = 32;
103 void *addr = malloc(data_len);
104 EXPECT_EQ(-1, Mmap::MaybeMLock(addr, data_len));
105 EXPECT_EQ(-1, Mmap::MaybeMUnlock(addr, data_len));
106 free(addr);
107 }
108 #elif defined(OS_MACOSX)
109 TEST(MmapTest, MacMaybeMLockTest) {
110 size_t data_len = 32;
111 void *addr = malloc(data_len);
112 EXPECT_EQ(0, Mmap::MaybeMLock(addr, data_len));
113 EXPECT_EQ(0, Mmap::MaybeMUnlock(addr, data_len));
114 free(addr);
115 }
116 #else
117 TEST(MmapTest, LinuxMaybeMLockTest) {
118 size_t data_len = 32;
119 void *addr = malloc(data_len);
120 #if defined(OS_ANDROID) || defined(__native_client__)
121 EXPECT_EQ(-1, Mmap::MaybeMLock(addr, data_len));
122 EXPECT_EQ(-1, Mmap::MaybeMUnlock(addr, data_len));
123 #else
124 EXPECT_EQ(0, Mmap::MaybeMLock(addr, data_len));
125 EXPECT_EQ(0, Mmap::MaybeMUnlock(addr, data_len));
126 #endif // defined(OS_ANDROID) || defined(__native_client__)
127 free(addr);
128 }
129 #endif // OS_WIN, OS_MACOSX, else.
130
99131 } // namespace
100132 } // namespace mozc
6565 #include "base/win_util.h"
6666
6767 #ifdef OS_ANDROID
68 // HACK to avoid a bug in sysconf in android.
69 #include "android/jni/sysconf.h"
70 #define sysconf mysysconf
6871 #include "base/android_util.h"
6972 #endif // OS_ANDROID
7073
10711074 #endif // OS_WIN
10721075 }
10731076
1074 int SystemUtil::MaybeMLock(const void *addr, size_t len) {
1075 // TODO(yukawa): Integrate mozc_cache service.
1076 #if defined(OS_WIN) || defined(OS_ANDROID) || defined(__native_client__)
1077 return -1;
1078 #else // defined(OS_WIN) || defined(OS_ANDROID) ||
1079 // defined(__native_client__)
1080 return mlock(addr, len);
1081 #endif // defined(OS_WIN) || defined(OS_ANDROID) ||
1082 // defined(__native_client__)
1083 }
1084
1085 int SystemUtil::MaybeMUnlock(const void *addr, size_t len) {
1086 #if defined(OS_WIN) || defined(OS_ANDROID) || defined(__native_client__)
1087 return -1;
1088 #else // defined(OS_WIN) || defined(OS_ANDROID) ||
1089 // defined(__native_client__)
1090 return munlock(addr, len);
1091 #endif // defined(OS_WIN) || defined(OS_ANDROID) ||
1092 // defined(__native_client__)
1093 }
1094
10951077 } // namespace mozc
208208 // check endian-ness at runtime.
209209 static bool IsLittleEndian();
210210
211 // Following mlock/munlock related functions work based on target environment.
212 // In the case of Android, Native Client, Windows, we don't want to call
213 // actual functions, so these functions do nothing and return -1. In other
214 // cases, these functions call actual mlock/munlock functions and return it's
215 // result.
216 // On Android, page-out is probably acceptable because
217 // - Smaller RAM on the device.
218 // - The storage is (usually) solid state thus page-in/out is expected to
219 // be faster.
220 // On Linux, in the kernel version >= 2.6.9, user process can mlock. In older
221 // kernel, it fails if the process is running in user priviledge.
222 // TODO(horo): Check in mac that mlock is really necessary.
223 static int MaybeMLock(const void *addr, size_t len);
224
225 static int MaybeMUnlock(const void *addr, size_t len);
226
227211 private:
228212 DISALLOW_IMPLICIT_CONSTRUCTORS(SystemUtil);
229213 };
238238 }
239239 #endif // OS_ANDROID
240240
241 #ifdef OS_WIN
242 TEST_F(SystemUtilTest, WindowsMaybeMLockTest) {
243 size_t data_len = 32;
244 void *addr = malloc(data_len);
245 EXPECT_EQ(-1, SystemUtil::MaybeMLock(addr, data_len));
246 EXPECT_EQ(-1, SystemUtil::MaybeMUnlock(addr, data_len));
247 free(addr);
248 }
249 #endif // OS_WIN
250
251 #ifdef OS_MACOSX
252 TEST_F(SystemUtilTest, MacMaybeMLockTest) {
253 size_t data_len = 32;
254 void *addr = malloc(data_len);
255 EXPECT_EQ(0, SystemUtil::MaybeMLock(addr, data_len));
256 EXPECT_EQ(0, SystemUtil::MaybeMUnlock(addr, data_len));
257 free(addr);
258 }
259 #endif // OS_MACOSX
260
261 TEST_F(SystemUtilTest, LinuxMaybeMLockTest) {
262 size_t data_len = 32;
263 void *addr = malloc(data_len);
264 #ifdef OS_LINUX
265 #if defined(OS_ANDROID) || defined(__native_client__)
266 EXPECT_EQ(-1, SystemUtil::MaybeMLock(addr, data_len));
267 EXPECT_EQ(-1, SystemUtil::MaybeMUnlock(addr, data_len));
268 #else
269 EXPECT_EQ(0, SystemUtil::MaybeMLock(addr, data_len));
270 EXPECT_EQ(0, SystemUtil::MaybeMUnlock(addr, data_len));
271 #endif // defined(OS_ANDROID) || defined(__native_client__)
272 #endif // OS_LINUX
273 free(addr);
274 }
275
276241 } // namespace mozc
5555 #include <vector>
5656
5757 #include "base/logging.h"
58 #include "base/mmap.h"
5859 #include "base/port.h"
5960 #include "base/string_piece.h"
60 #include "base/system_util.h"
6161 #include "base/util.h"
6262 #include "dictionary/dictionary_token.h"
6363 #include "dictionary/file/dictionary_file.h"
597597 // has the priviledge to mlock.
598598 // Note that we don't munlock the space because it's always better to keep
599599 // the singleton system dictionary paged in as long as the process runs.
600 SystemUtil::MaybeMLock(spec_->ptr, spec_->len);
600 Mmap::MaybeMLock(spec_->ptr, spec_->len);
601601 if (!instance->dictionary_file_->OpenFromImage(spec_->ptr, spec_->len)) {
602602 LOG(ERROR) << "Failed to open system dictionary image";
603603 return NULL;
3333 #include <string>
3434
3535 #include "base/logging.h"
36 #include "base/mmap.h"
3637 #include "base/port.h"
3738 #include "base/string_piece.h"
38 #include "base/system_util.h"
3939 #include "dictionary/dictionary_token.h"
4040 #include "dictionary/file/dictionary_file.h"
4141 #include "dictionary/pos_matcher.h"
7979 // has the priviledge to mlock.
8080 // Note that we don't munlock the space because it's always better to keep
8181 // the singleton system dictionary paged in as long as the process runs.
82 SystemUtil::MaybeMLock(ptr, len);
82 Mmap::MaybeMLock(ptr, len);
8383 scoped_ptr<ValueDictionary> instance(new ValueDictionary(pos_matcher));
8484 DCHECK(instance.get());
8585 if (!instance->dictionary_file_->OpenFromImage(ptr, len)) {
00 MAJOR=2
11 MINOR=17
2 BUILD=2097
2 BUILD=2098
33 REVISION=102
44 # NACL_DICTIONARY_VERSION is the target version of the system dictionary to be
55 # downloaded by NaCl Mozc.