Маjко
Я конечно не лингвист
Маjко
Но чем метадата не дескриптор?
Денис
и как они к файловым дескрипторам относятся, извините?
то, что когда ты у себя в программе работаешь с файлом, то файловый дескриптор привязан к иноду, не?
Vladimir
1) есть несколько буфферов, один на уровне ос другой на write/read у libc, и ещё есть bufwriter у раста. 2) когда делаешь close всё программные буферы флашатся, но нет гарантии флаша буфера ос. 3) fsync делает флеш буфера ос 4) ос должна уметь хендлить всю работу с файлами, и трекание буферов им соответствующих без fsync
պլհկ
при rename inode не меняется, привет
Денис
Berkus
в любой нормальной ос связь между буферами в кеше и файлом на диске не теряется
Alexander
перед move нужно обязательно close сделать
В расте не нужно, надо в блок взять.
Денис
В расте не нужно, надо в блок взять.
ну это одно и то же по сути-то)
Денис
по крайней мере в нашем контексте
պլհկ
Я конечно не лингвист
есть четкое понятие “файловый дескриптор” (https://en.wikipedia.org/wiki/File_descriptor), не надо его обобщать
Alexander
ну это одно и то же по сути-то)
Ну что-то руками вызывать в расте лень, так как про файл сразу сказано - забейте, мы сами закроем когда надо, как бы забиваешь и обламывается.
պլհկ
ты записал что-то в файл, закрыл его, фс закэшировала это дело и запомнила файловый дескриптор, куда писать, потом ты муваешь файл, и бац, у нового — новый файловый дескриптор, а ОС сбрасывает кэш в старое место
она не может сбросить кеш в старое место, потому что 1) на одной фс инод сохраняется 2) между фс происходит копирование, и чтение идет из последней копии в памяти (кеша)
Alexander
Это не особо проблема конечно, но если бы дать сразу после окончания использования, как я раньше писал, то и этой проблемы бы не было.
Oleg
жентельмены, а представим, что я хочу целочисленный 4 байтный тип не для битоёбства, а для целых чисел в диапазоне -(2^31 - 1) .. 2^31 - 1 положим, я назову его Shit и так, чтобы Option<Shit> Тоже был четырёхбайтным например, а None представлялся как 1000..0 могу я это сделать в расте сегодняшнего дня или нет?
Денис
она не может сбросить кеш в старое место, потому что 1) на одной фс инод сохраняется 2) между фс происходит копирование, и чтение идет из последней копии в памяти (кеша)
ещё раз, я специально уточнил про "разные фс") по второму пункту — ну вот и отлично, у тебя скопируется старый файл (при плохом сценарии)
Oleg
Нет
спасибо, Владимир
Vladimir
Пока все оптимизации с option встроены в компилятор, но вроде хотели это расширить
Денис
https://stackoverflow.com/questions/7433057/is-rename-without-fsync-safe
Αλεχ
Нет
почему нет?
Αλεχ
Что мешает сделать тип Shit
Αλεχ
с методом is_none?
Oleg
с методом is_none?
мне нужно, чтобы это был прям опшон
Oleg
и чтобы все методы, которые принимают там Option<A> принимали его
Маjко
Конечно нет, как ты себе это представляешь?
Oleg
и чтобы я его мог в каких-нибудь там итератах вызывать
Маjко
Засунуть 2 разных типа нельзя в не-генерик ф-ю
Alexander
Покажи код уже
Дык даже лень пример писать и так ясно: { let f = File::create... } fs::rename
Денис
блин, форматирование поехало, в общем https://www.kernel.org/doc/Documentation/filesystems/ext4.txt — "Many broken applications..."
Vladimir
Конечно нет, как ты себе это представляешь?
Ну примерно как null pointet оптимизации, почему б нет, если есть гарантии что этот тип не занимает определенные значения
Oleg
Засунуть 2 разных типа нельзя в не-генерик ф-ю
ну я имел в виду fn foo<T>(x: Option<T>)
Маjко
ну я имел в виду fn foo<T>(x: Option<T>)
Ты хочешь особую проверку is_none
Oleg
ну и чтобы я мог это во всяких итераторах возвращать там ну и т.п.
Vladimir
Но эти гарантии делает компилер и это специальные кейсы, а не фича языка
Ну я так и написал, но вроде чёт хотели про опшин добавить
Маjко
Так не выйдет
Маjко
Ты можешь сделать для своего типа какой-нить дешевый Into<Option<T»
Денис
В двух словах что скажешь?
что в ext4 есть специальный хак для тех, кто не делает фсинк )
Vladimir
Ну и отлично
Маjко
Чтобы при общении с внешним API конвертить
Oleg
ну это же всё равно будут всякие доп вызовы и мелькающие 8 байт на стеке
Маjко
А сделать специализацию is_none для Option<i32> абсолютно точно нельзя.
Oleg
ну я не предполагал Option<i32>
Маjко
Надо тестить и смотреть асм
Oleg
хорошо, ясно, спасибо
Vladimir
что в ext4 есть специальный хак для тех, кто не делает фсинк )
Вообще-то вроде не относится к кешу, как я понял.
պլհկ
что в ext4 есть специальный хак для тех, кто не делает фсинк )
проблемы не будет если из розетки не дергать
պլհկ
что и обещали
Маjко
хорошо, ясно, спасибо
Ну прост ты сам говоришь: 8 байт для обычного опшнала А хочешь запихнуть в 4 и передавать в те же ф-и, так не выйдет
Oleg
ну я имел в виду дженерики
Oleg
это ведь не совсем "те же" функции будут
Маjко
Option это всегда 4 байта тэг + sizeof(data)
Маjко
Поменять лейаут структуры генерик не может
Маjко
Это не шаблоны
Vladimir
это ведь не совсем "те же" функции будут
Заведи тогда трейт Optional который для твоего типа будет отдельную реализацию иметь
Oleg
Option это всегда 4 байта тэг + sizeof(data)
есть же специализации для простых енумов и референсов
Маjко
Это не фича языка)
Sergey
Это не фича языка)
аттрибутов #[] нет для этого?
Vladimir
я вот подумал, что уже может такое заведено
Ну это не совсем то, что ты хочешь, но если сам пишешь генерики, то норм
Oleg
как, покажи?
https://play.rust-lang.org/?gist=c375f8f6d9a6558c18b7e42d52c60edd&version=stable&mode=debug
Vladimir
аттрибутов #[] нет для этого?
Вроде не было, просто компилятор знает что тег и ссылка особые типы
Vladimir
По этому вложенные енамы могут занимать всего пару байт
Sergey
разницы нет