Кроссплатформенный mmap

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Кроссплатформенный mmap

Сообщение Дож » 25.05.2016 16:10:27

Раз уж обсуждаем как правильно читать файлы, то у меня есть один давний вопрос.

Какие есть кроссплатформенные варианты mmap'нуть файлик в память? Есть ли библиотечки, не использующие class'ы и «тяжёлый» rtl типа SysUtils?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 716
Зарегистрирован: 12.10.2008 16:14:47

Re: Кроссплатформенный mmap

Сообщение Дож » 13.07.2018 18:55:24

Ладно, у меня есть вопрос по-проще: где POSIX'овый msync?

mmap/munmap есть в BaseUnix как FpMMap/FpMUnmap, но FpMSync не вижу. Наверное, я смогу самостоятельно вызвать его через do_syscall(syscall_nr_msync, ...), но откуда взять MS_SYNC и MS_ASYNC?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 716
Зарегистрирован: 12.10.2008 16:14:47

Re: Кроссплатформенный mmap

Сообщение fedan » 13.07.2018 23:57:47

Код: Выделить всё
man msync

Код: Выделить всё
MSYNC(2)                                                                                       Руководство программиста Linux                                                                                       MSYNC(2)

ИМЯ
       msync - синхронизирует содержимое файла с его отображением в памяти

ОБЗОР
       #include <sys/mman.h>

       int msync(void *addr, size_t length, int flags);

ОПИСАНИЕ
       Вызов  msync()  сбрасывает  изменения  файла,  который  отображён в память с помощью mmap(2), обратно в файловую систему. Без использования этого вызова нет никакой гарантии, что изменения будут записаны в файл до
       вызова munmap(2). Если быть точнее, то на диск записывается часть файла, начинающаяся в памяти с адреса addr длиной length.

       В аргументе flags должен быть один из флагов MS_ASYNC и MS_SYNC, а также дополнительно можно указать MS_INVALIDATE. Данные биты имеют следующее значение:

       MS_ASYNC
              Запланировать обновление, но вызов завершается сразу.

       MS_SYNC
              Запланировать обновление и ждать его завершения.

       MS_INVALIDATE
              Считать недействительными другие отображения того же файла (для того, чтобы они могли обновиться до достоверных значений, которые запишутся).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
       При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ
       EBUSY  В flags указан MS_INVALIDATE, но на указанный адресный диапазон есть блокировка в памяти.

       EINVAL Значение addr не кратно PAGESIZE; в flags установлен любой другой бит, отличный от MS_ASYNC | MS_INVALIDATE | MS_SYNC; в flags установлены сразу MS_SYNC и MS_ASYNC.

       ENOMEM Указанная память (или её часть) не была отображена.

СООТВЕТСТВИЕ СТАНДАРТАМ
       POSIX.1-2001, POSIX.1-2008.

       Этот вызов появился в Linux 1.3.21, и в нём использовалось EFAULT вместо ENOMEM. В Linux 2.4.19 это было изменено на значение POSIX ENOMEM.

ДОСТУПНОСТЬ
       В системах POSIX, в которых доступен msync(), значения _POSIX_MAPPED_FILES и _POSIX_SYNCHRONIZED_IO, определённые в <unistd.h>, больше нуля. (См. также sysconf(3).)

ЗАМЕЧАНИЯ
       Согласно POSIX, в flags должен быть указан или MS_SYNC, или MS_ASYNC и отказ включить один из этих флагов вызывает ошибку в msync() на некоторых системах. Однако Linux позволяет вызывать msync() без  этих  флагов,
       используя  семантику, которая (в настоящее время) эквивалентна указанию MS_ASYNC (начиная с Linux 2.6.19, MS_ASYNC, фактически, ничего не делает, так как ядро правильно отслеживает грязные страницы и записывает их
       в место хранения при необходимости). Несмотря на поведение Linux, в переносимых, ориентированных на будущее приложениях в flags должен быть указан или MS_SYNC, или MS_ASYNC.

СМОТРИТЕ ТАКЖЕ
       mmap(2)

       B.O. Gallmeister, POSIX.4, O'Reilly, стр. 128-129 и 389-391.

Linux                                                                                                    2015-08-08                                                                                                 MSYNC(2)

Код: Выделить всё
egrep -r 'MS_ASYNC|MS_SYNC|MS_INVALIDATE' /usr/include

