/usr/include/bse/bseenginenode.h is in libbse-dev 0.7.4-4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 | /* BSE Engine - Flow module operation engine
* Copyright (C) 2001, 2002, 2003, 2004 Tim Janik
*
* This library 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.
*
* A copy of the GNU Lesser General Public License should ship along
* with this library; if not, see http://www.gnu.org/copyleft/.
*/
#ifndef __BSE_ENGINE_NODE_H__
#define __BSE_ENGINE_NODE_H__
#include "bseengine.h"
#include "gslcommon.h"
G_BEGIN_DECLS
#define ENGINE_NODE(module) ((EngineNode*) (module))
#define ENGINE_NODE_N_OSTREAMS(node) ((node)->module.klass->n_ostreams)
#define ENGINE_NODE_N_ISTREAMS(node) ((node)->module.klass->n_istreams)
#define ENGINE_NODE_N_JSTREAMS(node) ((node)->module.klass->n_jstreams)
#define ENGINE_NODE_IS_CONSUMER(node) ((node)->is_consumer && \
(node)->output_nodes == NULL)
#define ENGINE_NODE_IS_INTEGRATED(node) ((node)->integrated)
#define ENGINE_NODE_IS_VIRTUAL(node) ((node)->virtual_node)
#define ENGINE_NODE_IS_SUSPENDED(nod,s) ((s) < (nod)->next_active)
#define ENGINE_NODE_IS_DEFERRED(node) (FALSE)
#define ENGINE_NODE_IS_SCHEDULED(node) (ENGINE_NODE (node)->sched_tag)
#define ENGINE_NODE_IS_CHEAP(node) (((node)->module.klass->mflags & BSE_COST_CHEAP) != 0)
#define ENGINE_NODE_IS_EXPENSIVE(node) (((node)->module.klass->mflags & BSE_COST_EXPENSIVE) != 0)
#define ENGINE_NODE_LOCK(node) sfi_rec_mutex_lock (&(node)->rec_mutex)
#define ENGINE_NODE_UNLOCK(node) sfi_rec_mutex_unlock (&(node)->rec_mutex)
#define ENGINE_MODULE_IS_VIRTUAL(mod) (ENGINE_NODE_IS_VIRTUAL (ENGINE_NODE (mod)))
/* --- typedefs --- */
typedef struct _EngineNode EngineNode;
typedef struct _EngineSchedule EngineSchedule;
/* --- transactions --- */
typedef union _EngineTimedJob EngineTimedJob;
typedef enum /*< skip >*/
{
ENGINE_JOB_NOP,
ENGINE_JOB_SYNC,
ENGINE_JOB_INTEGRATE,
ENGINE_JOB_DISCARD,
ENGINE_JOB_ICONNECT,
ENGINE_JOB_JCONNECT,
ENGINE_JOB_IDISCONNECT,
ENGINE_JOB_JDISCONNECT,
ENGINE_JOB_KILL_INPUTS,
ENGINE_JOB_KILL_OUTPUTS,
ENGINE_JOB_SET_CONSUMER,
ENGINE_JOB_UNSET_CONSUMER,
ENGINE_JOB_FORCE_RESET,
ENGINE_JOB_ACCESS,
ENGINE_JOB_SUSPEND,
ENGINE_JOB_RESUME,
ENGINE_JOB_ADD_POLL,
ENGINE_JOB_REMOVE_POLL,
ENGINE_JOB_ADD_TIMER,
ENGINE_JOB_PROBE_JOB,
ENGINE_JOB_FLOW_JOB,
ENGINE_JOB_BOUNDARY_JOB,
ENGINE_JOB_MESSAGE,
ENGINE_JOB_LAST
} EngineJobType;
struct _BseJob
{
EngineJobType job_id;
BseJob *next;
union {
struct {
EngineNode *node;
gboolean free_with_job;
gchar *message;
} data;
struct {
BirnetMutex *lock_mutex;
BirnetCond *lock_cond;
gboolean *lock_p;
} sync;
struct {
EngineNode *node;
guint64 stamp;
} tick;
struct {
EngineNode *dest_node;
guint dest_ijstream;
EngineNode *src_node;
guint src_ostream;
} connection;
struct {
EngineNode *node;
BseEngineAccessFunc access_func;
gpointer data;
BseFreeFunc free_func;
} access;
struct {
BseEnginePollFunc poll_func;
gpointer data;
BseFreeFunc free_func;
guint n_fds;
GPollFD *fds;
} poll;
struct {
BseEngineTimerFunc timer_func;
gpointer data;
BseFreeFunc free_func;
} timer;
struct {
EngineNode *node;
EngineTimedJob *tjob;
} timed_job;
};
};
struct _BseTrans
{
BseJob *jobs_head;
BseJob *jobs_tail;
guint comitted : 1;
BseTrans *cqt_next; /* com-thread-queue */
};
union _EngineTimedJob
{
struct {
EngineJobType type; /* common */
EngineTimedJob *next; /* common */
guint64 tick_stamp; /* common */
};
struct {
EngineJobType type; /* common */
EngineTimedJob *next; /* common */
guint64 tick_stamp; /* common */
gpointer data;
BseEngineProbeFunc probe_func;
BseOStream *ostreams;
guint n_ostreams;
} probe;
struct {
EngineJobType type; /* common */
EngineTimedJob *next; /* common */
guint64 tick_stamp; /* common */
gpointer data;
BseFreeFunc free_func;
BseEngineAccessFunc access_func;
} access;
};
/* --- module nodes --- */
typedef struct
{
EngineNode *src_node;
guint src_stream; /* ostream of src_node */
/* valid if istream[].connected, setup by scheduler */
EngineNode *real_node; /* set to NULL if !connected */
guint real_stream; /* ostream of real_node */
} EngineInput;
typedef struct
{
EngineNode *src_node;
guint src_stream; /* ostream of src_node */
/* valid if < jstream[].n_connections, setup by scheduler */
EngineNode *real_node;
guint real_stream; /* ostream of real_node */
} EngineJInput;
typedef struct
{
gfloat *buffer;
guint n_outputs;
} EngineOutput;
struct _EngineNode /* fields sorted by order of processing access */
{
BseModule module;
BirnetRecMutex rec_mutex; /* processing lock */
guint64 counter; /* <= GSL_TICK_STAMP */
EngineInput *inputs; /* [ENGINE_NODE_N_ISTREAMS()] */
EngineJInput **jinputs; /* [ENGINE_NODE_N_JSTREAMS()][jstream->jcount] */
EngineOutput *outputs; /* [ENGINE_NODE_N_OSTREAMS()] */
/* timed jobs */
EngineTimedJob *flow_jobs; /* active jobs */
EngineTimedJob *probe_jobs; /* probe requests */
EngineTimedJob *boundary_jobs; /* active jobs */
EngineTimedJob *tjob_head, *tjob_tail; /* trash list */
/* suspend/activation time */
guint64 next_active; /* result of suspend state updates */
/* master-node-list */
EngineNode *mnl_next;
EngineNode *mnl_prev;
guint integrated : 1;
guint virtual_node : 1;
guint is_consumer : 1;
/* suspension */
guint update_suspend : 1; /* whether suspend state needs updating */
guint in_suspend_call : 1; /* recursion barrier during suspend state updates */
guint needs_reset : 1; /* flagged at resumption */
/* scheduler */
guint cleared_ostreams : 1; /* whether ostream[].connected was cleared already */
guint sched_tag : 1; /* whether this node is contained in the schedule */
guint sched_recurse_tag : 1; /* recursion flag used during scheduling */
guint sched_leaf_level;
guint64 local_active; /* local suspend state stamp */
EngineNode *toplevel_next; /* master-consumer-list, FIXME: overkill, using a SfiRing is good enough */
SfiRing *output_nodes; /* EngineNode* ring of nodes in ->outputs[] */
};
G_END_DECLS
#endif /* __BSE_ENGINE_NODE_H__ */
|