Changeset 35998 in project


Ignore:
Timestamp:
07/22/18 17:47:52 (21 months ago)
Author:
sjamaan
Message:

Fix memory-mapped-files on Windows; copied stupid set_last_errno boilerplate code from posixwin.scm and fixed nonexistent MAP_ANON reference to MAP_ANONYMOUS. Added #include <windows.h> to get the PAGE_READONLY etc definitions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • release/5/memory-mapped-files/trunk/memory-mapped-files.scm

    r35504 r35998  
    44#>
    55#ifdef WIN32
     6
     7#include <windows.h>
    68
    79#define PROT_NONE       0
     
    4244    FILE_MAP_READ|FILE_MAP_WRITE|FILE_MAP_EXECUTE
    4345};
     46
     47/*
     48  mapping from Win32 error codes to errno
     49*/
     50
     51typedef struct
     52{
     53    DWORD   win32;
     54    int     libc;
     55} errmap_t;
     56
     57static errmap_t errmap[] =
     58{
     59    {ERROR_INVALID_FUNCTION,      EINVAL},
     60    {ERROR_FILE_NOT_FOUND,        ENOENT},
     61    {ERROR_PATH_NOT_FOUND,        ENOENT},
     62    {ERROR_TOO_MANY_OPEN_FILES,   EMFILE},
     63    {ERROR_ACCESS_DENIED,         EACCES},
     64    {ERROR_INVALID_HANDLE,        EBADF},
     65    {ERROR_ARENA_TRASHED,         ENOMEM},
     66    {ERROR_NOT_ENOUGH_MEMORY,     ENOMEM},
     67    {ERROR_INVALID_BLOCK,         ENOMEM},
     68    {ERROR_BAD_ENVIRONMENT,       E2BIG},
     69    {ERROR_BAD_FORMAT,            ENOEXEC},
     70    {ERROR_INVALID_ACCESS,        EINVAL},
     71    {ERROR_INVALID_DATA,          EINVAL},
     72    {ERROR_INVALID_DRIVE,         ENOENT},
     73    {ERROR_CURRENT_DIRECTORY,     EACCES},
     74    {ERROR_NOT_SAME_DEVICE,       EXDEV},
     75    {ERROR_NO_MORE_FILES,         ENOENT},
     76    {ERROR_LOCK_VIOLATION,        EACCES},
     77    {ERROR_BAD_NETPATH,           ENOENT},
     78    {ERROR_NETWORK_ACCESS_DENIED, EACCES},
     79    {ERROR_BAD_NET_NAME,          ENOENT},
     80    {ERROR_FILE_EXISTS,           EEXIST},
     81    {ERROR_CANNOT_MAKE,           EACCES},
     82    {ERROR_FAIL_I24,              EACCES},
     83    {ERROR_INVALID_PARAMETER,     EINVAL},
     84    {ERROR_NO_PROC_SLOTS,         EAGAIN},
     85    {ERROR_DRIVE_LOCKED,          EACCES},
     86    {ERROR_BROKEN_PIPE,           EPIPE},
     87    {ERROR_DISK_FULL,             ENOSPC},
     88    {ERROR_INVALID_TARGET_HANDLE, EBADF},
     89    {ERROR_INVALID_HANDLE,        EINVAL},
     90    {ERROR_WAIT_NO_CHILDREN,      ECHILD},
     91    {ERROR_CHILD_NOT_COMPLETE,    ECHILD},
     92    {ERROR_DIRECT_ACCESS_HANDLE,  EBADF},
     93    {ERROR_NEGATIVE_SEEK,         EINVAL},
     94    {ERROR_SEEK_ON_DEVICE,        EACCES},
     95    {ERROR_DIR_NOT_EMPTY,         ENOTEMPTY},
     96    {ERROR_NOT_LOCKED,            EACCES},
     97    {ERROR_BAD_PATHNAME,          ENOENT},
     98    {ERROR_MAX_THRDS_REACHED,     EAGAIN},
     99    {ERROR_LOCK_FAILED,           EACCES},
     100    {ERROR_ALREADY_EXISTS,        EEXIST},
     101    {ERROR_FILENAME_EXCED_RANGE,  ENOENT},
     102    {ERROR_NESTING_NOT_ALLOWED,   EAGAIN},
     103    {ERROR_NOT_ENOUGH_QUOTA,      ENOMEM},
     104    {0, 0}
     105};
     106
     107static void C_fcall set_errno(DWORD w32err)
     108{
     109    errmap_t *map;
     110    for (map = errmap; map->win32; ++map)
     111    {
     112        if (map->win32 == w32err)
     113        {
     114            errno = map->libc;
     115            return;
     116        }
     117    }
     118    errno = ENOSYS; /* For lack of anything better */
     119}
     120
     121static int C_fcall set_last_errno()
     122{
     123    set_errno(GetLastError());
     124    return 0;
     125}
    44126
    45127void* mmap(void* addr,int len,int prot,int flags,int fd,int off)
     
    161243(define-foreign-variable _map_shared int "MAP_SHARED")
    162244(define-foreign-variable _map_private int "MAP_PRIVATE")
    163 (define-foreign-variable _map_anonymous int "MAP_ANON")
     245(define-foreign-variable _map_anonymous int "MAP_ANONYMOUS")
    164246(define-foreign-variable _map_file int "MAP_FILE")
    165247
Note: See TracChangeset for help on using the changeset viewer.