Информация об изменениях

Сообщение Re: Closures in plain C. от 14.12.2021 12:38

Изменено 14.12.2021 12:42 kov_serg

Re: Closures in plain C.
Здравствуйте, fk0, Вы писали:

fk0> Существует возможность привести такой код к следующей форме:


fk0>
fk0>    SCOPE_GUARD
fk0>    {
fk0>        void * const p = malloc(25);
fk0>        DEFER(free, p);

fk0>        void * const q = malloc(25);
fk0>        DEFER(free, q);

fk0>        if (mtx_lock(&mut) == thrd_error)
fk0>            return or break;

fk0>        DEFER(mtx_unlock, &mut);
fk0>    }
fk0>


Что мешает использовать менеджер ресурсов, который будет следить за выделением ресурсов и он же будет их освобождать.
Выглядеть будет примерно так
static void body_code(scope_t *s) {
  void *p, *q; mutex_t m[1];
  p=s->mem_alloc(25);
  if (s->mutex_lock(m)) return;
  q=s->mem_alloc(25);
}
void body(scope_t *s) {
  s->exec(body_code);
}
Re: Closures in plain C.
Здравствуйте, fk0, Вы писали:

fk0> Существует возможность привести такой код к следующей форме:


fk0>
fk0>    SCOPE_GUARD
fk0>    {
fk0>        void * const p = malloc(25);
fk0>        DEFER(free, p);

fk0>        void * const q = malloc(25);
fk0>        DEFER(free, q);

fk0>        if (mtx_lock(&mut) == thrd_error)
fk0>            return or break;

fk0>        DEFER(mtx_unlock, &mut);
fk0>    }
fk0>


Что мешает использовать менеджер ресурсов, который будет следить за выделением ресурсов и он же будет их освобождать.
Выглядеть будет примерно так
static void body_code(scope_t *s) {
  void *p, *q; mutex_t m[1];
  p=scope_mem_alloc(s,25);
  if (scope_mutex_lock(s,m)) return;
  q=scope_mem_alloc(s,25);
}
void body(scope_t *s) {
  scope_exec(s,body_code);
}