summaryrefslogtreecommitdiff
path: root/src/posix.c
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2013-12-11 15:02:20 -0800
committerRussell Belfer <rb@github.com>2013-12-11 15:02:20 -0800
commit7697e54176ccab22ed6d4597d7256e9a1e6ff202 (patch)
tree69c1bdd91bcf767b28bd6bc5ea9612084c1a765c /src/posix.c
parent8b22d862fb4419b219210027f18c1e97dd36fa8b (diff)
downloadlibgit2-7697e54176ccab22ed6d4597d7256e9a1e6ff202.tar.gz
Test cancel from indexer progress callback
This adds tests that try canceling an indexer operation from within the progress callback. After writing the tests, I wanted to run this under valgrind and had a number of errors in that situation because mmap wasn't working. I added a CMake option to force emulation of mmap and consolidated the Amiga-specific code into that new place (so we don't actually need separate Amiga code now, just have to turn on -DNO_MMAP). Additionally, I made the indexer code propagate error codes more reliably than it used to.
Diffstat (limited to 'src/posix.c')
-rw-r--r--src/posix.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/posix.c b/src/posix.c
index b75109b83..525785f35 100644
--- a/src/posix.c
+++ b/src/posix.c
@@ -203,4 +203,40 @@ int p_write(git_file fd, const void *buf, size_t cnt)
return 0;
}
+#ifdef NO_MMAP
+#include "map.h"
+
+int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset)
+{
+ GIT_MMAP_VALIDATE(out, len, prot, flags);
+
+ out->data = NULL;
+ out->len = 0;
+
+ if ((prot & GIT_PROT_WRITE) && ((flags & GIT_MAP_TYPE) == GIT_MAP_SHARED)) {
+ giterr_set(GITERR_OS, "Trying to map shared-writeable");
+ return -1;
+ }
+
+ out->data = malloc(len);
+ GITERR_CHECK_ALLOC(out->data);
+
+ if ((p_lseek(fd, offset, SEEK_SET) < 0) || ((size_t)p_read(fd, out->data, len) != len)) {
+ giterr_set(GITERR_OS, "mmap emulation failed");
+ return -1;
+ }
+
+ out->len = len;
+ return 0;
+}
+
+int p_munmap(git_map *map)
+{
+ assert(map != NULL);
+ free(map->data);
+
+ return 0;
+}
+
+#endif