а вот еще случай был...
Jan. 5th, 2014 12:40 amДелаю плагин для AviSynth, это такая гибкая штука для обработки видео: снаружи скриптовый язычок, внутри написанные на С++ модули. Модули эти обмениваются видео кадрами, для которых сделано автоматическое управление временем жизни через COM-like подсчет ссылок. Документация велит обычные указатели на VideoFrame не использовать, а использовать умный указатель PVideoFrame везде, он сам счетчик ссылок дергает когда надо. А еще там некоторое подобие uniqueness typing а-ля Clean: PVideoFrame может кому угодно выдать указатель для чтения видеоданных, но на запись он даст указатель только когда счетчик ссылок равен 1, т.е. писать можно только когда никто не смотрит, когда кадр всецело твой. Натурально как в Clean, там тоже, когда никто объект не пытается менять, можно несколько ссылок на него иметь из разных мест, а вот писать туда можно только когда ссылка единственная, уникальная. Но только в Clean сделано правильно: ежели мы уникальный указатель в функцию передали, то он внутри нее тоже уникальный, а то, что где-то на стеке остался еще один - во фрейме вызывающей функции - это не считается, он же сейчас недоступен. А вот на С++ когда умный указатель PVideoFrame передается в функцию, то это идет как создание копии, и теперь у нас на кадр две ссылки: одна в вызывающей функции и одна в вызванной. Счетчик ссылок становится больше 1, и все, получить указатель на видеоданные для записи он уже не дает. Приходится в функции ссылку на умный указатель передавать. Указатель на указатель на указатель... Такой вот смешной дизайн.
no subject
Date: 2014-01-04 07:35 pm (UTC)no subject
Date: 2014-01-04 07:59 pm (UTC)no subject
Date: 2014-01-04 08:34 pm (UTC)no subject
Date: 2014-01-04 08:37 pm (UTC)no subject
Date: 2014-01-04 09:04 pm (UTC)void f(T *p) { p->Method(); } void g(T *p) { f(p); f(p); } void f() { ... shared_ptr<T> p = ...; g(p.get()); }no subject
Date: 2014-01-04 09:16 pm (UTC)У тебя же скорее всего твои функции, которые ты там вызываешь, не хранят нигде эти указатели.
Не лучше ли оставить PVideoFrame для внешнего API, а у себя в коде передавать обычный указатель на VideoFrame, забив на документацию?
no subject
Date: 2014-01-04 10:07 pm (UTC)no subject
Date: 2014-01-05 02:04 am (UTC)Плюс rwlock это lock, с сопряженными проблемами.
no subject
Date: 2014-01-05 04:21 am (UTC)no subject
Date: 2014-01-05 08:10 am (UTC)no subject
Date: 2014-01-05 09:51 am (UTC)no subject
Date: 2014-01-05 10:04 am (UTC)no subject
Date: 2014-01-05 11:21 am (UTC)no subject
Date: 2014-01-05 05:03 pm (UTC)А при использовании твоего подхода с очень умными указателями ошибку надо будет возвращать откуда-то из недр твоего алгоритма.
no subject
Date: 2014-01-05 05:54 pm (UTC)no subject
Date: 2014-01-06 01:21 pm (UTC)2) Жэстачайший хак с принудительным декрементом.