Page 2 of 5

Re: Вопросы по некоторых функциях...

Posted: Sun Oct 21, 2012 3:27 am
by johnfound
Ну продолжим с потоках.
Что делать со стеком, когда завершается поток?
Память для стек потока я выделяю динамически и ее надо освободить.
Но поток не может освободит свой собственный стек.
А другие потоки приложения просто не знают что поток завершился. Как быть?

Re: Вопросы по некоторых функциях...

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

Code: Select all

	mcall	68,13,[thread_stack_2]
	mcall	-1	; close this program
В zSea у меня это вполне работает.

Re: Вопросы по некоторых функциях...

Posted: Sun Oct 21, 2012 10:35 am
by johnfound
Mario wrote:Отчего же?

Code: Select all

	mcall	68,13,[thread_stack_2]
	mcall	-1	; close this program
В zSea у меня это вполне работает.
Как "отчего же"? Если память стека освобождается после 68,13 то откуда взялся аддрес возврата чтобы поток, потом выполнил mcall -1? И даже если чудесным образом поток вернулся куда надо, то где mcall -1 будет запоминать свой адрес возвратa?
Мне кажется что у тебя поток должен умирать из за GPF, а не из за mcall -1.

Re: Вопросы по некоторых функциях...

Posted: Sun Oct 21, 2012 3:18 pm
by Serge
Вот не надо путать людей макросами.

Code: Select all

   mov eax, 68
   mov ebx, 13
   mov ecx, [thread_stack_2]
   int 0x40
   mov eax, -1
   int 0x40

Re: Вопросы по некоторых функциях...

Posted: Sun Oct 21, 2012 4:00 pm
by Mario
johnfound wrote:Мне кажется что у тебя поток должен умирать из за GPF, а не из за mcall -1.
Теоретически да, однако на практике все работает - никакой ругани на доску отладки не выводится.

Re: Вопросы по некоторых функциях...

Posted: Sun Oct 21, 2012 4:31 pm
by johnfound
Но так выходит что можно ф.-1 вообще не вызывать и так поток завершится на возвращения из ф.68, а может и раньше.

Re: Вопросы по некоторых функциях...

Posted: Sun Oct 21, 2012 5:09 pm
by Serge
Ничего там не умирает по GPF. Эти функции не обращаются к стеку приложения.
Но если так страшно, есть простое решение

Code: Select all

   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:

Re: Вопросы по некоторых функциях...

Posted: Sun Oct 21, 2012 7:01 pm
by johnfound
Serge wrote:Ничего там не умирает по GPF. Эти функции не обращаются к стеку приложения.
Но если так страшно, есть простое решение

Code: Select all

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

Re: Вопросы по некоторых функциях...

Posted: Sun Oct 21, 2012 8:47 pm
by Serge
johnfound
Это всегда будет работать правильно, если хранить базовый адрес стека в вершине стека создаваемого потока.

Re: Вопросы по некоторых функциях...

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

Re: Вопросы по некоторых функциях...

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

Re: Вопросы по некоторых функциях...

Posted: Sun Oct 21, 2012 11:14 pm
by Mario
Serge wrote:Mario
Если ты создаёшь произвольное число потоков одной переменной thread_stack_2 на всех не хватит.
Зачем? :shock:
У меня на каждый задуманный поток свой стек и своя переменная:
Spoiler:

Code: Select all

;---------------------------------------------------------------------
; 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. Если стек для сепуку не нужен, как ты сам доказал, то зачем придумывать специальный лисопед?

Re: Вопросы по некоторых функциях...

Posted: Mon Oct 22, 2012 12:35 am
by johnfound
Я создаю произвольное количество потоков - потому что пишу библиотеку, которая должна этого уметь. И при этом у меня потоки должны заканчивать на ret (но это совсем другая история).

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

Re: Вопросы по некоторых функциях...

Posted: Mon Oct 22, 2012 12:48 am
by Mario
johnfound wrote:Давайте уточнить напоследок: Чтобы вызывать int $40, стек приложению совершенно не нужен. Правильно?
Стек нужен для сохранения регистров. Если функция их не изменяет или вообще не возвращает значений, то не нужен - это же прерывание. В общем все зависит о реализации вызываемой функции.

Re: Вопросы по некоторых функциях...

Posted: Mon Oct 22, 2012 1:15 am
by johnfound
Мои знания о прерываниях находятся на ниво 8088 :lol: - там стек обязательно нужен.
А где запоминаются адрес возврата и регистр флагов?