Constantine
с чего ты это взял?
а какая альтернатива?
Berkus
с вызовом по this в стеке он дохнет как раз при delete this
Constantine
смотри, ты получаешь результат DISCONNECTED при проведении операции
Berkus
а хендлер это даже не мембер функция, туда указатель на сессии аргументом передается или захваченной переменной
Berkus
а какая альтернатива?
передавать shared_ptr в хендлер
Berkus
дальше он может его передать дальше или скинуть
Berkus
при этом работает ДАЖЕ если несколько хендлеров параллельно вызвались
Anatoly
@berkus @webreh короче, можно резюмировать, если С++ объект управляет временем жизни ресурса, то здесь вопросов нет, если ресурс управляет временем жизни объекта C++, то delete this в самый раз
Berkus
закончили
Constantine
передавать shared_ptr в хендлер
смотри: я получаю сигнал разрыва соединения. Мои действия?
Крылатый
приватный конструктор
Есть же человеческий delete
Constantine
ну серьезно
Berkus
надоело короч, надо писать код
Constantine
вопрос: какая альтернатива, кроме 1) объект может существовать после разрыва соединения 2) оповещение разрыва удаляет объект
Berkus
если хочется узнать что делать - посмотри в код, я дал ссылку
Berkus
там полный lifecycle сетевого соединения с ssl
Constantine
я не понимаю, какое третее между "объект удален оповещением" и "объект не удален оповещением"
Anatoly
хуета, ок
ну, это не то, что я сказал
Constantine
если хочется узнать что делать - посмотри в код, я дал ссылку
так код просто реализует альтернативу "объект бывает в некорректном состоянии"
Berkus
так код просто реализует альтернативу "объект бывает в некорректном состоянии"
я посмотрю как ты реализуешь это c delete this, хотя ты обвиосли не сможешь - застопоришься на постоянных крашах от double free
Berkus
я не собираюсь это делать
ну я и сказал, что не сможешь
Constantine
грубо говоря я считаю корректным примером примерно следующее struct some_reference_wrapper { static some_reference_wrapper * wrap(notifiable_object & ref) { return new some_reference_wrapper(ref); } void notify() & { delete this; } private: explicit some_reference_wrapper(notifiable_object & ref): ref_(ref) { ref.on_dtor(UTILS_BIND_THIS(notify)); } notifiable_object & ref_; };
Alexander "SonnySlave"
вроде же Джерри там главный. Но Зайцев там тоже важный 🙂
ну ты как бы пинай, чтобы либы пакетили. Ещё пусть пилят плагин
Alexander "SonnySlave"
там работы жесть сколько. просто пусть пакетят либы
Berkus
после пары double free обсудим еще раз
Крылатый
Нахера delete this?
Крылатый
Не нужно же. И так вызывается деструктор.
Berkus
Нахера delete this?
лучше заменить на эксплицитный вызов деструктора в конструкторе
Constantine
Constantine
а, стоп, все норм
Berkus
чсх я уже написал)
не знаю что такое чсх, но давай ссылку
Constantine
что самое характерное
Constantine
я думал в примере есть double free
Constantine
у меня нет примеров кода с double free, я все указатели врапаю всегда
Constantine
delete запрещено конвенцией кроме реализации just-another-smart-ptr
Berkus
должно быть жутко эффективно, но мы не об этом
Berkus
хтппс сессия
Berkus
внешнее владение, или как там у вас это называется
Constantine
у меня будет в этой модели сокет-суицидник, который всегда за оберткой
Constantine
хотя это неудобно, да
Constantine
наверное, обертка-сессия хранит сокет-суицидник с приватным деструктором и вызывает disconnect сокета в своем деструкторе наверное, сокет-суицидник хранит ссылку на сессию и оповещает сессию перед самоуничтожением
Constantine
принципиально можно без delete this, она просто грохнет его через unique_ptr
Berkus
disconnect() сокета это асинхронная операция, которая заканчивается ... когда-то
Constantine
тогда у сокета не ссылка, а указатель на сессию
Constantine
нельзя, только delete this, только хардкор
ну в моем астральном мире это одно и то же
Constantine
технически delete this там будет после последней операции
Constantine
оповещение произошедшего disconnect
Berkus
хорошо, а как ты определишь что операция была последняя?
Constantine
тахионный ответ ;)
Constantine
я оповещаю сессию, если она от меня не детачнулась раньше
Berkus
ну вот ты вызвал сокету дисконнект, и он уже дисконнектнулся, но тут вдруг SSL такой А ЗАКРЫТЬ СЕКЬЮРНОЕ СОЕДИ
Constantine
у меня взаимные оповещения о смерти между сессией и сокетом-суицидником
Constantine
логика "что делать при операциях с нуллптр вместо сокета" остается сессии
Constantine
сессия никому никогда не дает указатель внутренний на сокета-суицидника
Berkus
логика "что делать при операциях с нуллптр вместо сокета" остается сессии
ясно-понятно, то есть во ВСЁМ коде у тебя еще и проверка shared_ptr на нулл, да?
Constantine
у меня нет ни одного shared_ptr
Constantine
только обычные указатели
Constantine
проверка на null в деструкторах
Constantine
проверка на null в сессии при операциях
Constantine
мультитрединг идет в лес
Berkus
что ж, я составил представление о твоей (говно)архитектуре, спасибо
Berkus
она хотя бы быстрая
Vsevolod
она говняная
Vsevolod
даже в plain c постоянно приходится иметь дело с рефкаунтерами
Berkus
она говняная
зато быстрая
Vsevolod
так и shared_ptr быстрая
Vsevolod
если не дергать рефкаунтер без нужны
Vsevolod
нужды
Berkus
так и shared_ptr быстрая
при multicore contention - ОЧЕНЬ медленная
Stanislav
ты же в курсе что delete nullptr это вполне ок и описано в стандарте? проверка не нужна