Здравствуйте, Аноним, Вы писали:
А>вообщем не вижу проблемы.
Как известно, главное в умении ходить сквозь стены -- не видеть препятствий
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, rg45, Вы писали:
R>Я несколько лет назад сталкивался с аналогичной проблемой: как функциональный объект превратить в указатель на функцию. Был применен грязный хак, но решение получилось вполне рабочее. В двух словах идея в следующем: в динамической памяти выделяется блок(блоки) исполняемого кода. Этот код полностью соответствует коду обычной функции, которая делегирует переданные ей параметры функтору, this которого, как и вызываемой функции-члена, были "прошиты" непосредственно в коде. Адреса этих блоков памяти интерпретирповались как точки входа в функции с соответствуюшими сигнатурами. Формирование таких блоков — задача интересная сама по себе, если заинтересует, могу изложить мое решение.
В принципе, с практической точки зрения, достаточно иметь пул таких функций какого-то предопределённого размера. И просто, когда такая функция нужна, аллокировать функцию из пула, прописывать в неё параметры, вызывать scandir, ну а потом возвращать функцию в пул.
По идее число функций из пула нужных одновременно довольно ограниченно по жизни, кроме того, его можно ограничить при помощи семафора. Типа если больше 16 потоков хочет одновременно позвать scandir, то все, начиная с 17-го ждут своей очереди...
Именно ткие рассуждения привели меня к такому вот решению
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, ., Вы писали:
.>Ты начни с того, насколько это переносимо, будет ли это работать с DEP?
В рамках одной архитектуры процессора — вполне переносимо (другими словами, под каждую архитектуру нужно писать свои переходники, как сделано в ATL). С DEP работать будет, если нормально реализовать (достаточно выделять память под санки через VirtualAlloc c PAGE_EXECUTE_READWRITE).
Здравствуйте, vitalyk, Вы писали:
V>Здравствуйте, ., Вы писали:
.>>Ты начни с того, насколько это переносимо, будет ли это работать с DEP?
V>В рамках одной архитектуры процессора — вполне переносимо (другими словами, под каждую архитектуру нужно писать свои переходники, как сделано в ATL). С DEP работать будет, если нормально реализовать (достаточно выделять память под санки через VirtualAlloc c PAGE_EXECUTE_READWRITE).
Еще есть проблема с разными размерами указателей на данные и испоняемый код.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>Еще есть проблема с разными размерами указателей на данные и испоняемый код.
Да вообще проблем много довольно. Например на PPC есть специальный регистр, который аддресует 64К памяти, к которой есть быстрый доступ. Компиляторы часто располагают там всякие нужные по ходу пьесы статические данные. Соответсвенно, если позвать функцию, а в регистре этом не то передать, то а-та-та будет. Так что приходится иметь в указателе на функцию два числа -- адрес кода и адрес, который должен оказаться в таком регистре. Ну а как в таких условиях рожать свой код -- вопрос тоде довольно прикольный
И совсем-совсем-совсем не портабл.
Когда я в прошлый раз в такую фигню упёрся, я в конце концов придумал как ничего не компилировать и иметь приемлемую производительность тем не менее.
Так что я бы компиляции избегал бы всеми ногами и руками
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, sokel, Вы писали:
S>Здравствуйте, Graf Alex, Вы писали:
GA>>Всем спасибо за разъяснение...
GA>>Сразу отвечаю на некоторые пункты, дабы не отвечать на каждое письмо в отдельности GA>>1) scandir — Единственный способ получить список файлов в линухе... во всяком случае из известных мне высокоуровневых. Да, тут явная ошибка в дизайне, но деваться мне некуда. По той же причине пнуть создателя я не могу
S>а чем glob не подходит?
Не нашел для C++
Здравствуйте, Graf Alex, Вы писали:
GA>Здравствуйте, sokel, Вы писали:
S>>Здравствуйте, Graf Alex, Вы писали:
GA>>>Всем спасибо за разъяснение...
GA>>>Сразу отвечаю на некоторые пункты, дабы не отвечать на каждое письмо в отдельности GA>>>1) scandir — Единственный способ получить список файлов в линухе... во всяком случае из известных мне высокоуровневых. Да, тут явная ошибка в дизайне, но деваться мне некуда. По той же причине пнуть создателя я не могу
S>>а чем glob не подходит? GA>Не нашел для C++
Упс.. не там искал
E>Можно, кстати, заставить клиентов ждать на семафоре со счётчиком равным ThunkFunc::TotallRegisteredCollbaks() -- тогда всё будет вообще хорошо.
Сдаётся мне что решение с семафором будет потенциальным источником дедлоков. Из интерфейса функции-то не видно что кто-то с кем-то тут будет синхронизироваться, и если callback-функции будут в свою очередь вызывать scandir, то могут быть траблы. Так что имхо уж лучше TLS или thunk-и.