Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Сб май 27, 2017 11:06 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 19 сообщений ]  На страницу 1 2 След.
Автор Сообщение
 Заголовок сообщения: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 12:53 pm 
Заметил тут такую вещь - упакованные версии плеера Fplay блокируют при запуске систему. Особенно заметно на курсоре - он замирает достаточно надолго. Я попробовал прописать вызов отрисовки курсора в обработчик irq0, в самое начало, но не помогло. Получается на время распаковки бинарника, упакованного LZMA, система тупо теряет обработку прерываний.

Это реально большая проблема! Есть вероятность, что из-за этой блокировки возможно появление других дополнительных проблем.

Я посмотрю, что можно сделать с распаковщиком в ядре, но не факт что быстро решу проблему.


Вернуться к началу
   
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 1:15 pm 
В dll.inc есть процедура load_file, в ней присутствует следующее гениальное решение:
Код:
        pushfd
        cli
        stdcall unpack, [file], eax
        popfd

Плевать на прерывания, многозадачность и прочие мелкие радости жизни! РаспакоФка наше фсе! Чем собственно и занимается трудолюбивый CPU. :mrgreen:

Если убрать cli то блокировка исчезает. Однако у меня нет уверенности, что это не вызовет каких либо дополнительных конфликтов.


Вернуться к началу
   
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 1:38 pm 
Итак счастье случилось в r. 1275 или сразу после выпуска K0750.
Остается гадать - это случайно забытая временная затычка для отладки или постоянное решение для загрузки видеодрайвера ATI. У меня нет видеокарт ATI, чтобы проверить и вынести точный вердикт.


Вернуться к началу
   
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 2:55 pm 
SVN r. 2486 - исправление для ревизии 1275.

Заменил CLI на мьютекс:
Спойлер: Показать
Код:
        push    eax
.wait_lock:
        cmp     [unpack_mutex], 0
        je      .get_lock
        call    change_task
        jmp     .wait_lock

.get_lock:
        mov     eax, 1
        xchg    eax, [unpack_mutex]
        test    eax, eax
        jnz     .wait_lock
        pop     eax

        stdcall unpack, [file], eax

        mov     [unpack_mutex], 0


Да, и эти люди запрещают мне ковыряться в носу лишний раз вызывать перерисовку курсора. "Лучше день потерять, а потом за 5 минут долететь!" говорят они. :wink:

З.Ы. Зашибись! Пообщался с умным человеком - с самим собой. :?


Вернуться к началу
   
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 7:53 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вс май 10, 2009 7:56 pm
Сообщения: 97
Есть как раз ATI. Дай этот fplay -проверю.


Вернуться к началу
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 8:02 pm 
Уже не нужно. Я не стал убирать блокировку. поскольку процедура распаковки не реентерабельна (используются глобальные переменные вместо локальных). Просто заменил "тяжелый" вариант CLI на более "легкий" вариант с мьютексом. Теперь блокируется только вызов процедуры распаковки (кто первым встал - того и тапки), а прерывания и остальные вещи происходят нормально.


Вернуться к началу
   
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 11:23 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3925
Mario
У ядра есть свои блокирующие мьютексы: mutex_init() mutex_lock() mutex_unlock()


Вернуться к началу
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 11:29 pm 
Вообще то, по хорошему, такие фундаментальнsе вещи должны иметь документацию, хотя бы краткую. Пока такой документации нету - я не буду переделывать свой код. Если есть желание сделать лучше чем сделано - я не возражаю.

З.Ы. Да, и как я уже сказал в чате - я не сам выдумал код мьютекса, а взял готовое решение из taskman.inc и значит раз оно там присутствует, то оно вполне жизнеспособно.


Вернуться к началу
   
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 11:35 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3925
Я давал описание в одной из тем, а насчёт общей документации согласен.


Вернуться к началу
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 11:43 pm 
Ну, раз ты сам не помнишь - где ты давал описание, то я тем более его не смогу выделить из обсуждаемых вопросов, где вы с Артемом просто болтали.


Вернуться к началу
   
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 11:53 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3925
Все описания функций ядра я даю в одной теме, разумеется её никто не читает и поиском не пользуется.


Вернуться к началу
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Ср мар 21, 2012 11:59 pm 
Я не работал с линуксовыми мьютексами и понимаю отнюдь не всю специфику обсуждаемую.
Еще я плохо знаю Сишный синтаксис и не знаю как запись вида:
Код:
void __attribute__ ((fastcall)) mutex_lock(struct mutex*);

должна выглядеть для ассемблера.


Вернуться к началу
   
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Чт мар 22, 2012 12:11 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3925
Например так
Код:
        mov     ecx, heap_mutex
        call    mutex_lock
В ядре много примеров.


Вернуться к началу
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Чт мар 22, 2012 12:14 am 
Хорошо, попробую.


Вернуться к началу
   
 Заголовок сообщения: Re: Запуск тяжелых приожений
СообщениеДобавлено: Чт мар 22, 2012 1:40 am 
И вот это вот портянка:
Спойлер: Показать
Код:
align 4
mutex_lock:

        dec     [ecx+MUTEX.count]
        jns     .done

        pushfd
        cli

        sub     esp, sizeof.MUTEX_WAITER

        list_add_tail esp, ecx      ;esp= new waiter, ecx= list head

        mov     edx, [TASK_BASE]
        mov     [esp+MUTEX_WAITER.task], edx

.forever:

        mov     eax, -1
        xchg    eax, [ecx+MUTEX.count]
        dec     eax
        jz      @F

        mov     [edx+TASKDATA.state], 1
        call    change_task
        jmp     .forever
@@:
        mov     edx, [esp+MUTEX_WAITER.list.next]
        mov     eax, [esp+MUTEX_WAITER.list.prev]

        mov     [eax+MUTEX_WAITER.list.next], edx
        mov     [edx+MUTEX_WAITER.list.prev], eax
        cmp     [ecx+MUTEX.lhead.next], ecx
        jne     @F

        mov     [ecx+MUTEX.count], 0
@@:
        add     esp, sizeof.MUTEX_WAITER

        popfd
.done:
        ret

стоит того чтобы заменить:
Спойлер: Показать
Код:
        push    eax
.wait_lock:
        cmp     [unpack_mutex], 0
        je      .get_lock
        call    change_task
        jmp     .wait_lock

.get_lock:
        mov     eax, 1
        xchg    eax, [unpack_mutex]
        test    eax, eax
        jnz     .wait_lock
        pop     eax

В обоих случаях есть столь "ненавистный":
Код:
        call    change_task

Да еще и CLI задействуется. :(

Я конечно переделаю, но люди иногда хотят странного - моя не понимат!


Вернуться к началу
   
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 19 сообщений ]  На страницу 1 2 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB