Re[2]: Понедельник начинается в субботу? :)
От: Erop Россия  
Дата: 24.04.08 10:03
Оценка: :))) :)
Здравствуйте, Аноним, Вы писали:

А>вообщем не вижу проблемы.


Как известно, главное в умении ходить сквозь стены -- не видеть препятствий
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: функтор как указатель на функцию
От: Erop Россия  
Дата: 24.04.08 10:08
Оценка: 4 (1)
Здравствуйте, rg45, Вы писали:

R>Я несколько лет назад сталкивался с аналогичной проблемой: как функциональный объект превратить в указатель на функцию. Был применен грязный хак, но решение получилось вполне рабочее. В двух словах идея в следующем: в динамической памяти выделяется блок(блоки) исполняемого кода. Этот код полностью соответствует коду обычной функции, которая делегирует переданные ей параметры функтору, this которого, как и вызываемой функции-члена, были "прошиты" непосредственно в коде. Адреса этих блоков памяти интерпретирповались как точки входа в функции с соответствуюшими сигнатурами. Формирование таких блоков — задача интересная сама по себе, если заинтересует, могу изложить мое решение.


В принципе, с практической точки зрения, достаточно иметь пул таких функций какого-то предопределённого размера. И просто, когда такая функция нужна, аллокировать функцию из пула, прописывать в неё параметры, вызывать scandir, ну а потом возвращать функцию в пул.
По идее число функций из пула нужных одновременно довольно ограниченно по жизни, кроме того, его можно ограничить при помощи семафора. Типа если больше 16 потоков хочет одновременно позвать scandir, то все, начиная с 17-го ждут своей очереди...

Именно ткие рассуждения привели меня к такому вот решению
Автор: Erop
Дата: 24.04.08
.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: функтор как указатель на функцию
От: vitalyk  
Дата: 24.04.08 11:09
Оценка: +2
Здравствуйте, ., Вы писали:

.>Ты начни с того, насколько это переносимо, будет ли это работать с DEP?


В рамках одной архитектуры процессора — вполне переносимо (другими словами, под каждую архитектуру нужно писать свои переходники, как сделано в ATL). С DEP работать будет, если нормально реализовать (достаточно выделять память под санки через VirtualAlloc c PAGE_EXECUTE_READWRITE).
... << RSDN@Home 1.2.0 alpha 4 rev. 1052>>
Re[4]: функтор как указатель на функцию
От: rg45 СССР  
Дата: 24.04.08 11:17
Оценка:
Здравствуйте, vitalyk, Вы писали:

V>Здравствуйте, ., Вы писали:


.>>Ты начни с того, насколько это переносимо, будет ли это работать с DEP?


V>В рамках одной архитектуры процессора — вполне переносимо (другими словами, под каждую архитектуру нужно писать свои переходники, как сделано в ATL). С DEP работать будет, если нормально реализовать (достаточно выделять память под санки через VirtualAlloc c PAGE_EXECUTE_READWRITE).


Еще есть проблема с разными размерами указателей на данные и испоняемый код.
--
Справедливость выше закона. А человечность выше справедливости.
Re: функтор как указатель на функцию
От: brovushkin Украина  
Дата: 24.04.08 20:21
Оценка:
// Если число масок ограничено, то можно попытаться сделать наподобие этого примера
// пример использования scandir взят из man scandir
// strcmp заменить на fnmatch
// test1.cpp
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>

struct Mask1
{
        static const char *name()
        {
                return "test1.cpp";
        }
};

struct Mask2
{
        static const char *name()
        {
                return "test2.cpp";
        }
};

template<class M>
struct FnMacher
{
        static int filter(const struct dirent *entry)
        {
                const char *name = entry->d_name;
                int r = strcmp(name, M::name());

                return (r == 0);
        }
};

int main()
{
        struct dirent **namelist;
        int n = scandir(".", &namelist, &FnMacher<Mask1>::filter, 0);

        if (n < 0)
           perror("scandir");
        else 
        {
           while (n--) 
           {
                   printf("Mask1: %s\n", namelist[n]->d_name);
                   free(namelist[n]);
           }

           free(namelist);
        }

        n = scandir(".", &namelist, &FnMacher<Mask2>::filter, 0);

        if (n < 0)
           perror("scandir");
        else 
        {
           while (n--) 
           {
                   printf("Mask2: %s\n", namelist[n]->d_name);
                   free(namelist[n]);
           }

           free(namelist);
        }

        return 0;
}
Re[5]: функтор как указатель на функцию
От: Erop Россия  
Дата: 24.04.08 21:17
Оценка:
Здравствуйте, rg45, Вы писали:

R>Еще есть проблема с разными размерами указателей на данные и испоняемый код.


Да вообще проблем много довольно. Например на PPC есть специальный регистр, который аддресует 64К памяти, к которой есть быстрый доступ. Компиляторы часто располагают там всякие нужные по ходу пьесы статические данные. Соответсвенно, если позвать функцию, а в регистре этом не то передать, то а-та-та будет. Так что приходится иметь в указателе на функцию два числа -- адрес кода и адрес, который должен оказаться в таком регистре. Ну а как в таких условиях рожать свой код -- вопрос тоде довольно прикольный
И совсем-совсем-совсем не портабл.
Когда я в прошлый раз в такую фигню упёрся, я в конце концов придумал как ничего не компилировать и иметь приемлемую производительность тем не менее.
Так что я бы компиляции избегал бы всеми ногами и руками
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: функтор как указатель на функцию
От: Graf Alex Украина http://grafalex.oberon.kiev.ua
Дата: 25.04.08 07:25
Оценка:
Здравствуйте, sokel, Вы писали:

S>Здравствуйте, Graf Alex, Вы писали:


GA>>Всем спасибо за разъяснение...


GA>>Сразу отвечаю на некоторые пункты, дабы не отвечать на каждое письмо в отдельности

GA>>1) scandir — Единственный способ получить список файлов в линухе... во всяком случае из известных мне высокоуровневых. Да, тут явная ошибка в дизайне, но деваться мне некуда. По той же причине пнуть создателя я не могу

S>а чем glob не подходит?

Не нашел для C++
Re[4]: функтор как указатель на функцию
От: Graf Alex Украина http://grafalex.oberon.kiev.ua
Дата: 25.04.08 07:26
Оценка:
Здравствуйте, Graf Alex, Вы писали:

GA>Здравствуйте, sokel, Вы писали:


S>>Здравствуйте, Graf Alex, Вы писали:


GA>>>Всем спасибо за разъяснение...


GA>>>Сразу отвечаю на некоторые пункты, дабы не отвечать на каждое письмо в отдельности

GA>>>1) scandir — Единственный способ получить список файлов в линухе... во всяком случае из известных мне высокоуровневых. Да, тут явная ошибка в дизайне, но деваться мне некуда. По той же причине пнуть создателя я не могу

S>>а чем glob не подходит?

GA>Не нашел для C++
Упс.. не там искал
Re[2]: придумался хак :)
От: Left2 Украина  
Дата: 26.04.08 12:18
Оценка:
E>Можно, кстати, заставить клиентов ждать на семафоре со счётчиком равным ThunkFunc::TotallRegisteredCollbaks() -- тогда всё будет вообще хорошо.

Сдаётся мне что решение с семафором будет потенциальным источником дедлоков. Из интерфейса функции-то не видно что кто-то с кем-то тут будет синхронизироваться, и если callback-функции будут в свою очередь вызывать scandir, то могут быть траблы. Так что имхо уж лучше TLS или thunk-и.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.