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; }
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; }
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; }
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; }
__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(); }
__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 */ }
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; }
__iter<str *> *mmap::__iter__() { __raise_if_closed(); return new __mmapiter(this); }
__ss_int mmap::tell() { __raise_if_closed(); return __tell(); }
__ss_int mmap::flush(__ss_int offset, __ss_int size) { __raise_if_closed(); return __ss_int(FlushViewOfFile(m_begin + offset, __subscript(size))); }