Board.KolibriOS.org

Official KolibriOS board
It is currently Sat Jul 04, 2020 7:31 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 66 posts ]  Go to page Previous 1 2 3 4 5 Next
Author Message
PostPosted: Sun Oct 21, 2012 3:27 am 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Ну продолжим с потоках.
Что делать со стеком, когда завершается поток?
Память для стек потока я выделяю динамически и ее надо освободить.
Но поток не может освободит свой собственный стек.
А другие потоки приложения просто не знают что поток завершился. Как быть?


Top
   
PostPosted: Sun Oct 21, 2012 9:46 am 
johnfound wrote:
Но поток не может освободит свой собственный стек.
А другие потоки приложения просто не знают что поток завершился. Как быть?

Отчего же?
Code:
   mcall   68,13,[thread_stack_2]
   mcall   -1   ; close this program

В zSea у меня это вполне работает.


Top
   
PostPosted: Sun Oct 21, 2012 10:35 am 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Mario wrote:
Отчего же?
Code:
   mcall   68,13,[thread_stack_2]
   mcall   -1   ; close this program

В zSea у меня это вполне работает.


Как "отчего же"? Если память стека освобождается после 68,13 то откуда взялся аддрес возврата чтобы поток, потом выполнил mcall -1? И даже если чудесным образом поток вернулся куда надо, то где mcall -1 будет запоминать свой адрес возвратa?
Мне кажется что у тебя поток должен умирать из за GPF, а не из за mcall -1.


Top
   
PostPosted: Sun Oct 21, 2012 3:18 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Вот не надо путать людей макросами.
Code:
   mov eax, 68
   mov ebx, 13
   mov ecx, [thread_stack_2]
   int 0x40
   mov eax, -1
   int 0x40


Top
   
PostPosted: Sun Oct 21, 2012 4:00 pm 
johnfound wrote:
Мне кажется что у тебя поток должен умирать из за GPF, а не из за mcall -1.

Теоретически да, однако на практике все работает - никакой ругани на доску отладки не выводится.


Top
   
PostPosted: Sun Oct 21, 2012 4:31 pm 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Но так выходит что можно ф.-1 вообще не вызывать и так поток завершится на возвращения из ф.68, а может и раньше.


Top
   
PostPosted: Sun Oct 21, 2012 5:09 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Ничего там не умирает по GPF. Эти функции не обращаются к стеку приложения.
Но если так страшно, есть простое решение
Code:
   mov esp, tmp_stack
   mov eax, 68
   mov ebx, 13
   mov ecx, [thread_stack_2]
   int 0x40
   mov eax, -1
   int 0x40

rd 4  ;с большим запасом
tmp_stack:


Top
   
PostPosted: Sun Oct 21, 2012 7:01 pm 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Serge wrote:
Ничего там не умирает по GPF. Эти функции не обращаются к стеку приложения.
Но если так страшно, есть простое решение
Code:
   mov esp, tmp_stack
   mov eax, 68
   mov ebx, 13
   mov ecx, [thread_stack_2]
   int 0x40
   mov eax, -1
   int 0x40

rd 4  ;с большим запасом
tmp_stack:


Просто, но не совсем. Я тоже думал сделать так, но дело в том, что это будет работать правильно если всегда завершается только один поток. А в многопоточном приложении это совсем невозможно гарантировать.
Поэтому приходим к следующего вопроса: Как реализовать мьютексов в Колибри? :)


Top
   
PostPosted: Sun Oct 21, 2012 8:47 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
johnfound
Это всегда будет работать правильно, если хранить базовый адрес стека в вершине стека создаваемого потока.


Top
   
PostPosted: Sun Oct 21, 2012 9:07 pm 
Зачем изобретать лисопеды, если простое как лопата решение уже работает?


Top
   
PostPosted: Sun Oct 21, 2012 11:04 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Mario
Если ты создаёшь произвольное число потоков одной переменной thread_stack_2 на всех не хватит.


Top
   
PostPosted: Sun Oct 21, 2012 11:14 pm 
Serge wrote:
Mario
Если ты создаёшь произвольное число потоков одной переменной thread_stack_2 на всех не хватит.

Зачем? :shock:
У меня на каждый задуманный поток свой стек и своя переменная:
Spoiler: Show
Code:
;---------------------------------------------------------------------
; clear bacground thread
clear_thread_stack:
   dd 0
;----------------------
; window option
thread_stack_7:
   dd 0
;----------------------
; window error message
thread_stack_6:
   dd 0
;----------------------
; window set sort mode
thread_stack_5:
   dd 0
;----------------------
; window background
thread_stack_4:
   dd 0
;----------------------
; window about
thread_stack_3:
   dd 0
;----------------------
; file info
thread_stack_2:
   dd 0
;----------------------
; file open
thread_stack:
   dd 0
;---------------------------------------------------------------------

Это конечно не произвольное количество, но мне произвольное и не нужно.

А предыдущий пост мой касался самоубиения вторичного потока, без всяких извратов с подменой значения ESP. Если стек для сепуку не нужен, как ты сам доказал, то зачем придумывать специальный лисопед?


Top
   
PostPosted: Mon Oct 22, 2012 12:35 am 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Я создаю произвольное количество потоков - потому что пишу библиотеку, которая должна этого уметь. И при этом у меня потоки должны заканчивать на ret (но это совсем другая история).

Давайте уточнить напоследок: Чтобы вызывать int $40, стек приложению совершенно не нужен. Правильно?


Top
   
PostPosted: Mon Oct 22, 2012 12:48 am 
johnfound wrote:
Давайте уточнить напоследок: Чтобы вызывать int $40, стек приложению совершенно не нужен. Правильно?

Стек нужен для сохранения регистров. Если функция их не изменяет или вообще не возвращает значений, то не нужен - это же прерывание. В общем все зависит о реализации вызываемой функции.


Top
   
PostPosted: Mon Oct 22, 2012 1:15 am 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Мои знания о прерываниях находятся на ниво 8088 :lol: - там стек обязательно нужен.
А где запоминаются адрес возврата и регистр флагов?


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 66 posts ]  Go to page Previous 1 2 3 4 5 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 3 guests


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