/* *file_image_open
*/ int file_image_open (file_image * image, constchar * filename)
{ int result = 0; int fd; struct stat st; void * p;
if (image == NULL) return EINVAL;
image->m_base = MAP_FAILED;
image->m_size = 0;
if ((fd = open (filename, O_RDONLY)) == -1) return errno;
if (fstat (fd, &st) == -1)
{
result = errno; goto cleanup_and_leave;
}
p = mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (p == MAP_FAILED)
{
result = errno; goto cleanup_and_leave;
}
image->m_base = p;
image->m_size = st.st_size;
cleanup_and_leave:
close (fd); return result;
}
/* *file_image_pagein.
*/ int file_image_pagein (file_image * image)
{ long s = -1; volatilechar c =0;
size_t idx;
if (image == NULL) return EINVAL; if (image->m_base == NULL) return EINVAL; if (image->m_size == 0) return0;
if (madvise (image->m_base, image->m_size, MADV_WILLNEED) == -1) return errno;
s = sysconf (_SC_PAGESIZE); if (s == -1)
s = 0x1000; // force touching of each page despite the optimizer for(idx = 0; idx < image->m_size; idx += (size_t)s)
{
c ^= ((volatileconstchar*)(image->m_base))[idx];
}
c ^= ((volatileconstchar*)(image->m_base))[image->m_size-1];
(void)c; // silence Clang 13 trunk -Wunused-but-set-variable
return0;
}
/* *file_image_close
*/ int file_image_close (file_image * image)
{ if (image == NULL) return EINVAL;
if (munmap (image->m_base, image->m_size) == -1) return errno;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.