forked from hypermodeinc/badger
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Separate darwin syscalls for mmap (hypermodeinc#1149)
Using the unix package by default for other systems instead of syscall. This way when systems get added to unix, they will work without change. And the special case is restricted only to darwin builds. I encountered problems building on Solaris prior to this patch: github.com/dgraph-io/badger/y/mmap_unix.go:57:30: undefined: syscall.SYS_MADVISE But unix.Madvise works fine on that platform (and others).
- Loading branch information
Showing
4 changed files
with
104 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
/* | ||
* Copyright 2019 Dgraph Labs, Inc. and Contributors | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package y | ||
|
||
import ( | ||
"os" | ||
) | ||
|
||
// Mmap uses the mmap system call to memory-map a file. If writable is true, | ||
// memory protection of the pages is set so that they may be written to as well. | ||
func Mmap(fd *os.File, writable bool, size int64) ([]byte, error) { | ||
return mmap(fd, writable, size) | ||
} | ||
|
||
// Munmap unmaps a previously mapped slice. | ||
func Munmap(b []byte) error { | ||
return munmap(b) | ||
} | ||
|
||
// Madvise uses the madvise system call to give advise about the use of memory | ||
// when using a slice that is memory-mapped to a file. Set the readahead flag to | ||
// false if page references are expected in random order. | ||
func Madvise(b []byte, readahead bool) error { | ||
return madvise(b, readahead) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
/* | ||
* Copyright 2019 Dgraph Labs, Inc. and Contributors | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package y | ||
|
||
import ( | ||
"os" | ||
"syscall" | ||
"unsafe" | ||
|
||
"golang.org/x/sys/unix" | ||
) | ||
|
||
// Mmap uses the mmap system call to memory-map a file. If writable is true, | ||
// memory protection of the pages is set so that they may be written to as well. | ||
func mmap(fd *os.File, writable bool, size int64) ([]byte, error) { | ||
mtype := unix.PROT_READ | ||
if writable { | ||
mtype |= unix.PROT_WRITE | ||
} | ||
return unix.Mmap(int(fd.Fd()), 0, int(size), mtype, unix.MAP_SHARED) | ||
} | ||
|
||
// Munmap unmaps a previously mapped slice. | ||
func munmap(b []byte) error { | ||
return unix.Munmap(b) | ||
} | ||
|
||
// This is required because the unix package does not support the madvise system call on OS X. | ||
func madvise(b []byte, readahead bool) error { | ||
advice := unix.MADV_NORMAL | ||
if !readahead { | ||
advice = unix.MADV_RANDOM | ||
} | ||
|
||
_, _, e1 := syscall.Syscall(syscall.SYS_MADVISE, uintptr(unsafe.Pointer(&b[0])), | ||
uintptr(len(b)), uintptr(advice)) | ||
if e1 != 0 { | ||
return e1 | ||
} | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters