Как завершить sh основной контекст перед пользовательским контекстом без получения ошибок - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь использовать ucontext для создания своего собственного контекста, и я хочу, чтобы этот контекст ждал основного или был последним до конца sh. Вот пример кода:

#include <stdio.h>
#include <stdlib.h>
#include <ucontext.h>
#include <valgrind/valgrind.h>
ucontext_t uc, previous;
int valgrind_stackid;

void * func(void * arg)
{
  printf("I am in UC Context\n");
  swapcontext(&uc,&previous);
  printf("I am finishing the process\n");
  return NULL;
}

int main() {
  getcontext(&uc);
  uc.uc_stack.ss_size = 64*1024;
  uc.uc_stack.ss_sp = malloc(uc.uc_stack.ss_size);
  valgrind_stackid = VALGRIND_STACK_REGISTER(uc.uc_stack.ss_sp, uc.uc_stack.ss_sp + uc.uc_stack.ss_size);
  makecontext(&uc, (void (*)(void)) func, 1, NULL);
  printf("I am in the main Context\n");
  swapcontext(&previous, &uc);
  printf("I came back in main \n");
  setcontext(&uc);
  printf("I am not comming back here\n");
  return 0;
}
 __attribute__((destructor))
  static void destr() {
     VALGRIND_STACK_DEREGISTER(valgrind_stackid);
     free(uc.uc_stack.ss_sp);
 }

этот код делает цель, но проблема в том, что я не хочу, чтобы у меня возникла проблема с несвободной памятью, когда я использую valgrind. Вот почему я добавил деструктор, чтобы освободить стек контекста, но когда я это сделаю, у меня будет множество ошибок в valgrind (недопустимое чтение), и без деструктора я получил только 1 неосвобожденную память, и это нормально. Поэтому я ищу способ освободить этот стек, не получая эти ошибки, если это возможно ??

...