_moo_win32_mmap(), _moo_win32_munmap()

master
Yevgen Muntyan 2007-06-14 00:01:24 -05:00
parent b4cd452a2d
commit ef02bf8ae3
1 changed files with 125 additions and 0 deletions

View File

@ -22,6 +22,8 @@
#include <shellapi.h>
#include <time.h>
#include <errno.h>
#include <sys/stat.h>
#include <io.h>
static char *libmoo_dll_name;
@ -257,3 +259,126 @@ _moo_win32_fnmatch (const char *pattern,
return _moo_glob_match_simple (pattern, string) ? 0 : 1;
}
/***************************************************************************
* mmap for poor
*/
static GHashTable *mapped_files;
#define MAPPING_ALLOCATED ((HANDLE) -2)
static void
add_mapped_file (gpointer buffer,
HANDLE mapping)
{
if (!mapped_files)
mapped_files = g_hash_table_new (g_direct_hash, g_direct_equal);
g_hash_table_insert (mapped_files, buffer, mapping);
}
static gboolean
remove_mapped_file (gpointer buffer)
{
HANDLE mapping;
if (!mapped_files)
return FALSE;
mapping = g_hash_table_lookup (mapped_files, buffer);
g_return_val_if_fail (mapping != NULL, FALSE);
g_hash_table_remove (mapped_files, buffer);
if (mapping == MAPPING_ALLOCATED)
{
g_free (buffer);
}
else
{
UnmapViewOfFile (buffer);
CloseHandle (mapping);
}
if (g_hash_table_size (mapped_files) == 0)
{
g_hash_table_destroy (mapped_files);
mapped_files = NULL;
}
return TRUE;
}
void *
_moo_win32_mmap (gpointer start,
guint64 length,
int prot,
int flags,
int fd,
guint64 offset)
{
struct stat st;
HANDLE mapping;
char *buffer;
g_return_val_if_fail (start == NULL, NULL);
g_return_val_if_fail (prot == PROT_READ, NULL);
g_return_val_if_fail (flags == MAP_SHARED, NULL);
g_return_val_if_fail (offset == 0, NULL);
errno = 0;
if (fstat (fd, &st) != 0)
return MAP_FAILED;
if ((guint64) st.st_size != length)
{
errno = EINVAL;
return MAP_FAILED;
}
if (length == 0)
{
buffer = g_new (char, 1);
buffer[0] = 0;
add_mapped_file (buffer, MAPPING_ALLOCATED);
return buffer;
}
mapping = CreateFileMapping ((HANDLE) _get_osfhandle (fd), NULL,
PAGE_READONLY, 0, 0, NULL);
if (!mapping)
{
errno = EINVAL;
return MAP_FAILED;
}
buffer = MapViewOfFile (mapping, FILE_MAP_READ, 0, 0, 0);
if (!buffer)
{
CloseHandle (mapping);
errno = EINVAL;
return MAP_FAILED;
}
add_mapped_file (buffer, mapping);
return buffer;
}
int
_moo_win32_munmap (gpointer start,
G_GNUC_UNUSED gsize length)
{
if (!remove_mapped_file (start))
{
errno = EINVAL;
return -1;
}
else
{
return 0;
}
}