thedeemon: (office)
[personal profile] thedeemon
Делаю плагин для AviSynth, это такая гибкая штука для обработки видео: снаружи скриптовый язычок, внутри написанные на С++ модули. Модули эти обмениваются видео кадрами, для которых сделано автоматическое управление временем жизни через COM-like подсчет ссылок. Документация велит обычные указатели на VideoFrame не использовать, а использовать умный указатель PVideoFrame везде, он сам счетчик ссылок дергает когда надо. А еще там некоторое подобие uniqueness typing а-ля Clean: PVideoFrame может кому угодно выдать указатель для чтения видеоданных, но на запись он даст указатель только когда счетчик ссылок равен 1, т.е. писать можно только когда никто не смотрит, когда кадр всецело твой. Натурально как в Clean, там тоже, когда никто объект не пытается менять, можно несколько ссылок на него иметь из разных мест, а вот писать туда можно только когда ссылка единственная, уникальная. Но только в Clean сделано правильно: ежели мы уникальный указатель в функцию передали, то он внутри нее тоже уникальный, а то, что где-то на стеке остался еще один - во фрейме вызывающей функции - это не считается, он же сейчас недоступен. А вот на С++ когда умный указатель PVideoFrame передается в функцию, то это идет как создание копии, и теперь у нас на кадр две ссылки: одна в вызывающей функции и одна в вызванной. Счетчик ссылок становится больше 1, и все, получить указатель на видеоданные для записи он уже не дает. Приходится в функции ссылку на умный указатель передавать. Указатель на указатель на указатель... Такой вот смешной дизайн.

Date: 2014-01-04 07:35 pm (UTC)
From: [identity profile] zeux.livejournal.com
Передавать (умные) указатели по (константным) ссылкам это в принципе часто правильно т.к. экономит лишние операции со счетчиком ссылок.

Date: 2014-01-04 07:59 pm (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
Я обычно сырой указатель передаю вниз по стеку. Сырой - это weak, реализованый в стиле KISS

Date: 2014-01-04 08:34 pm (UTC)
From: [identity profile] dr-cha0s.livejournal.com
move семантики не хватает :-)

Date: 2014-01-04 08:37 pm (UTC)
From: [identity profile] dr-cha0s.livejournal.com
и проверять каждый раз счётчик руками? не комильфо

Date: 2014-01-04 09:04 pm (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
Зачем проверять каждый раз счетчик руками?.. Тем более, что он не всегда доступен из объекта, если отдельно хранится, или вообще не существует (scoped/auto_ptr).

void f(T *p) { p->Method(); }
void g(T *p) { f(p); f(p); }


void f() {
   ... 
   shared_ptr<T> p = ...;
 
   g(p.get());
}

Edited Date: 2014-01-04 09:06 pm (UTC)

Date: 2014-01-04 09:16 pm (UTC)
From: [identity profile] soonts.livejournal.com
>Указатель на указатель на указатель
У тебя же скорее всего твои функции, которые ты там вызываешь, не хранят нигде эти указатели.
Не лучше ли оставить PVideoFrame для внешнего API, а у себя в коде передавать обычный указатель на VideoFrame, забив на документацию?

Date: 2014-01-04 10:07 pm (UTC)
From: [identity profile] 109.livejournal.com
а почему не оставить указателям указателево, а для single writer multiple readers имплементировать человечеcкий rwlock?

Date: 2014-01-05 02:04 am (UTC)
From: [identity profile] zeux.livejournal.com
Указатель, реализованный так как реализован в OP, [как я понимаю] пытается гарантировать корректность использования - rwlock ничего никому не гарантирует (т.е. семантическую корректность автоматически просто так никто не проверяет).

Плюс rwlock это lock, с сопряженными проблемами.
Edited Date: 2014-01-05 02:05 am (UTC)

Date: 2014-01-05 04:21 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Может и лучше. Просто забавно, как сочетание двух абстракций заставляет их течь прямо сразу.

Date: 2014-01-05 08:10 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Полагаю, задумка в том, что если получаешь ответ "сейчас вам сюда писать нельзя", то это значит не "подождите пока освободится, потом пишите", а "у вас в логике ошибка, вы что-то делаете неправильно, вы не должны даже пытаться сюда писать".

Date: 2014-01-05 09:51 am (UTC)
From: [identity profile] dr-cha0s.livejournal.com
это будет работать только если вызывающая функция будет гарантировать, что счётчик никто не увеличит.

Date: 2014-01-05 10:04 am (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
Она будет гарантировать. Так как вызывающая функция не работает, пока запущена вызываемая.

Date: 2014-01-05 11:21 am (UTC)
From: [identity profile] dr-cha0s.livejournal.com
Всё верно, но может быть несколько потоков выполнения, которые разделяют счётчик ссылок с указателем.

Date: 2014-01-05 05:03 pm (UTC)
From: [identity profile] soonts.livejournal.com
Обрати ещё внимание, шо если тебе из внешнего API пришол PVideoFrame, куда ты не можешь пейсать, то при использовании сырых указателей ты об этом узнаешь первым же делом, при попытке получить сырой указатель, и сразу вернёшь код ошибки.
А при использовании твоего подхода с очень умными указателями ошибку надо будет возвращать откуда-то из недр твоего алгоритма.

Date: 2014-01-05 05:54 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Не, там чуть иначе. Получить *VideoFrame из PVideoFrame я могу всегда, а у него уже надо вызывать frame->GetReadPtr() или frame->GetWritePtr(), выдающие const BYTE* и BYTE* соответственно. В этом плане сырой указатель от умного не отличается.

Date: 2014-01-06 01:21 pm (UTC)
From: [identity profile] kodt-rsdn.livejournal.com
1) А почему там нет move семантики? Она даже на С++98 делается, хотя и с элементами секса и порнографии - как у auto_ptr.
2) Жэстачайший хак с принудительным декрементом.

Profile

thedeemon: (Default)
Dmitry Popov

April 2026

S M T W T F S
   1 234
567891011
12131415161718
19202122232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 24th, 2026 10:27 am
Powered by Dreamwidth Studios