make_fcontext / jump_fcontext используется с общим стеком

Есть ли способ использовать контекст надстройки make_fcontext / jump_fcontext с общим стеком для совместного использования памяти сопрограмм путем сохранения / восстановления стека?

Кажется, что make_fcontext а также jump_fcontext сами пишите в стек, и я получаю сбои при попытке сохранить / восстановить стек при yield / resume, но мне действительно трудно понять, что происходит, так как make_fcontext / jump_fcontext — это чистый ассемблерный код.

Вот методы сопрограмм, которые вызывают ошибку сегментации (один и тот же код работает очень хорошо, если я использую разные стеки для каждой сопрограммы и не использую saveStack / restoreStack)

    void resume()
{
if (yielded)
{
restoreStack();
yielded = false;
}
else
{
running = true;
thisContext = boost::context::make_fcontext(
(char*)sharedStackPtr + sharedStackSize ,
sharedStackSize,
my_entry_func);
}
boost::context::jump_fcontext(&yieldContext, thisContext, reinterpret_cast<intptr_t>(this));
}

void yield()
{
yielded = true;
saveStack();
boost::context::jump_fcontext(&thisContext, yieldContext, 0);
}

void restoreStack()
{
char* stackTop = (char*)sharedStackPtr  + sharedStackSize ;
memcpy(stackTop - savedStackSize, savedStackPtr, savedStackSize);
}

void saveStack()
{
char dummy = 0;
char* stackPointer = &dummy;
char* stackTop = (char*)sharedStackPtr  + sharedStackSize  ;
assert((stackPointer < stackTop) && (stackPointer >= sharedStackPtr  ));
savedStackSize = stackTop - stackPointer;
if (savedStackPtr == nullptr)
{
savedStackPtr  = coroutine_stack_alloc(savedStackSize);
}
else
{
savedStackPtr = coroutine_stack_realloc(savedStackPtr, savedStackSize);
}
memcpy(savedStackPtr, stackPointer, savedStackSize);
}

Любая идея ? Что-то я делаю где-то неправильно?

0

Решение

make_fcontext () должен быть применен к порядку стеков, чтобы инициализировать стек, прежде чем его можно будет использовать с jump_fcontext (). Конечно, вы можете повторно использовать стек, применяя make_fcontext () после завершения контекста выполнения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector