X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fmmap.c;h=8a36040aad316eb673e62d5e9efda5c65f322080;hb=cbe5b58ec76784c05d0a0a2442c3d5629c1d9fd1;hp=a5aefd451aa23479d0c7935232b9baac0242cf61;hpb=cbc1122ac4551505181ea048ca14a5f87041090f;p=vlc diff --git a/modules/access/mmap.c b/modules/access/mmap.c index a5aefd451a..8a36040aad 100644 --- a/modules/access/mmap.c +++ b/modules/access/mmap.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include @@ -50,21 +50,17 @@ static int Open (vlc_object_t *); static void Close (vlc_object_t *); -vlc_module_begin(); - set_shortname (N_("MMap")); - set_description (N_("Memory-mapped file input")); - set_category (CAT_INPUT); - set_subcategory (SUBCAT_INPUT_ACCESS); - set_capability ("access", 52); - add_shortcut ("file"); - set_callbacks (Open, Close); -#ifdef __APPLE__ +vlc_module_begin () + set_shortname (N_("MMap")) + set_description (N_("Memory-mapped file input")) + set_category (CAT_INPUT) + set_subcategory (SUBCAT_INPUT_ACCESS) + set_capability ("access", 52) + add_shortcut ("file") + set_callbacks (Open, Close) add_bool ("file-mmap", false, NULL, -#else - add_bool ("file-mmap", true, NULL, -#endif - FILE_MMAP_TEXT, FILE_MMAP_LONGTEXT, true); -vlc_module_end(); + FILE_MMAP_TEXT, FILE_MMAP_LONGTEXT, true) +vlc_module_end () static block_t *Block (access_t *); static int Seek (access_t *, int64_t); @@ -86,6 +82,8 @@ static int Open (vlc_object_t *p_this) const char *path = p_access->psz_path; int fd; + assert ((INT64_C(1) << 63) == ((off_t)(INT64_C(1) << 63))); + if (!var_CreateGetBool (p_this, "file-mmap")) return VLC_EGENERIC; /* disabled */ @@ -118,7 +116,7 @@ static int Open (vlc_object_t *p_this) if (!S_ISREG (st.st_mode) && !S_ISBLK (st.st_mode)) { - msg_Dbg (p_access, "skipping non regular file %s", path); + msg_Dbg (p_access, "skipping non-regular file %s", path); goto error; } @@ -136,7 +134,7 @@ static int Open (vlc_object_t *p_this) /* Autodetect mmap() support */ if (st.st_size > 0) { - void *addr = mmap (NULL, 1, PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_NOCACHE, fd, 0); + void *addr = mmap (NULL, 1, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); if (addr != MAP_FAILED) munmap (addr, 1); else @@ -198,13 +196,13 @@ static block_t *Block (access_t *p_access) #ifdef MMAP_DEBUG int64_t dbgpos = lseek (p_sys->fd, 0, SEEK_CUR); if (dbgpos != p_access->info.i_pos) - msg_Err (p_access, "position: 0x%08llx instead of 0x%08llx", + msg_Err (p_access, "position: 0x%016"PRIx64" instead of 0x%016"PRIx64, p_access->info.i_pos, dbgpos); #endif const uintptr_t page_mask = p_sys->page_size - 1; /* Start the mapping on a page boundary: */ - off_t outer_offset = p_access->info.i_pos & ~page_mask; + off_t outer_offset = p_access->info.i_pos & ~(off_t)page_mask; /* Skip useless bytes at the beginning of the first page: */ size_t inner_offset = p_access->info.i_pos & page_mask; /* Map no more bytes than remain: */ @@ -220,12 +218,15 @@ static block_t *Block (access_t *p_access) /* NOTE: We use PROT_WRITE and MAP_PRIVATE so that the block can be * modified down the chain, without messing up with the underlying * original file. This does NOT need open write permission. */ - void *addr = mmap (NULL, length, PROT_READ|PROT_WRITE, MAP_PRIVATE, - p_sys->fd, outer_offset); + void *addr = mmap (NULL, length, PROT_READ|PROT_WRITE, MAP_PRIVATE +#ifdef MAP_NO_CACHE + | MAP_NOCACHE +#endif + , p_sys->fd, outer_offset); if (addr == MAP_FAILED) { msg_Err (p_access, "memory mapping failed (%m)"); - intf_UserFatal (p_access, false, _("File reading failed"), + dialog_Fatal (p_access, _("File reading failed"), "%s", _("VLC could not read the file.")); goto fatal; } @@ -241,16 +242,16 @@ static block_t *Block (access_t *p_access) block->i_buffer -= inner_offset; #ifdef MMAP_DEBUG - msg_Dbg (p_access, "mapped 0x%lx bytes at %p from offset 0x%lx", - (unsigned long)length, addr, (unsigned long)outer_offset); + msg_Dbg (p_access, "mapped 0x%zx bytes at %p from offset 0x%"PRIx64, + length, addr, (uint64_t)outer_offset); /* Compare normal I/O with memory mapping */ char *buf = malloc (block->i_buffer); ssize_t i_read = read (p_sys->fd, buf, block->i_buffer); if (i_read != (ssize_t)block->i_buffer) - msg_Err (p_access, "read %u instead of %u bytes", (unsigned)i_read, - (unsigned)block->i_buffer); + msg_Err (p_access, "read %zd instead of %zu bytes", i_read, + block->i_buffer); if (memcmp (buf, block->p_buffer, block->i_buffer)) msg_Err (p_access, "inconsistent data buffer"); free (buf); @@ -279,8 +280,6 @@ static int Seek (access_t *p_access, int64_t i_pos) static int Control (access_t *p_access, int query, va_list args) { - access_sys_t *p_sys = p_access->p_sys; - switch (query) { case ACCESS_CAN_SEEK: @@ -290,10 +289,6 @@ static int Control (access_t *p_access, int query, va_list args) *((bool *)va_arg (args, bool *)) = true; return VLC_SUCCESS; - case ACCESS_GET_MTU: - *((int *)va_arg (args, int *)) = p_sys->mtu; - return VLC_SUCCESS; - case ACCESS_GET_PTS_DELAY: { int delay_ms = var_CreateGetInteger (p_access, "file-caching");