Код: Выделить всё
/usr/include/asm-generic/mman-common.h:#define MS_ASYNC   1      /* sync memory asynchronously */
/usr/include/asm-generic/mman-common.h:#define MS_INVALIDATE   2      /* invalidate the caches */
/usr/include/asm-generic/mman-common.h:#define MS_SYNC      4      /* synchronous memory sync */
/usr/include/sys/mount.h:  MS_SYNCHRONOUS = 16,      /* Writes are synced at once.  */
/usr/include/sys/mount.h:#define MS_SYNCHRONOUS   MS_SYNCHRONOUS
/usr/include/sys/mount.h:#define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION \
/usr/include/boost/interprocess/mapped_region.hpp:   return msync(addr, numbytes, async ? MS_ASYNC : MS_SYNC) == 0;
/usr/include/bits/mman-linux.h:#define MS_ASYNC   1      /* Sync memory asynchronously.  */
/usr/include/bits/mman-linux.h:#define MS_SYNC      4      /* Synchronous memory sync.  */
/usr/include/bits/mman-linux.h:#define MS_INVALIDATE   2      /* Invalidate the caches.  */
/usr/include/linux/fs.h:#define MS_SYNCHRONOUS   16   /* Writes are synced at once */
/usr/include/linux/fs.h:#define MS_RMT_MASK   (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION|\
/usr/include/libmount/libmount.h:#ifndef MS_SYNCHRONOUS
/usr/include/libmount/libmount.h:#define MS_SYNCHRONOUS   16   /* Writes are synced at once */

Код: Выделить всё
egrep -r 'MS_ASYNC|MS_SYNC|MS_INVALIDATE' .

Код: Выделить всё
./rtl/unix/unix.pp:  MS_ASYNC        = 1 deprecated;               { Sync memory asynchronously.  }
./rtl/unix/unix.pp:  MS_SYNC         = 4 deprecated;               { Synchronous memory sync.  }
./rtl/unix/unix.pp:  MS_INVALIDATE   = 2 deprecated;               { Invalidate the caches.  }
./packages/libc/src/bmmanh.inc:   MS_ASYNC = 1;
./packages/libc/src/bmmanh.inc:   MS_SYNC = 4;
./packages/libc/src/bmmanh.inc:   MS_INVALIDATE = 2;
./packages/libc/src/smounth.inc:  MS_SYNCHRONOUS = 16;

Код: Выделить всё
grep -r 'msync' .

Код: Выделить всё
./rtl/netbsd/sysnr.inc:     syscall_nr_compat_12_msync = 65;
./rtl/netbsd/sysnr.inc:  { syscall: "__msync13" ret: "int" args: "void  " "size_t" "int"  }
./rtl/netbsd/sysnr.inc:     syscall_nr___msync13 = 277;
./rtl/dragonfly/sysnr.inc: syscall_nr_msync                       =  65;
./rtl/dragonfly/sysnr.inc: syscall_nr_netbsd_msync                = 277;
./rtl/unix/unix.pp:{ Flags to `msync'.  There is non msync() call in this unit?
./rtl/linux/arm/sysnr.inc:  syscall_nr_msync                      = syscall_nr_base+144;
./rtl/linux/i386/sysnr.inc:        syscall_nr_msync                = 144;
./rtl/linux/oldlinux.pp: syscall_nr_msync                       = 144;
./rtl/linux/sparc/sysnr.inc:      syscall_nr_msync             = 65 ; // Common in newer 1.3.x revs...
./rtl/linux/mips/sysnr.inc:  syscall_nr_msync                      = 4000+144;
./rtl/linux/m68k/sysnr.inc:        syscall_nr_msync                = 144;
./rtl/linux/powerpc/sysnr.inc:  syscall_nr_msync = 144;
./rtl/linux/x86_64/sysnr.inc:  syscall_nr_msync                              = 26;
./rtl/netwlibc/libc.pp:{ 'flags' values for msync()...  }
./rtl/netwlibc/libc.imp: msync,
./rtl/openbsd/sysnr.inc:(* 65 *)    syscall_nr_msync_20 = 65; (* up to 2.2 release *)
./rtl/openbsd/sysnr.inc:(* 65 *)    syscall_nr_omsync = 65; (* from 2.3 up to 3.3 release *)
./rtl/openbsd/sysnr.inc:(* 256 *)    syscall_nr_msync = 256;
./packages/morphunits/src/hardware.pas:    beamsync : SmallInt;
./packages/amunits/src/coreunits/hardware.pas:       beamsync  : smallint;
./packages/libc/src/smmaph.inc:function msync(__addr:pointer; __len:size_t; __flags:longint):longint;cdecl;external clib name 'msync';
fedan
новенький
 
Сообщения: 53
Зарегистрирован: 15.09.2016 21:18:48

Re: Кроссплатформенный mmap

Сообщение Mirage » 14.07.2018 00:19:59

А SysUtils чем не угодил? Я понимаю там Classes какой-нибудь не использовать.
Mirage
энтузиаст
 
Сообщения: 832
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Кроссплатформенный mmap

Сообщение fedan » 14.07.2018 12:56:07

fedan
новенький
 
Сообщения: 53
Зарегистрирован: 15.09.2016 21:18:48


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru