mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 23:53:32 +01:00
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:
parent
abe27b807e
commit
bf72878cad
6
doc/TODO
6
doc/TODO
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user