Size: a a a

2021 March 18

CD

Constantine Drozdov in pro.cxx
это можно попробовать воспроизвести так: запихиваем в очередь элемент, который в деструкторе ставит атомарный флаг без барьера, а в конце = очень аккуратно ассертит этот флаг (скажем, if (destroyed) std::terminate()
источник

CD

Constantine Drozdov in pro.cxx
ну и какой-нибудь странный способ генерации +- случайного таймаута длительности =
источник

D

Dmitriy in pro.cxx
Деаллокация все-таки происходит в рамках аллокатора со стеком узлов, которые не отдаются ОС...
источник

CD

Constantine Drozdov in pro.cxx
Dmitriy
Деаллокация все-таки происходит в рамках аллокатора со стеком узлов, которые не отдаются ОС...
если объект будет сильно нетривиальным, ему может не понравиться результат такого присваивания
источник

CD

Constantine Drozdov in pro.cxx
здесь вопрос - на какой структуре хранимого элемента вы находите ошибку
источник

D

Dmitriy in pro.cxx
Constantine Drozdov
если объект будет сильно нетривиальным, ему может не понравиться результат такого присваивания
Там есть требование на trivially_destructible и trivially_copyable :)
источник

D

Dmitriy in pro.cxx
Constantine Drozdov
здесь вопрос - на какой структуре хранимого элемента вы находите ошибку
Указатель
источник

CD

Constantine Drozdov in pro.cxx
Dmitriy
Там есть требование на trivially_destructible и trivially_copyable :)
ладно)
источник

CD

Constantine Drozdov in pro.cxx
Dmitriy
Там есть требование на trivially_destructible и trivially_copyable :)
а ошибка именно неверные значения на выходе, не провал аллокатора типа use-after-free?
источник

D

Dmitriy in pro.cxx
Constantine Drozdov
а ошибка именно неверные значения на выходе, не провал аллокатора типа use-after-free?
Ошибка - пропажа элементов
источник

CD

Constantine Drozdov in pro.cxx
Dmitriy
Ошибка - пропажа элементов
то есть множество push не совпадает с множеством pop?
источник

D

Dmitriy in pro.cxx
Constantine Drozdov
то есть множество push не совпадает с множеством pop?
Да. Остальной код корректен (по крайней мере, не использует общих данных, кроме атомарного флага stop и обращений к ядру ОС, и адекватно работает, если заменить текущую очередь на что-нибудь с мьютексом/спинлоком)
источник

CD

Constantine Drozdov in pro.cxx
Dmitriy
Да. Остальной код корректен (по крайней мере, не использует общих данных, кроме атомарного флага stop и обращений к ядру ОС, и адекватно работает, если заменить текущую очередь на что-нибудь с мьютексом/спинлоком)
на всякий случай - тест использует только операции push/pop?
источник

D

Dmitriy in pro.cxx
Constantine Drozdov
на всякий случай - тест использует только операции push/pop?
Да
источник

CD

Constantine Drozdov in pro.cxx
хм... но если элементы пропали, они утекли из аллокатора? можно, наверное, попробовать замаркировать судьбу каждого элемента по веткам
источник

D

Dmitriy in pro.cxx
Constantine Drozdov
хм... но если элементы пропали, они утекли из аллокатора? можно, наверное, попробовать замаркировать судьбу каждого элемента по веткам
Из аллокатора элементы не утекли, и это выглядит хорошей идеей для проверки
Он освобождает свой стек узлов лишь в деструкторе (в текущей реализации - при выгрузке драйвера), а ОС не позволит выгрузиться до освобождения всех IRP (указатели на которые и хранятся в очереди)
источник

CD

Constantine Drozdov in pro.cxx
Dmitriy
Из аллокатора элементы не утекли, и это выглядит хорошей идеей для проверки
Он освобождает свой стек узлов лишь в деструкторе (в текущей реализации - при выгрузке драйвера), а ОС не позволит выгрузиться до освобождения всех IRP (указатели на которые и хранятся в очереди)
Я имею в виду, что вызовов destroy_node должно быть не столько же, сколько create_data_node
источник

D

Dmitriy in pro.cxx
Constantine Drozdov
Я имею в виду, что вызовов destroy_node должно быть не столько же, сколько create_data_node
Да, логично... Поставлю счётчик
источник

D

Dmitriy in pro.cxx
Constantine Drozdov
Я имею в виду, что вызовов destroy_node должно быть не столько же, сколько create_data_node
Счётчики вызовов destroy_node() и create_data_node() очереди оказались равны  - в первом тесте 0xC1
А вот счетчик числа извлечений из очереди в единственном читателе - 0xBF
Дельта равна зафиксированному глобальным счётчиком значению IRP (инкрементится при получении запроса, декрементится при его завершении вызовом в ОС): 2шт "утекли"
источник

CD

Constantine Drozdov in pro.cxx
Dmitriy
Счётчики вызовов destroy_node() и create_data_node() очереди оказались равны  - в первом тесте 0xC1
А вот счетчик числа извлечений из очереди в единственном читателе - 0xBF
Дельта равна зафиксированному глобальным счётчиком значению IRP (инкрементится при получении запроса, декрементится при его завершении вызовом в ОС): 2шт "утекли"
ЭЭЭ подождите, destroy_node и create_data_node совпадают?
источник