aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-01-18 15:21:52 -0800
committerAlon Zakai <alonzakai@gmail.com>2012-01-18 15:21:52 -0800
commita14d24ce9c880bf0b6e46d8fbb7b1e4dbb9a308e (patch)
treeb594cced802b445b9176c249b0a1873b08919812
parente36ed341d217b86cdee5c483ce65e9a1208e794c (diff)
parent233113e07d42ed104eca9fc134e1e9894bc78305 (diff)
Merge branch 'master' into libcxx
-rw-r--r--src/library.js5
-rw-r--r--src/preamble.js7
-rw-r--r--system/include/bsd/sys/mman.h1
-rw-r--r--tests/runner.py33
4 files changed, 44 insertions, 2 deletions
diff --git a/src/library.js b/src/library.js
index 35466c10..5a429131 100644
--- a/src/library.js
+++ b/src/library.js
@@ -3184,7 +3184,9 @@ LibraryManager.library = {
* mmap.
*/
if (stream == -1) {
- return allocate(num, 'i8', ALLOC_NORMAL);
+ var ptr = _malloc(num);
+ _memset(ptr, 0, num);
+ return ptr;
}
var info = FS.streams[stream];
if (!info) return -1;
@@ -3195,6 +3197,7 @@ LibraryManager.library = {
munmap: function(start, num) {
_free(start);
+ return 0;
},
// TODO: Implement mremap.
diff --git a/src/preamble.js b/src/preamble.js
index 0b9288c4..5c5c21ea 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -462,9 +462,14 @@ function allocate(slab, types, allocator) {
var ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));
+ if (zeroinit) {
+ _memset(ret, 0, size);
+ return ret;
+ }
+
var i = 0, type;
while (i < size) {
- var curr = zeroinit ? 0 : slab[i];
+ var curr = slab[i];
if (typeof curr === 'function') {
curr = Runtime.getFunctionIndex(curr);
diff --git a/system/include/bsd/sys/mman.h b/system/include/bsd/sys/mman.h
index cf0d7582..3c92c289 100644
--- a/system/include/bsd/sys/mman.h
+++ b/system/include/bsd/sys/mman.h
@@ -38,6 +38,7 @@
#define _SYS_MMAN_H_
#include <stddef.h> /* XXX Emscripten for size_t */
+#include <sys/types.h> /* XXX Emscripten for C++ compilation, not just C */
/* XXX Emscripten #include <sys/_posix.h> */
diff --git a/tests/runner.py b/tests/runner.py
index 20a3ea29..30f5f62c 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -4001,6 +4001,39 @@ def process(filename):
}
'''
self.do_run(src, 'value:10')
+
+ def test_mmap(self):
+ src = '''
+ #include <stdio.h>
+ #include <sys/mman.h>
+ #include <assert.h>
+
+ int main(int argc, char *argv[]) {
+ const int NUM_BYTES = 8 * 1024 * 1024;
+ const int NUM_INTS = NUM_BYTES / sizeof(int);
+
+ int* map = (int*)mmap(0, NUM_BYTES, PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_ANON, -1, 0);
+ assert(map != MAP_FAILED);
+
+ int i;
+
+ for (i = 0; i < NUM_INTS; i++) {
+ map[i] = i;
+ }
+
+ for (i = 0; i < NUM_INTS; i++) {
+ assert(map[i] == i);
+ }
+
+ assert(munmap(map, NUM_BYTES) == 0);
+
+ printf("hello,world");
+ return 0;
+ }
+ '''
+ self.do_run(src, 'hello,world')
+ self.do_run(src, 'hello,world', force_c=True)
def test_cubescript(self):
if self.emcc_args is not None and '-O2' in self.emcc_args: