Проблема с setjmp / longjmp - PullRequest
0 голосов
/ 16 марта 2010

Код ниже просто не работает. Кто-нибудь может указать, почему

#define STACK_SIZE 1524

static void mt_allocate_stack(struct thread_struct *mythrd)

{

    unsigned int sp = 0;
    void *stck;

    stck = (void *)malloc(STACK_SIZE);

    sp = (unsigned int)&((stck));
    sp = sp + STACK_SIZE;
    while((sp % 8) != 0)
    sp--;

#ifdef linux

    (mythrd->saved_state[0]).__jmpbuf[JB_BP] = (int)sp;
    (mythrd->saved_state[0]).__jmpbuf[JB_SP] = (int)sp-500;
#endif

}

void mt_sched()

{

    fprintf(stdout,"\n Inside the mt_sched");
    fflush(stdout);

    if ( current_thread->state == NEW )
     {
         if ( setjmp(current_thread->saved_state) == 0 )
         {
            mt_allocate_stack(current_thread);

            fprintf(stdout,"\n Jumping to thread = %u",current_thread->thread_id);
            fflush(stdout);
            longjmp(current_thread->saved_state, 2);
         }
         else
         {
            new_fns();
         }
      }
}

Все, что я пытаюсь сделать, это запустить new_fns () в новом стеке. Но это показывает ошибку сегментации в new_fns ().

Может кто-нибудь указать мне, что не так.

1 Ответ

2 голосов
/ 16 марта 2010

Помимо всех других соображений, вы используете "& stck" вместо ok "stck" в качестве стека! & stck указывает на ячейку, содержащую указатель на выделенный стек

Тогда некоторые наблюдения:

1) setjmp не предназначен для этой цели: этот код может работать только на некоторых системах и, возможно, только с версиями библиотеки времени выполнения som.

2) Я думаю, что АД следует оценивать другим способом. Предлагаю проверить, как вы компилируете составляет стековый фрейм. То есть, на платформах x86 EBP указывает на базу локального контекста, а в * EBP вы можете найти адрес базы вызывающего контекста. ESP указывает на EBP-SIZE_OF_LOCAL_CONTEXT, разные компиляторы обычно вычисляют этот размер по-разному.

Насколько я вижу, вы реализуете какие-то "волокна". Если вы работаете на Win32, есть набор функций, который безопасно реализует эту функцию (см. «Волокна»). На Linux я предлагаю вам взглянуть на "libfiber".

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...