diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-02-18 09:50:58 +0100 | 
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-02-18 09:50:58 +0100 | 
| commit | c072558b90f1bbedc2022b0f30c8b1ac4712538e (patch) | |
| tree | 67767591619e4bd8111fb05fac185cde94fb7378 /src/pkg/runtime/freebsd/mem.c | |
| parent | 5859517b767c99749a45651c15d4bae5520ebae8 (diff) | |
| download | golang-c072558b90f1bbedc2022b0f30c8b1ac4712538e.tar.gz | |
Imported Upstream version 2011.02.15upstream/2011.02.15
Diffstat (limited to 'src/pkg/runtime/freebsd/mem.c')
| -rw-r--r-- | src/pkg/runtime/freebsd/mem.c | 17 | 
1 files changed, 17 insertions, 0 deletions
| diff --git a/src/pkg/runtime/freebsd/mem.c b/src/pkg/runtime/freebsd/mem.c index cbae18718..f5bbfa6fa 100644 --- a/src/pkg/runtime/freebsd/mem.c +++ b/src/pkg/runtime/freebsd/mem.c @@ -33,6 +33,12 @@ runtime·SysFree(void *v, uintptr n)  void*  runtime·SysReserve(void *v, uintptr n)  { +	// On 64-bit, people with ulimit -v set complain if we reserve too +	// much address space.  Instead, assume that the reservation is okay +	// and check the assumption in SysMap. +	if(sizeof(void*) == 8) +		return v; +	  	return runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0);  } @@ -42,6 +48,17 @@ runtime·SysMap(void *v, uintptr n)  	void *p;  	mstats.sys += n; + +	// On 64-bit, we don't actually have v reserved, so tread carefully. +	if(sizeof(void*) == 8) { +		p = runtime·mmap(v, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, -1, 0); +		if(p != v) { +			runtime·printf("runtime: address space conflict: map(%v) = %v\n", v, p); +			runtime·throw("runtime: address space conflict"); +		} +		return; +	} +  	p = runtime·mmap(v, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_FIXED|MAP_PRIVATE, -1, 0);  	if(p != v)  		runtime·throw("runtime: cannot map pages in arena address space"); | 
