r7012@Kushana: nickm | 2006-08-03 19:21:25 -0700

Add an "mmap handle" type to encapsulate bookkeeping elements of mmap issues; add prelim win32 impl


svn:r6980
This commit is contained in:
Nick Mathewson 2006-08-04 18:32:43 +00:00
parent abe27b807e
commit bf72878cad
5 changed files with 112 additions and 37 deletions

View File

@ -73,10 +73,14 @@ N . Improve memory usage on tight-memory machines.
- "bandwidth classes", for incoming vs initiated-here conns. - "bandwidth classes", for incoming vs initiated-here conns.
o Asynchronous DNS o Asynchronous DNS
. And test it o And test it
. Make it work on windows. . Make it work on windows.
o Implement o Implement
. Enable
- Test - Test
- Make the Nameservers option documented, and make it work right on
reload.
- Fail when we have no configured nameservers!
- Make it the default on platforms where it works - Make it the default on platforms where it works
- Security improvements - Security improvements

View File

@ -24,8 +24,9 @@ const char compat_c_id[] =
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
#include <process.h> #include <process.h>
#include <windows.h>
#endif #endif
#ifdef HAVE_UNAME #ifdef HAVE_UNAME
#include <sys/utsname.h> #include <sys/utsname.h>
#endif #endif
@ -107,16 +108,22 @@ const char compat_c_id[] =
#define INADDR_NONE ((unsigned long) -1) #define INADDR_NONE ((unsigned long) -1)
#endif #endif
#ifdef HAVE_SYS_MMAN #ifdef HAVE_SYS_MMAN_H
const char * struct tor_mmap_t {
tor_mmap_file(const char *filename, size_t *size) char *data;
size_t size;
};
tor_mmap_t *
tor_mmap_file(const char *filename, const char **data, size_t *size_out)
{ {
int fd; /* router file */ int fd; /* router file */
char *string; char *string;
int page_size; int page_size;
tor_mmap_t *res;
size_t size;
tor_assert(filename); tor_assert(filename);
tor_assert(size); tor_assert(size_out);
fd = open(filename, O_RDONLY, 0); fd = open(filename, O_RDONLY, 0);
if (fd<0) { if (fd<0) {
@ -124,13 +131,13 @@ tor_mmap_file(const char *filename, size_t *size)
return NULL; return NULL;
} }
*size = lseek(fd, 0, SEEK_END); size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET); lseek(fd, 0, SEEK_SET);
/* ensure page alignment */ /* ensure page alignment */
page_size = getpagesize(); page_size = getpagesize();
*size += (page_size + (page_size-(*size%page_size))); size += (page_size + (page_size-(size%page_size)));
string = mmap(0, *size, PROT_READ, MAP_PRIVATE, fd, 0); string = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0);
if (string == MAP_FAILED) { if (string == MAP_FAILED) {
log_warn(LD_FS,"Could not mmap file \"%s\": %s", filename, log_warn(LD_FS,"Could not mmap file \"%s\": %s", filename,
strerror(errno)); strerror(errno));
@ -139,30 +146,88 @@ tor_mmap_file(const char *filename, size_t *size)
close(fd); close(fd);
return string; res = tor_malloc_zero(sizeof(tor_mmap_t));
} *data = res->data = string;
*size_out = res->size = size;
void
tor_munmap_file(const char *memory, size_t size)
{
munmap((char*)memory, size);
}
#else
const char *
tor_mmap_file(const char *filename, size_t *size)
{
char *res = read_file_to_str(filename, 1);
if (res)
*size = strlen(res) + 1;
return res; return res;
} }
void
tor_munmap_file(tor_mmap_t *handle)
{
munmap(handle->data, handle->size);
}
#elif defined(MS_WINDOWS)
typdef struct tor_mmap_t {
char *data;
HANDLE file_handle;
HANDLE mmap_handle;
size_t size;
} tor_mmap_t;
tor_mmap_t *
tor_mmap_file(const char *filename, const char **data, size_t *size)
{
win_mmap_t *res = tor_malloc_zero(res);
res->mmap_handle = res->file_handle = INVALID_HANDLE_VALUE;
/* What's this about tags? */
/* Open the file. */
res->file_handle = XXXXX;
res->size = GetFileSize(res->file_handle, NULL);
res->mmap_handle = CreateFileMapping(res->file_handle,
NULL,
PAGE_READONLY,
0,
size,
tagname);
if (res->mmap_handle != INVALID_HANDLE_VALUE)
goto err;
res->data = (char*) MapViewOfFile(res->mmap_handle,
access,
0, 0, 0);
if (!res->data)
goto err;
*size = res->size;
*data = res->data;
return res;
err:
tor_munmap_file(res);
return NULL;
}
void
tor_munmap_file(tor_mmap_t *handle)
{
if (handle->data)
UnmapViewOfFile(handle->data);
if (res->mmap_handle != INVALID_HANDLE_VALUE)
CloseHandle(res->mmap_handle);
if (res->file_handle != INVALID_HANDLE_VALUE)
CloseHandle(self->file_handle);
tor_free(res);
}
#else
struct tor_mmap_t {
char *data;
};
tor_mmap_t *
tor_mmap_file(const char *filename, const char **data, size_t *size)
{
char *res = read_file_to_str(filename, 1);
tor_mmap_t *handle;
if (res)
*size = strlen(res) + 1;
handle = tor_malloc_zero(sizeof(tor_mmap_t));
*data = handle->data = res;
return handle;
}
void void
tor_munmap_file(const char *memory, size_t size) tor_munmap_file(tor_mmap_t *handle)
{ {
char *mem = (char*) memory; tor_free(handle->data);
(void)size;
tor_free(mem);
} }
#endif #endif

View File

@ -114,8 +114,12 @@ size_t strlcpy(char *dst, const char *src, size_t siz);
#define U64_LITERAL(n) (n ## llu) #define U64_LITERAL(n) (n ## llu)
#endif #endif
const char *tor_mmap_file(const char *filename, size_t *size); /** Opaque bookkeeping type used for mmap accounting. */
void tor_munmap_file(const char *memory, size_t size); typedef struct tor_mmap_t tor_mmap_t;
tor_mmap_t *tor_mmap_file(const char *filename,
const char **data, size_t *size);
void tor_munmap_file(tor_mmap_t *handle);
int tor_snprintf(char *str, size_t size, const char *format, ...) int tor_snprintf(char *str, size_t size, const char *format, ...)
CHECK_PRINTF(3,4); CHECK_PRINTF(3,4);

View File

@ -1020,6 +1020,7 @@ typedef struct {
/** DOCDOC */ /** DOCDOC */
const char *mmap_descriptors; const char *mmap_descriptors;
size_t mmap_descriptors_len; size_t mmap_descriptors_len;
tor_mmap_t *mmap_handle;
} routerlist_t; } routerlist_t;
/** Information on router used when extending a circuit. (We don't need a /** Information on router used when extending a circuit. (We don't need a

View File

@ -276,12 +276,12 @@ router_rebuild_store(int force)
goto done; goto done;
} }
/* Our mmap is now invalid. */ /* Our mmap is now invalid. */
if (routerlist->mmap_descriptors) { if (routerlist->mmap_handle) {
tor_munmap_file(routerlist->mmap_descriptors, tor_munmap_file(routerlist->mmap_handle);
routerlist->mmap_descriptors_len); routerlist->mmap_handle = tor_mmap_file(fname,
routerlist->mmap_descriptors = &routerlist->mmap_descriptors,
tor_mmap_file(fname, &routerlist->mmap_descriptors_len); &routerlist->mmap_descriptors_len);
if (! routerlist->mmap_descriptors) if (! routerlist->mmap_handle)
log_warn(LD_FS, "Unable to mmap new descriptor file at '%s'.",fname); log_warn(LD_FS, "Unable to mmap new descriptor file at '%s'.",fname);
} }
@ -340,8 +340,9 @@ router_reload_router_list(void)
router_journal_len = router_store_len = 0; router_journal_len = router_store_len = 0;
tor_snprintf(fname, fname_len, "%s/cached-routers", options->DataDirectory); tor_snprintf(fname, fname_len, "%s/cached-routers", options->DataDirectory);
routerlist->mmap_descriptors = routerlist->mmap_handle = tor_mmap_file(fname,
tor_mmap_file(fname, &routerlist->mmap_descriptors_len); &routerlist->mmap_descriptors,
&routerlist->mmap_descriptors_len);
if (routerlist->mmap_descriptors) { if (routerlist->mmap_descriptors) {
router_store_len = routerlist->mmap_descriptors_len; router_store_len = routerlist->mmap_descriptors_len;
router_load_routers_from_string(routerlist->mmap_descriptors, router_load_routers_from_string(routerlist->mmap_descriptors,