Проблема блокировки IOS-поверхности

У меня есть проблема с изменением IOSurface на MacOS 10.13.6. Для меня это выглядит как блокировка не работает, как задокументировано. Вот мой код:

NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithInt:640], kIOSurfaceWidth,
                      [NSNumber numberWithInt:480], kIOSurfaceHeight,
                      nil];

IOSurfaceRef surf = IOSurfaceCreate((CFDictionaryRef)dict);
uint32_t seed = 0;
NSLog(@"seed 0: %d", IOSurfaceGetSeed(surf));
if (IOSurfaceLock(surf, 0, &seed) == 0)
{
    NSLog(@"seed 1: %d", seed);
    if (IOSurfaceUnlock(surf, 0, &seed) == 0)
    {
        NSLog(@"seed 2: %d", seed);
    }
}

Вывод при запуске кода

seed 0: 0
seed 1: 1
seed 2: 1

В документации заголовка Apple говорится, что при блокировке поверхность для записи seed обновляется после разблокировки, но здесь seed обновляется уже после блокировки. Поэтому я ожидал, что результат будет 0, 0, 1 вместо этого. Вот документация заголовка Apple о блокировке:

"Блокировать" или "разблокировать" IOSurface для чтения или записи. В этом контексте термин "блокировка" используется свободно и просто используется вместе с информацией "unlock", чтобы ограничить доступ ЦП к необработанным данным IOSurface. Если параметр seed не равен NULL, IOSurfaceLock() будет хранить значение начального изменения внутренней модификации буфера во время вызова блокировки. Вы можете сравнить это значение со значением, возвращенным ранее, чтобы определить, было ли содержимое буфера изменено с момента последней блокировки. В случае IOSurfaceUnlock() возвращаемое начальное значение будет внутренним начальным значением во время разблокировки. Если вы заблокировали буфер для записи, это значение будет увеличиваться по мере разблокировки и будет возвращено новое значение. Посмотрите перечисления kIOSurfaceLock для получения дополнительной информации. Примечание. Блокировка и разблокировка IOSurface не является особенно дешевой операцией, поэтому следует по возможности стараться избегать вызовов. Начальные значения особенно полезны для хранения кэша содержимого буфера.

При использовании совместного использования IOSurface между процессами мне нужно знать, когда поверхность фактически обновляется. Есть ли ошибка в моем коде или несоответствие между документацией Apple и ее функциональностью?

0 ответов

Другие вопросы по тегам