25 March, 2009

Очередные косяки в .NET Profiling API

Есть такой event JITInlining который спрашивает у профайлера будем ли в функцию A инлайнить функцию B. Обычно эти event'ы возникают между JITCompilationStarted и JITCompilationFinished. Что на самом деле довольно логично: начали компиляцию, проинлайнили чего-нибудь, закончили компиляцию. Но вот, откуда ни возьмись, появляются независимые JITInlining без обрамления начала и конца компиляции. Поиследовав немного этот вопрос я нашел, что token функции в которую производятся инлайны всегда 0x06000000 - что на самом деле говорит нам, что токена у такой функции нет. Token класса такой же пустой - 0x02000000. Выводы? А их нет - это косяк, хотя и довольно безобидный.

Еще косячок посерьезнее - после event'a AppDomainShutdownStarted могут происходить компиляции finalizers в application domain для которого был вызван AppDomainShutdownStarted. С другой стороны в документации написано, что id application domain стабилен и правилен только до окончания вызова AppDomainShutdownStarted.

Освобождаем буфер в std::string

Задача вроде банальная, но если приглядется то ни один метод напрямую не позволяет освободить буфер у std::string. Вот мое решение этой задачки:
str.swap(std::wstring());
Естественно все работает и для std::wstring.

18 March, 2009

Банальная разница

Ну все наверно знают функцию GetCommandLine(). Ну скажите какого черта нужно было сделать эту функцию по разному в Windows и в WindowsCE? Ну почему в последнем случае executable file не добавляется в начало в качестве первого аргумента? Другими словами, если мы просто запустили программу без аргументов под WindowsCE, то всегда будем получать пустую строчку в результате вызова GetCommandLine()!

17 March, 2009

Puzzle: Fast Bit Counting

Тут несколько способов быстро узнать количество бит в слове.

07 March, 2009

Locks and exceptions do not mix

Статья рассказывает о том, что есть серьезная проблема с локами в C# при использовании thread abort.

05 March, 2009

Нахождение наименьшего общего делителя (НОД)

Нашел несколько вариантов алгоритма нахождения НОД, реализовал их на С++ и решил сравнить по скорости. Вопреки моему ожиданию, а я поставил на бинарный алгоритм Евклида, победил обычный алгоритм Евклида (разница примерно в 1.3 раза). Его тут и привожу:
size_t NOD(size_t a, size_t b)
{
    while (a != 0 && b != 0)
        if (a >= b)
            a = a % b;
        else
            b = b % a;
    return a + b;
}

21 February, 2009

Development Server не любит Vista

Под моей Vista x64 не работает Development Server довольно странным образом: он запускался, но ни один browser не мог к нему законнектится. Оказалось, что если заменить в строке browser'а localhost на 127.0.0.1, то все тут же заработает. Причину такого поведения вижу в том, что Vista поддерживает IPv6 и по умолчанию localhost транслируется в ::1. А на соответствующем порту IPv6 наш browser никто не слушает.

20 February, 2009

Не работает асинхронная закачка в WebClient

Обнаружил маленькую проблему с классом System.Net.WebClient. При попытке использования асинхронной закачки с HTTP сервера посредством DownloadStringAsync или DownloadDataAsync не приходили эвенты DownloadStringCompleted и DownloadDataCompleted соответственно. Проблема решиласть следующим оьразом:
ThreadPool.QueueUserWorkItem(state => client.DownloadStringAsync(uri), null);