Thursday, October 22, 2009

TCMalloc отличие от стандартного алгоритма

Отличие от стандартного алгоритма управления выделением памяти glibc(ptmalloc2)от tcmalloc(реализация разработчиков google):
  • разделенная между потоками память, у каждого потока собственный пул памяти(уменьшена вероятность взаимоблокировок);
  • все объекты одинакового размера хранятся вместе (позволяет эффективно использовать память в процессе выделения - освобождения памяти).
  • скорость 50 наносекунд против 300 наносекунд (единичное создание удаление объекта (2.8 GHz P4).
Общий принцип работы: при каждом запросе на выделение памяти - память выделяется из общего пула и привязывается к потоку, который эту память запросил, в потоку регистрируется пул под объекты этого размера(класса) размером кратным размеру страницы, в результате следующее выделение будет выполнено в уже привязанной к потоку памяти. Когда пул под объекты определенного класса освобождается он возвращается в основной пул. Для объектов больше определенного размера выделение полностью проводиться в основном пуле без привязке к конкретному потоку (большая вероятность что этот объект будет использован в другом потоке).

Saturday, October 17, 2009

переехал на berlios.de

BerliOS Developer LogoРешил переместить свою тестовую ветку для gtkhtml на berlios.org. Ранее использовал github, но там отсутствует трекер ошибок. При переезде заметил одну неприятную особенность github скрывал имя пользователя в комите использовав вместо него регистрационное имя пользователя(определяется по почтовому ящику). В результате обнаружил, что у меня некоторые комиты по разному подписаны и как следствие решил полностью сбросить репозиторий(полностью реинициализировать).
Так пришлось немного повозиться(проект не отображался через GitWeb), маленькая как это решить: для этого нужно зайти на git.berlios.de и выполнить git init --bare --shared=all /gitroot/(имя проекта)/ После этого нужно отредактировать файлы: description и README.html и создать пустой файл export_ok.

config
Конфигурация генерируются автоматически
[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
        logallrefupdates = true
[gitweb]
 owner = имя пользователя
[hooks]
        mailinglist = 
        announcelist = 
        envelopesender = 
        emailprefix = [Git]
description
описание проекта (генериться атоматически вида Project ghtml at BerliOS - весит сразу под заголовком в GitWeb
export_ok
существование этого файла разрешает просмотр проекта в GitWeb
README.html
описание висит под description
*
остальные элементы стандартны для git реозитория

Thursday, October 8, 2009

Создание простейшего дерева элементов в gtkhtml

Создание простейшего дерева элементов в gtkhtml:
HTMLObject *o,*flow,* table, *cell,*flowcell,*flowtable;
// отступ clue по отношению к левой стороне экрана, используется при отображении коментариям к записям
GByteArray *levels;
//создание текста
o = text_new (e, "АААААА", current_font_style (e), current_color (e));
html_text_set_font_face (HTML_TEXT (o), current_font_face (e));     
levels = g_byte_array_new ();
//создание clue
flow = html_clueflow_new (current_clueflow_style (e), levels, HTML_LIST_TYPE_BLOCKQUOTE, 0, HTML_CLEAR_NONE);
//создание таблицы
table = html_table_new (0, 0, 3, 2, 1);
//Открыть новую строку
html_table_start_row (HTML_TABLE(table));
//создать новую ячейку
cell = html_table_cell_new (0, 0, 1);
levels = g_byte_array_new ();
//создать clue для ячейки в который засунуть текст
flowcell = html_clueflow_new (current_clueflow_style (e), levels, HTML_LIST_TYPE_BLOCKQUOTE, 0, HTML_CLEAR_NONE);
html_clue_append (HTML_CLUE (flowcell), o);
//привязать к ячейке clue
html_clue_append (HTML_CLUE (cell), flowcell);
//привязать ячейку к таблице
html_table_add_cell (HTML_TABLE(table), HTML_TABLE_CELL (cell));
//закрыть строку
html_table_end_row (HTML_TABLE(table));
levels = g_byte_array_new ();
flowtable = html_clueflow_new (current_clueflow_style (e), levels, HTML_LIST_TYPE_BLOCKQUOTE, 0, HTML_CLEAR_NONE);     
//упаковать все друг в друга
html_clue_append (HTML_CLUE (flowtable), table);     
html_clue_append (HTML_CLUE (flow), flowtable);
html_clue_append (HTML_CLUE (e->parser_clue), flow); 
Внутри clue парсера должен обязательно находится еще один clue в внутри которого расположены все остальные элементы. В clue добавляется все иерархия элементов.

Wednesday, October 7, 2009

Скрытие сообщений при компиляции

В новой версии automake доступна возможность скрытия подробностей компиляции, выводятся только ошибки и имя текущего компилируемого файла. Включается через указание в configure.{in,ac}:
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])

Это возможно использовать и в более старых скриптах, в них этот макрос AM_SILENT_RULES не определен и как следствие не используется. Взято от сюда NicerBuilds, более подробно здесь.

Friday, October 2, 2009

Cоздание простейшего форума с тегами

Для реализации категорий для деления по темам - можно указывать в виде тегов - в результате мы получим возможность отображать темы в нескольких категориях и возможность пользователям присоединять к тему сразу к нескольким категориям. Теги подчиненных сообщений берутся из родительской темы + указанные непосредственно пользователем.
Право добавлять сообщения можно только если текущих тегов хватает на какую нибудь категорию, то есть это решает задачу определения возможности добавления элементов присоединённых к теме.
Из этого вытекает возможность на основе appengine хранить псевдоurl для записи(например: время) и только список тегов с автоматической привязкой к каталогизатору через теги.

CSS + gtkhtml

Продолжение поста.
Заменил в своей тестовой ветви парсер на libxml, и с минимальными изменениями заменил использование старой логики на новую. В результате получил полу работоспособную систему с такими проблемами:
  1. текст выводится мимо полей таблицы;
  2. стили применяются не полностью - отсутствие свойств у элементов;
  3. сейчас выдается двойное дерево - без стиля и под ним с стилем.
В общем почти удачно - но нужно переписать код преобразования xml дерева в htmlobject дерево, или хотя бы найти причину вывода мимо элемента.