~ubuntu-branches/ubuntu/dapper/zziplib/dapper

« back to all changes in this revision

Viewing changes to zzip/__mmap.h

  • Committer: Bazaar Package Importer
  • Author(s): Aurelien Jarno
  • Date: 2004-03-29 12:41:28 UTC
  • Revision ID: james.westby@ubuntu.com-20040329124128-hf9y5elywpavuh5y
Tags: upstream-0.10.82
ImportĀ upstreamĀ versionĀ 0.10.82

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef __ZZIP_INTERNAL_MMAP_H
 
2
#define __ZZIP_INTERNAL_MMAP_H
 
3
#include <zzip/conf.h>
 
4
 
 
5
/*
 
6
 * DO NOT USE THIS CODE.
 
7
 *
 
8
 * It is an internal header file for zziplib that carries some inline
 
9
 * functions (or just static members) and a few defines, simply to be
 
10
 * able to reuse these across - and have everything in a specific place.
 
11
 *
 
12
 * Copyright (c) 2002 Guido Draheim
 
13
 *          All rights reserved,
 
14
 *          use under the restrictions of the 
 
15
 *          Lesser GNU General Public License
 
16
 *          note the additional license information 
 
17
 *          that can be found in COPYING.ZZIP
 
18
 */
 
19
 
 
20
#ifdef _USE_MMAP
 
21
#if    defined ZZIP_HAVE_SYS_MMAN_H
 
22
#include <sys/mman.h>
 
23
#define USE_POSIX_MMAP 1
 
24
#elif defined ZZIP_HAVE_WINBASE_H || defined WIN32
 
25
#include <windows.h>
 
26
#define USE_WIN32_MMAP 1
 
27
#else
 
28
#undef _USE_MMAP
 
29
#endif
 
30
#endif
 
31
 
 
32
/* -------------- specify MMAP function imports --------------------------- */
 
33
 
 
34
#if     defined  USE_POSIX_MMAP
 
35
#define USE_MMAP 1
 
36
 
 
37
#define _zzip_mmap(user, fd, offs, len) \
 
38
              mmap (0, len, PROT_READ, MAP_SHARED, fd, offs)
 
39
#define _zzip_munmap(user, ptr, len) \
 
40
              munmap (ptr, len)
 
41
#define _zzip_getpagesize(user) getpagesize()
 
42
 
 
43
#ifndef MAP_FAILED /* hpux10.20 does not have it */
 
44
#define MAP_FAILED ((void*)(-1))
 
45
#endif
 
46
 
 
47
#elif   defined USE_WIN32_MMAP
 
48
#define USE_MMAP 1
 
49
#ifndef MAP_FAILED
 
50
#define MAP_FAILED 0
 
51
#endif
 
52
/* we (ab)use the "*user" variable to store the FileMapping handle */
 
53
                 /* which assumes (sizeof(long) == sizeof(HANDLE)) */
 
54
 
 
55
static size_t win32_getpagesize ()
 
56
 
57
    SYSTEM_INFO si; GetSystemInfo (&si); 
 
58
    return si.dwAllocationGranularity; 
 
59
}
 
60
static void*  win32_mmap (long* user, int fd, zzip_off_t offs, size_t len)
 
61
{
 
62
    if (! user || *user != 1) /* || offs % getpagesize() */
 
63
        return 0;
 
64
  {
 
65
    HANDLE hFile = (HANDLE)_get_osfhandle(fd);
 
66
    if (hFile)
 
67
        *user = (int) CreateFileMapping (hFile, 0, PAGE_READONLY, 0, 0, NULL);
 
68
    if (*user)
 
69
    {
 
70
        char* p = 0;
 
71
        p = MapViewOfFile(*(HANDLE*)user, FILE_MAP_READ, 0, offs, len);
 
72
        if (p) return p + offs;
 
73
        CloseHandle (*(HANDLE*)user); *user = 1;
 
74
    } 
 
75
    return MAP_FAILED;
 
76
  }
 
77
}
 
78
static void win32_munmap (long* user, char* fd_map, size_t len)
 
79
{
 
80
    UnmapViewOfFile (fd_map);
 
81
    CloseHandle (*(HANDLE*)user); *user = 1;
 
82
}
 
83
 
 
84
#define _zzip_mmap(user, fd, offs, len) \
 
85
        win32_mmap ((long*) &(user), fd, offs, len)
 
86
#define _zzip_munmap(user, ptr, len) \
 
87
        win32_munmap ((long*) &(user), ptr, len)
 
88
#define _zzip_getpagesize(user) win32_getpagesize()
 
89
 
 
90
#else   /* disable */
 
91
#define USE_MMAP 0
 
92
/* USE_MAP is intentional: we expect the compiler to do some "code removal"
 
93
 * on any source code enclosed in if (USE_MMAP) {...}   i.e. the unreachable
 
94
 * branch of an if (0) {....} is not emitted to the final object binary. */
 
95
 
 
96
#ifndef MAP_FAILED
 
97
#define MAP_FAILED  0
 
98
#endif
 
99
 
 
100
#define _zzip_mmap(user, fd, offs, len) (MAP_FAILED)
 
101
#define _zzip_munmap(user, ptr, len) {}
 
102
#define _zzip_getpagesize(user) 1
 
103
 
 
104
#endif /* USE_MMAP defines */
 
105
 
 
106
 
 
107
#endif