Re[5]: Сопрограммы и исключения.
От: Went  
Дата: 27.09.11 20:48
Оценка:
Здравствуйте, watch-maker, Вы писали:

W>>По какому базису его нужно выравнивать?

WM>Зависит от процессора и используемых соглашений о вызове (что в свою очередь зависит от ОС и компилятора). Фактически сейчас достаточно выравнивать на границу 16 байт — это минимум для типичных вызовов в x86-64 и минимум для некоторых вызовов в x86.

Ага, ясн.
Re[2]: Сопрограммы и исключения.
От: Went  
Дата: 27.09.11 20:50
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>Неправильное решение. Используй CreateFiber и SwitchToFiber


Видимо, да, а то уж слишком много жести в реализации setcontext/getcontext через SetThreadContext/GetThreadContext.
Re[2]: Сопрограммы и исключения.
От: Went  
Дата: 27.09.11 20:55
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>Неправильное решение. Используй CreateFiber и SwitchToFiber


Кстати, а главному потоку нужно делать ConvertThreadToFiber? Это не создаст каких-то проблем в будущем?
Re[5]: Сопрограммы и исключения.
От: niXman Ниоткуда https://github.com/niXman
Дата: 27.09.11 20:55
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте, watch-maker, Вы писали:


WM>>Только платформозависимое и используют. Для каждой платформы (ОС + компилятор) пишется свой код с ассемблерными вставками и прочими ужасами. Потом при копиляции через define выбирается нужный участок, остальное игнорируется.

W>Вот и я про это. Просто мне из прошлого сообщения показалось, что niXman считает, что там нет ничего специфического.
ошибся. сорри

из boost.coroutine: http://www.crystalclearsoftware.com/soc/coroutine/coroutine/implementation.html

Currently the library uses fibers on Win32 systems, custom assembler code on the very specific "GCC-linux-x86 using frame-unwind-tables based exception handling and a generic makecontext/setcontext based implementation on POSIX 2001 compliant systems. Note that, as the POSIX standard knows nothing about C++, this is not guaranteed to work on all platforms. Also the interaction between threads and user contexts is not specified by the standard.

пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: Помогите вспомнить теовер
От: watch-maker  
Дата: 27.09.11 21:09
Оценка:
Здравствуйте, Went, Вы писали:

W>Кстати, а главному потоку нужно делать ConvertThreadToFiber?

ConvertThreadToFiber нужно вызывать тем нитям (threads), которые будут вызывать другие fibers. Остальныем нитям можно эту функцию не вызывать.
Re[3]: Сопрограммы и исключения.
От: 0xDEADBEEF Ниоткуда  
Дата: 27.09.11 21:29
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте, 0xDEADBEEF, Вы писали:


DEA>>Неправильное решение. Используй CreateFiber и SwitchToFiber


W>Кстати, а главному потоку нужно делать ConvertThreadToFiber? Это не создаст каких-то проблем в будущем?

Надо. Иначе, ты не сможешь сказать "SwitchToFiber" на основную нитку — т.к. GetCurrentFiber() для нее будет возвращать говно.
То есть, не получится реализовать "yield" — переключение на основную нитку до завершения сопрограммы.

Но, ConvertThreadToFiber — функция гадкая. Она (а)каждый раз выделяет где-то память (б)нет документированных способов узнать, что на нитке эта функция была вызвана или нет.
Для решения этой проблемы я использую такой вот хак:
if( 0x00001E00 == (DWORD)::GetCurrentFiber() )
    ::ConvertThreadToFiber(NULL);//Fiber stuff wasn't initialized for current thread
    //this is genuine hack, but it appears it works for all MS OSes
__________
16.There is no cause so right that one cannot find a fool following it.
Re[4]: Сопрограммы и исключения.
От: Went  
Дата: 28.09.11 07:11
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>Но, ConvertThreadToFiber — функция гадкая. Она (а)каждый раз выделяет где-то память (б)нет документированных способов узнать, что на нитке эта функция была вызвана или нет.

DEA>Для решения этой проблемы я использую такой вот хак:

IsThreadAFiber, блин, только с Висты
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.