Блокировка файлов из fcntl для синхронизации dylibs на том же хосте - PullRequest
0 голосов
/ 20 февраля 2019

Я пишу серию плагинов для стороннего хост-приложения OSX, которому придется общаться друг с другом через разделяемую память.Каждый будет расположен в своем собственном dylib, и, таким образом, все они будут загружены в один и тот же хост-процесс.Или нет, в зависимости от того, запущен ли один или несколько хост-процессов.

Я хочу координировать доступ к общей памяти с помощью консультативных блокировок fcntl, используя состояние исключительной и общей блокировки для обозначения true/ ложные условия.Таким образом, я использую эти блокировки файлов как флаги bool для всей ОС, где плагины могут проверять свое состояние, пытаясь получить эксклюзивную блокировку файла.Я предполагаю, что они работают одинаково и в Linux (отсюда и тег 'linux').

Однако везде, где я читаю, эти блокировки файлов прикрепляются не к файловым дескрипторам, а к парам (pid, inode), что делает ихпроцесс широкий, а не поток.Но в моем случае все плагины выполняются в одном и том же процессе, поэтому я предполагаю, что все они используют один и тот же pid ...?Правильно ли я пришел к выводу, что не могу использовать эти блокировки для координации своих плагинов, если они работают под одним и тем же хост-процессом?

У меня, к сожалению, нет доступа к Mac в данный момент, чтобы проверить это;отсюда и вопрос.Я также не смог найти никакой полезной информации при поиске вариантов fcntl dylib lock [thread &| process].

Для некоторого фона:

  • Я не могу использовать pthread_mutex es здесь, так как онисначала нужно будет найти его в общей папке, настройку которой я должен сначала координировать (проблема с курицей и яйцом);
  • Я также решил не использовать семафоры, так как из-за сбойного или некорректно работающего плагина / приложения оставалосьвещь в промежуточном состоянии, делающая ее бесполезной до конца сеанса (блокировки снимаются системой после сбоя);
  • Другая полезная вещь блокировок файлов - это то, что я могу ждать их при попыткесделать эксклюзивный тест блокировки (через F_SETLKW).
  • Я не могу контролировать порядок загрузки плагинов, поэтому я не могу статически пометить один плагин, чтобы он действовал как мастер-плагин, настраивая вещи;
  • И я вообще не могу контролировать приложение хоста.
...