Beispiel #1
0
void *mmap::seek(__ss_int offset, __ss_int whence)
{
    __raise_if_closed();
    const iterator restore = m_begin + tell();
    switch (whence)
    {
    case 0: /* SEEK_SET: relative to start.*/
        if (offset < 0L or size_t(offset) > __size())
        {
            __seek_failed();
        }
        m_position = m_begin + offset;
        break;
    case 1:  /* SEEK_CUR: relative to current position. */
        m_position += offset;
        if (m_position < m_begin or
                m_position > m_end)
        {
            m_position = restore;
            __seek_failed();
        }
        break;
    case 2: /* SEEK_END: relative to end */
        if (offset > 0L or offset < -int(__size()))
        {
            __seek_failed();
        }
        m_position = m_end + offset;
        break;
    default: // Error
        throw new ValueError(const_12);
    }
    return NULL;
}
Beispiel #2
0
void *mmap::resize(__ss_int new_size)
{
    __raise_if_closed();
    DWORD dwErrCode = 0;
    DWORD off_hi, off_lo;
    LONG newSizeLow, newSizeHigh;
    /* First, unmap the file view */
    UnmapViewOfFile(m_begin);
    m_begin = NULL;
    /* Close the mapping object */
    CloseHandle(map_handle);
    map_handle = NULL;
    /* Move to the desired EOF position */
#if SIZEOF_SIZE_T > 4
    newSizeHigh = (DWORD)((offset + new_size) >> 32);
    newSizeLow = (DWORD)((offset + new_size) & 0xFFFFFFFF);
    off_hi = (DWORD)(offset >> 32);
    off_lo = (DWORD)(offset & 0xFFFFFFFF);
#else // SIZEOF_SIZE_T <= 4
    newSizeHigh = 0;
    newSizeLow = (DWORD)(offset + new_size);
    off_hi = 0;
    off_lo = (DWORD)offset;
#endif // SIZEOF_SIZE_T > 4
    SetFilePointer(file_handle,
                   newSizeLow, &newSizeHigh, FILE_BEGIN);
    /* Change the size of the file */
    SetEndOfFile(file_handle);
    /* Create another mapping object and remap the file view */
    map_handle = CreateFileMapping(
                     file_handle,
                     NULL,
                     PAGE_READWRITE,
                     0,
                     0,
                     tagname);
    if (map_handle != NULL)
    {
        throw new IOError();
    }

    m_begin = static_cast<iterator>(MapViewOfFile(map_handle,
                                    FILE_MAP_WRITE,
                                    off_hi,
                                    off_lo,
                                    new_size));
    if (m_begin == NULL)
    {
        CloseHandle(map_handle);
        throw new IOError();
    }
    m_end = m_begin + size_t(new_size);
    m_position = std::min(m_position, m_end);
    return NULL;
}
Beispiel #3
0
void *mmap::__raise_if_closed_or_not_writable()
{
    __raise_if_closed();
#ifndef WIN32
    if ((prot & PROT_WRITE) == 0)
#else /* WIN32 */
    if (access == ACCESS_READ)
#endif /* WIN32 */
    {
        throw new TypeError(const_9);
    }
    return NULL;
}
Beispiel #4
0
void *mmap::__raise_if_closed_or_not_readable()
{
    __raise_if_closed();
#ifndef WIN32
    if ((prot & PROT_READ) == 0)
#else /* WIN32 */
    if (access and access != ACCESS_READ)
#endif /* WIN32 */
    {
        throw new TypeError(const_0);
    }
    return NULL;
}
Beispiel #5
0
__ss_int mmap::size()
{
    __raise_if_closed();
#ifdef WIN32
    if (file_handle != INVALID_HANDLE_VALUE) 
    {
        DWORD low, high;
        uint64_t size;
        low = GetFileSize(file_handle, &high);
        if (low == INVALID_FILE_SIZE)
        {
            /* It might be that the function appears to have failed,
               when indeed its size equals INVALID_FILE_SIZE */
            DWORD error = GetLastError();
            if (error != NO_ERROR)
                //throw IOError();
        }
Beispiel #6
0
__ss_int mmap::size()
{
    __raise_if_closed();
#ifdef WIN32
    if (file_handle != INVALID_HANDLE_VALUE) 
    {
        DWORD low, high;
        uint64_t size;
        low = GetFileSize(file_handle, &high);
        if (low == INVALID_FILE_SIZE)
        {
            /* It might be that the function appears to have failed,
               when indeed its size equals INVALID_FILE_SIZE */
            DWORD error = GetLastError();
            if (error != NO_ERROR)
                throw IOError();
        }
        size = (((uint64_t)high)<<32) + low;
        return __ss_int(size);
    }
    else 
    {
        return __size();
    }
#else /* UNIX */
    if(fd == -1 )
    {
        return __size();
    }
    else
    {
        struct stat buf;
        if (fstat(fd, &buf) == -1)
        {
            throw new IOError();
        }
        return buf.st_size;
    }
#endif /* WIN32 */
}
Beispiel #7
0
void *mmap::resize(__ss_int new_size)
{
    __raise_if_closed();
#ifdef HAVE_MREMAP
#if defined(__NetBSD__)
    m_begin = static_cast<iterator>(::mremap(m_begin, __size(),
                                    m_begin, size_t(new_size), 0));
#else // !__NetBSD__
    m_begin = static_cast<iterator>(::mremap(m_begin, __size(),
                                    size_t(new_size), 0));
#endif // __NetBSD__
    if (m_begin == iterator(-1))
    {
        throw new IOError();
    }
    m_end = m_begin + size_t(new_size);
    m_position = std::min(m_position, m_end);
#else // !HAVE_MREMAP
    throw new NotImplementedError(const_15);
#endif // HAVE_MREMAP
    return NULL;
}
Beispiel #8
0
__iter<str *> *mmap::__iter__()
{
    __raise_if_closed();	
    return new __mmapiter(this);
}
Beispiel #9
0
__ss_int mmap::tell()
{
    __raise_if_closed();
    return __tell();
}
Beispiel #10
0
__ss_int mmap::flush(__ss_int offset, __ss_int size)
{
    __raise_if_closed();
    return __ss_int(FlushViewOfFile(m_begin + offset, __subscript(size)));
}