Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/MariaDB/storage/duckdb/runtime/   (MariaDB Server Version 8.1-8.4©)  Datei vom 1.9.2026 mit Größe 5 kB image not shown  

Quelle  fiber_context.h   Sprache: C

 

/*
  Copyright 2011 Kristian Nielsen and Monty Program Ab
            2015, 2022 MariaDB Corporation AB

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this.  If not, see <http://www.gnu.org/licenses/>.
*/


/*
  Fiber context for DuckDB cross-engine scan.

  Copied from libmariadb/include/ma_context.h and
  libmariadb/libmariadb/ma_context.c with libmariadb-specific
  dependencies removed (mysql_async_context, ma_global.h, DBUG,
  boost::context).  Only the core co-routine primitives are kept.
*/


#ifndef FIBER_CONTEXT_H
#define FIBER_CONTEXT_H

#include <stdint.h>
#include <stddef.h>

#if defined(__has_feature)
#if __has_feature(address_sanitizer)
#define FIBER_ASAN_ENABLED 1
#endif
#elif defined(__SANITIZE_ADDRESS__)
#define FIBER_ASAN_ENABLED 1
#endif

/*
  Platform selection — same priority order as ma_context.h but without
  boost::context and ASAN overrides (those need extra source files).
*/

#ifdef _WIN32
#define FIBER_USE_WIN32_FIBERS 1
#elif defined(FIBER_ASAN_ENABLED) && (defined(__unix__) || defined(__APPLE__))
#define FIBER_USE_UCONTEXT
#elif defined(__GNUC__) && __GNUC__ >= 3 && defined(__x86_64__) && !defined(__ILP32__)
#define FIBER_USE_X86_64_GCC_ASM
#elif defined(__GNUC__) && __GNUC__ >= 3 && defined(__i386__)
#define FIBER_USE_I386_GCC_ASM
#elif defined(__GNUC__) && __GNUC__ >= 3 && defined(__aarch64__)
#define FIBER_USE_AARCH64_GCC_ASM
#elif defined(__unix__) || defined(__APPLE__)
#include <unistd.h>
#if defined(_POSIX_VERSION)
#define FIBER_USE_UCONTEXT
#endif
#endif

#if !defined(FIBER_USE_WIN32_FIBERS) && \
    !defined(FIBER_USE_X86_64_GCC_ASM) && \
    !defined(FIBER_USE_I386_GCC_ASM) && \
    !defined(FIBER_USE_AARCH64_GCC_ASM) && \
    !defined(FIBER_USE_UCONTEXT)
#define FIBER_CONTEXT_DISABLE
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef FIBER_USE_WIN32_FIBERS
struct fiber_context {
  void (*user_func)(void *);
  void *user_arg;
  void *app_fiber;
  void *lib_fiber;
  int return_value;
};
#endif

#ifdef FIBER_USE_UCONTEXT
#include <ucontext.h>

struct fiber_context {
  void (*user_func)(void *);
  void *user_data;
  void *stack;
  size_t stack_size;
  ucontext_t base_context;
  ucontext_t spawned_context;
  int active;
};
#endif

#ifdef FIBER_USE_X86_64_GCC_ASM
struct fiber_context {
  uint64_t save[9];
  void *stack_top;
  void *stack_bot;
  int active;
};
#endif

#ifdef FIBER_USE_I386_GCC_ASM
struct fiber_context {
  uint64_t save[7];
  void *stack_top;
  void *stack_bot;
  int active;
};
#endif

#ifdef FIBER_USE_AARCH64_GCC_ASM
struct fiber_context {
  uint64_t save[22];
  void *stack_top;
  void *stack_bot;
  int active;
};
#endif

#ifdef FIBER_CONTEXT_DISABLE
struct fiber_context {
  int dummy;
};
#endif

static inline void *fiber_context_stack_top(struct fiber_context *c)
{
#ifdef FIBER_USE_UCONTEXT
  return (char *)c->stack + c->stack_size;
#elif defined(FIBER_USE_X86_64_GCC_ASM) || \
      defined(FIBER_USE_I386_GCC_ASM) || \
      defined(FIBER_USE_AARCH64_GCC_ASM)
  return c->stack_top;
#else
  return NULL;
#endif
}

/*
  Initialize a fiber context object.
  Returns 0 on success, non-zero on failure.
*/

extern int fiber_context_init(struct fiber_context *c, size_t stack_size);

/* Free a fiber context object, deallocating any resources used. */
extern void fiber_context_destroy(struct fiber_context *c);

/*
  Spawn a fiber context.  The fiber will run the supplied user function,
  passing the supplied user data pointer.

  The user function may call fiber_context_yield(), which will cause this
  function to return 1.  Then later fiber_context_continue() may be called,
  which will resume the fiber by returning from the previous
  fiber_context_yield() call.

  When the user function returns, this function returns 0.
  In case of error, -1 is returned.
*/

extern int fiber_context_spawn(struct fiber_context *c,
                               void (*f)(void *), void *d);

/*
  Suspend a fiber started with fiber_context_spawn.

  When fiber_context_yield() is called, execution immediately returns from
  the last fiber_context_spawn() or fiber_context_continue() call.  Then
  when later fiber_context_continue() is called, execution resumes by
  returning from this fiber_context_yield() call.

  Returns 0 if ok, -1 in case of error.
*/

extern int fiber_context_yield(struct fiber_context *c);

/*
  Resume a suspended fiber.

  Each time it is suspended, this function returns 1.  When the originally
  spawned user function returns, this function returns 0.
  In case of error, -1 is returned.
*/

extern int fiber_context_continue(struct fiber_context *c);

#ifdef __cplusplus
}
#endif

#endif /* FIBER_CONTEXT_H */

Messung V0.5 in Prozent
C=96 H=100 G=97

¤ Dauer der Verarbeitung: 0.12 Sekunden  (vorverarbeitet am  2026-10-08) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.