Board.KolibriOS.org

Official KolibriOS board
It is currently Wed Sep 18, 2019 12:46 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 19 posts ]  Go to page 1 2 Next
Author Message
PostPosted: Wed Mar 21, 2012 12:53 pm 
Заметил тут такую вещь - упакованные версии плеера Fplay блокируют при запуске систему. Особенно заметно на курсоре - он замирает достаточно надолго. Я попробовал прописать вызов отрисовки курсора в обработчик irq0, в самое начало, но не помогло. Получается на время распаковки бинарника, упакованного LZMA, система тупо теряет обработку прерываний.

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

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


Top
   
PostPosted: Wed Mar 21, 2012 1:15 pm 
В dll.inc есть процедура load_file, в ней присутствует следующее гениальное решение:
Code:
        pushfd
        cli
        stdcall unpack, [file], eax
        popfd

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

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


Top
   
PostPosted: Wed Mar 21, 2012 1:38 pm 
Итак счастье случилось в r. 1275 или сразу после выпуска K0750.
Остается гадать - это случайно забытая временная затычка для отладки или постоянное решение для загрузки видеодрайвера ATI. У меня нет видеокарт ATI, чтобы проверить и вынести точный вердикт.


Top
   
PostPosted: Wed Mar 21, 2012 2:55 pm 
SVN r. 2486 - исправление для ревизии 1275.

Заменил CLI на мьютекс:
Spoiler: Show
Code:
        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:

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


Top
   
PostPosted: Wed Mar 21, 2012 7:53 pm 
Offline
User avatar

Joined: Sun May 10, 2009 7:56 pm
Posts: 98
Есть как раз ATI. Дай этот fplay -проверю.


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


Top
   
PostPosted: Wed Mar 21, 2012 11:23 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Mario
У ядра есть свои блокирующие мьютексы: mutex_init() mutex_lock() mutex_unlock()


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

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


Top
   
PostPosted: Wed Mar 21, 2012 11:35 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Я давал описание в одной из тем, а насчёт общей документации согласен.


Top
   
PostPosted: Wed Mar 21, 2012 11:43 pm 
Ну, раз ты сам не помнишь - где ты давал описание, то я тем более его не смогу выделить из обсуждаемых вопросов, где вы с Артемом просто болтали.


Top
   
PostPosted: Wed Mar 21, 2012 11:53 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Все описания функций ядра я даю в одной теме, разумеется её никто не читает и поиском не пользуется.


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

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


Top
   
PostPosted: Thu Mar 22, 2012 12:11 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Например так
Code:
        mov     ecx, heap_mutex
        call    mutex_lock
В ядре много примеров.


Top
   
PostPosted: Thu Mar 22, 2012 12:14 am 
Хорошо, попробую.


Top
   
PostPosted: Thu Mar 22, 2012 1:40 am 
И вот это вот портянка:
Spoiler: Show
Code:
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

стоит того чтобы заменить:
Spoiler: Show
Code:
        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

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

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

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 19 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited