Войти
Nebula CommunityФорум

Core in Nebula3.

Страницы: 1 2 Следующая »
#0
11:44, 17 мар. 2008

Сейчас вот разбираюсь с ядром небулы.
Немного завис на их РТТИ.
Не мог бы мне кто-нибудь немного разжевать, что представляет собой указатель после такого:

class SomeClass
{
    DeclareClass(SomeClass);
...
};

// потом где-нить инициализируем указатель на этот класс:

Ptr<SomeClass> someclass = SomeClass::Create();

что после этих действий представляет собой указатель?

и что значит вот это:

#define ImplementClass(type, fourcc, baseType) \
    Core::Rtti type::RTTI(#type, fourcc, type::FactoryCreator, &baseType::RTTI); \
    Core::Rtti* type::GetRtti() const { return &this->RTTI; } \
    Core::RefCounted* type::FactoryCreator() { return type::Create(); } \
    type* type::Create() \
    { \
        RefCounted::criticalSection.Enter(); \
        RefCounted::isInCreate = true; \
        type* newObject = n_new(type); \
        RefCounted::isInCreate = false; \
        RefCounted::criticalSection.Leave(); \
        return newObject; \
    }\
    bool type::RegisterWithFactory() \
    { \
        Core::SysFunc::Setup(); \
        if (!Core::Factory::Instance()->ClassExists(#type)) \
        { \
            Core::Factory::Instance()->Register(&type::RTTI, #type, fourcc); \
        } \
        return true; \
    }
?

Ещё хотел спросить, что значит __declspec(thread)?

И последний вопрос : как в многопоточном приложении нормально (стабильно) работают синглтоны?


#1
0:40, 18 мар. 2008

student
>Ещё хотел спросить, что значит __declspec(thread)
Вот цитата из MSDN:

The thread extended storage-class modifier is used to declare a thread local variable. 
__declspec( thread ) declarator
Thread Local Storage (TLS) is the mechanism by which each thread in a multithreaded process allocates storage for thread-specific data. In standard multithreaded programs, data is shared among all threads of a given process, whereas thread local storage is the mechanism for allocating per-thread data.
Declarations of thread local variables must use extended attribute syntax and the __declspec keyword with the thread keyword. For example, the following code declares an integer thread local variable and initializes it with a value:
__declspec( thread ) int tls_i = 1;

>как в многопоточном приложении нормально (стабильно) работают синглтоны?
Нормальна работают, т.к. приложение стартует всё равно в одном потоке, вот в это время и нужно их инициализировать.

#2
16:07, 18 мар. 2008

Black Angel
А не мог бы ты немного разжевать мне #define ImplementClass?

#3
12:02, 20 мар. 2008

А что тут сложного ?

    // Определяем rtti для класса (что это и зачем читай в исходниках)
    Core::Rtti type::RTTI(#type, fourcc, type::FactoryCreator, &baseType::RTTI); \
    // И функцию с помощью которой мы можем получить к нему доступ
    Core::Rtti* type::GetRtti() const { return &this->RTTI; } \
    // Это что-то подзабыл зачем нужно
    Core::RefCounted* type::FactoryCreator() { return type::Create(); } \
    // Создает экземпляр этого класса (причем одновременно создаваться может только один экземпляр данного класса)
    type* type::Create() \
    { \
        RefCounted::criticalSection.Enter(); \
        RefCounted::isInCreate = true; \
        type* newObject = n_new(type); \
        RefCounted::isInCreate = false; \
        RefCounted::criticalSection.Leave(); \
        return newObject; \
    }\
    // Регистрирует этот класс (например чтобы создавать экземпляры класса из скриптов)
    bool type::RegisterWithFactory() \
    { \
        Core::SysFunc::Setup(); \
        if (!Core::Factory::Instance()->ClassExists(#type)) \
        { \
            Core::Factory::Instance()->Register(&type::RTTI, #type, fourcc); \
        } \
        return true; \
    }
Вроде все так (исходников рядом нету) ...

#4
17:37, 20 мар. 2008

Intor

> // Создает экземпляр этого класса (причем одновременно создаваться может
> только один экземпляр данного класса)
А чем гарантируется единственность экземпляра?

> // Регистрирует этот класс (например чтобы создавать экземпляры класса из
>скриптов)
?
Просвяти...

#5
11:31, 21 мар. 2008

student
>А чем гарантируется единственность экземпляра?
RefCounted::criticalSection.Enter();
RefCounted::criticalSection.Leave();

>> // Регистрирует этот класс (например чтобы создавать экземпляры класса из скриптов)
>?
>Просвяти...
В Небуле можно создавать экземпляры классов из скриптов, вызывать их методы и т.д.
Они все содержатся в деревовидном списке (дереве), например для обращения к серверу ввода из скриптов мы идем в
/sys/servers/input и там можем вызывать его методы.

Я так понял, тебе не хватает базовых знаний по Небуле.
Попробуй так: создай текстовой документик, и в нем для каждого h и cc из Core разберись и опиши что в нем находится и для чего нужно.
Такие вопросы отпадут сами по себе.

#6
20:28, 21 мар. 2008

>Я так понял, тебе не хватает базовых знаний по Небуле.
Это верно... (
>Попробуй так: создай текстовой документик, и в нем для каждого h и cc из Core разберись и опиши что в нем находится и для чего нужно.
так я и так уже пытаюсь, правда пока не очень выходит. (

#7
9:59, 22 мар. 2008

student
Начни с самых базовых макросов, классов ...
Секундочку ... у меня, вроде завалялся такой документик ... писал, когда-то ...

#8
10:04, 22 мар. 2008

Насчет точности и подробности не гарантрую (писал сам и давно) ...
Здесь про Kernel.

Папки:
gfx2 - один файл
kernel
loki
mathlib
signals
tinyxml
util

!!! KERNEL !!!

natomtable
    Хэш вида: ключ (число) - строка.
nclass
    Базовый класс Небулы. Умеет много чего. Плюс объявлены некоторые макросы.
ncmd
    Инкапсулирует вызовы функций в классах C++. Используется как часть интерфейса к скрипт системе.
ncmdproto
    Интерфейс к описанию прототипа функции. Вроде: fff_getrotate_v - 3 float на выход, на вход ничего,
    имя функции 'getrotate'. Используется как часть интерфейса к скрипт системе.
    Примечание: часть сырцов в папке loki, надо разобраться что там лежит...
ncmdprotonative
    Собственно реализация исполнения команд. Используется как часть интерфейса к скрипт системе.
ncrc
    Расчёт CRC суммы области памяти.
ndebug
    Макросы для отладки. Плюс свои malloc, free, new, delete и т.д.
ndefaultloghandler
    Вывод всех логов и сообщений в stdout.
ndirectory
    Работа с папками. Поиск в них.
ndirectorywatchhandler
    Работа с папками. Реакция на изменения в них.
nenv
    Инкапсуляция переменной в виде объекта. Удобный доступ, интерфейс к скриптам.
nfile
    Доступ к физической файловой системе. Чтение, запись файлов.
nfilenode
    Враппер nFile, интерфейс к скриптам.
nfileserver2
    Файловый сервер Небулы. Вся работа с файлами и папками через него. Интерфейс к скриптам.
nguid
    Глобальный Уникальный Идентификатор (GUID). Класс инкапсулирующий работу с ним.
nhardrefserver
    Умные указатели, которые имеют как имя объекта, так и ссылку на него. Имеется возможность проверки
    валидности ссылок.
nipcaddress
    Инкапсуляция сетевого адреса для всех ipc* классов.
nipcclient
    Клиент для соединения по сети с nipcserver/nipcminiserver и обмена с ним сообщениями.
nipcminiserver
    Мини сервер для соединения с nipcclient по сети. Создаётся по одному на каждое соединение.
nipcpeer
    Для соединения по UDP с другим пиром, и пересылки данных между ними.
nipcserver
    Собственно сервер. Для соединения с клиентами использует nipcminiserver в нужном количестве.
nkernelserver
    Собственно центральный сервер Небулы. Работа с объектами, модулями, логами и т.д.
nloghandler
    Базовый класс для работы с логами и соообщениями.
nmemory
    Функции работы с памятью, заменяют стандартные alloc, free, realloc и т.д.
nobject
    Базовый класс, включает рефкаунтеры и ртти. Плюс много полезных действий с ним. Интерфейс к скриптам.
npersistserver
    Интерфейс для де/сериализации объектов. Интерфейс к скриптам.
nprofiler
    Профайлер, интерфейс для простого измерения временных интервалов.
nref
    Умные реф-поинтеры. Три вида и почти на все случаи жизни. Умеют работать с объектами ядра Небулы.
nrefcounter
    Базовый реф-коунтер для подсчёта ссылок и автоудаления.
nreferenced
    Умный реф-коунтер с возможностью задания зависимости себя для других.
nremoteserver
    Сервер и клиент удалённой консоли Небулы. Команды исполняются с помощью скрипт сервера.
nroot
    Базовый класс, включает рефкаунтеры, ртти, де/сериализацию, интерфейс к скриптам, построение в виде дерева.
    Плюс много полезных действий с ним.
nscriptserver
    Базовый скрипт сервер, сам по себе не умеет ничего. Вещь по важности идёт после nkernelserver.
nthread
    Работа с потоками: эвенты, мутексы, потоки, а также потокобезпасные реализации эррэя и листа.
ntimeserver
    Сервер времени является высокоточным источником времени. Интерфейс к скриптам.
nwin32loghandler
    Логи пихает в файл плюс мессаджбокс.
nwin32stacktrace
    Класс для развёртки стека под виндой.
nwin32wrapper
    Инкапсулирует специфичные для винды функции и определения. Используется nkernelserver.
   
!!! MATHLIB !!!

matrix
    Работа с матрицами разных размеров.
nmath
    Математические функции, определения. Море всего.
noise
    Класс инкапсулирующий Perlin noice.
quanterion
    Квантерионы и базовые операции с ним.
vector
    Работа с векторами разных размеров.
   
!!! SIGNALS !!!

signal
    Базовая реализация сигналов. Используется как часть интерфейса к скрипт системе.
    Примечание: часть сырцов в папке loki, надо разобраться что там лежит...
nsignalbindingcmdproto
    Сигналы к скрипт системе.
nsignalbindingset
    Контейнер к каллбэкам получателя сигналов.
nsignalemitter
    Класс позволяющий взаимодействовать с сигналами. Интерфейс к скриптам.
nsignalregistry
    Добавление сигналов к классам Небулы.
nsignalserver
    Реализует асинхронное выполнение сгналов.
   
!!! UTIL !!!

narray
    Много реализаций разных массивов.
nbuffer
    Несколько реализаций буферов.
nhttpformdatawrapper
    Строит и отправляет простые HTTP запросы. И принимает ответы.
nhttpsession
    Простое соединение с интернет серверами по HTTP.
    !!! Внимание, зависимость от ngfxserver2.
nmd5
    Класс реализующий де/шифрование строки.
nquadtree
    Простое quad tree.
    !!! Внимание, зависимость от ngfxserver2.
nstartupchecker
    Инкапсулирует проверки на: установленный Direct3D и DSound, а также уже запущенного приложения.
nstream
    Чтение и запись XML файлов.
    Примечание: использует tinyxml из соответствующий папки.
nstring
    Большой класс строки.
utils
    Много мелких классов. Разное.

#9
14:15, 22 мар. 2008

Intor
Это я тебе и так могу сказать. )
И по второй Небуле, и по Третьей )
Только такое описание не многого стоит.
Дьявол, он обычно в деталях, да. )

#10
11:02, 23 мар. 2008

student
Но его достаточно чтобы ответить на твои вопросы :)
А детали ... только изучение кода и только САМОМУ ...

#11
12:39, 24 мар. 2008

student
На самом деле такой документик очень полезен, но только для СЕБЯ.

Поскольку когда, например, я его читаю, то читая строку:
"Базовый класс Небулы. Умеет много чего. Плюс объявлены некоторые макросы."
Я на самом деле вспоминаю много всего (как: зачем нужен, некоторые макросы и т.д.).
И такое описание как раз для СЕБЯ стоит много.

А про детали еще раз:
>>А чем гарантируется единственность экземпляра?
>RefCounted::criticalSection.Enter();
>RefCounted::criticalSection.Leave();
Вот это уже детали не Небулы.
Когда я вижу критическую секцию да и любой другой синхронизирующий объект,
я редко лезу в код. Как правило и так понятно что он делает.

Названия в Небуле хорошие, они часто помогают даже не смотря в код понять что этот
фрагмент делает.

#12
12:54, 24 мар. 2008

Intor
Я вот только единственного не могу понять.
Каким боком критические секции не дают создать более одного экземпляра объекта?

#13
14:07, 24 мар. 2008

Ты не понял ... они мешают создавать ОДНОВРЕМЕННО (из разных потоков) более одного экземпляра.
Более того, критические секции в этом макросе есть только в ДЕБАГЕ, а в релизе их нет.

Первый поток захватывает критическую секцию и начинает создавать объект.
В это время второй поток тоже захватывает критическую секцию и ожидает пока первый поток освободит ее.
Создав объект первый поток освобождает ее и второй поток начинает создавать объект.

#14
14:18, 24 мар. 2008

Вопрос на засыпку: что и зачем находится в папке morgue? :)

Страницы: 1 2 Следующая »
Nebula CommunityФорум

Тема в архиве.