00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __LIBMGK_H_INCLUDED__
00012 #define __LIBMGK_H_INCLUDED__
00013
00014 #include <setjmp.h>
00015
00016
00017
00018 #ifndef NULL
00019 #define NULL 0
00020 #endif
00021 #ifndef TRUE
00022 #define TRUE 1
00023 #endif
00024 #ifndef FALSE
00025 #define FALSE 0
00026 #endif
00027
00028 #ifndef min
00029 #define min(x,y) (((x) < (y)) ? (x) : (y))
00030 #endif
00031 #ifndef max
00032 #define max(x,y) (((x) > (y)) ? (x) : (y))
00033 #endif
00034 #ifndef itemsof
00035 #define itemsof(a) (sizeof(a) / sizeof(a[0]))
00036 #endif
00037
00038
00039
00040 typedef struct __mgk_host mgk_host, *mgk_hostp;
00041 typedef struct __mgk_node mgk_node, *mgk_nodep;
00042 typedef struct __mgk_remnode mgk_remnode, *mgk_remnodep;
00043 typedef struct __mgk_buffer mgk_buffer, *mgk_bufferp;
00044 typedef struct __mgk_value mgk_value, *mgk_valuep;
00045 typedef struct __mgk_port mgk_port, *mgk_portp;
00046 typedef struct __mgk_inport mgk_inport, *mgk_inportp;
00047 typedef struct __mgk_outport mgk_outport, *mgk_outportp;
00048 typedef struct __mgk_link mgk_link, *mgk_linkp;
00049 typedef struct __mgk_mask_trigger mgk_mask_trigger, *mgk_mask_triggerp;
00050 typedef struct __mgk_script_def mgk_script_def, *mgk_script_defp;
00051 typedef struct __mgk_command_packet mgk_command_packet, *mgk_command_packetp;
00052 typedef struct __mgk_data_packet mgk_data_packet, *mgk_data_packetp;
00053 typedef struct __mgk_buffer_xfer mgk_buffer_xfer, *mgk_buffer_xferp;
00054 typedef struct __mgk_type_info mgk_type_info, *mgk_type_infop;
00055
00056 #include "mgk60.h"
00057
00058
00059
00060 typedef unsigned long type_tag;
00061 #define OBJ_INVALID 0
00062 #define OBJ_HOST 0x45678915
00063 #define OBJ_NODE 0x98759717
00064 #define OBJ_BUFFER 0x75801253
00065 #define OBJ_REMNODE 0x98548775
00066
00067
00068 struct __mgk_buffer {
00069 type_tag tag;
00070 unsigned int size;
00071 void *refval;
00072 mgk_buffer *next;
00073 };
00074
00075 typedef union {
00076 char C;
00077 short S;
00078 int I;
00079 long L;
00080 float F;
00081 double D;
00082 } mgk_scalar;
00083
00084 struct __mgk_value {
00085 mgk_data_type type;
00086 void *value;
00087 mgk_value *next;
00088 mgk_scalar scalar_val;
00089 unsigned long create_time;
00090 };
00091
00092 struct __mgk_inport {
00093 mgk_value *head;
00094 mgk_value *tail;
00095 mgk_link *links;
00096 unsigned int qlen;
00097 unsigned int maxlen;
00098 mgk_scalar scalar_val;
00099 };
00100
00101 struct __mgk_outport {
00102 mgk_link *links;
00103 };
00104
00105 struct __mgk_link {
00106 enum {
00107 LINK_L2L, LINK_L2R, LINK_R2L
00108 } type;
00109 unsigned int srcidx;
00110 unsigned int dstidx;
00111 union {
00112 struct {
00113 mgk_link *nextin;
00114 mgk_link *nextout;
00115 mgk_node *src;
00116 mgk_node *dst;
00117 } l2l;
00118 struct {
00119 mgk_node *src;
00120 mgk_link *nextout;
00121 mgk_remnode *dst;
00122 unsigned int qlen;
00123 unsigned int maxlen;
00124 mgk_value *head;
00125 mgk_value *tail;
00126 mgk_data_packet *active;
00127 } l2r;
00128 struct {
00129 mgk_link *nextin;
00130 mgk_remnode *src;
00131 mgk_node *dst;
00132 } r2l;
00133 } l;
00134 };
00135
00136 struct __mgk_mask_trigger {
00137 mgk_portmask mask;
00138 mgk_script script;
00139 mgk_mask_trigger *next;
00140 };
00141
00142 typedef enum {
00143 WAITING,
00144 READY,
00145 RUNNING
00146 } node_status;
00147
00148 struct __mgk_node {
00149 type_tag tag;
00150 mgk_script script;
00151 mgk_value *context;
00152 mgk_inport *ins;
00153 mgk_outport *outs;
00154 unsigned int nin;
00155 unsigned int nout;
00156 unsigned int priority;
00157 unsigned int last_ifany_port;
00158 unsigned long ID;
00159 mgk_portmask input_mask;
00160 mgk_portmask data_mask;
00161 mgk_trigger_mode tmode;
00162 mgk_mask_trigger *trigger_list;
00163 mgk_mask_trigger *active_trigger;
00164 unsigned long ready_time;
00165 mgk_buffer *buffer_list;
00166 node_status status;
00167 mgk_node *next;
00168 };
00169
00170
00171
00172 struct __mgk_remnode {
00173 type_tag tag;
00174 mgk_host *host;
00175 unsigned long ID;
00176 mgk_remnode *next;
00177 };
00178
00179 #ifdef DEFSVC
00180 #undef DEFSVC
00181 #endif
00182 #define DEFSVC(name) cmd_##name,
00183
00184 typedef enum {
00185 #include "remcmd.h"
00186 REMOTE_COMMAND_COUNT
00187 } mgk_remcmd;
00188
00189 #ifdef DEFSVC
00190 #undef DEFSVC
00191 #endif
00192 #define DEFSVC(name) int __mgk_svc_##name(int argc,mgk_value **argv, \
00193 int rargc,mgk_value **rargv);
00194 #include "remcmd.h"
00195
00196 #ifdef DEFSVC
00197 #undef DEFSVC
00198 #endif
00199 #define DEFSVC(name) int __mgk_svc_##name(int argc,mgk_value **argv, \
00200 int rargc,mgk_value **rargv)
00201
00202 #define MAX_REMCMD_ARGS 8
00203 #define MAX_REMCMD_REPLIES 4
00204
00205 struct __mgk_data_packet {
00206 unsigned long serial_no;
00207 unsigned long node_ID;
00208 unsigned int port;
00209 mgk_value *data;
00210 mgk_link *backlink;
00211 mgk_data_packet *next;
00212 };
00213
00214 struct __mgk_command_packet {
00215 unsigned long serial_no;
00216 mgk_remcmd command_id;
00217 int argc;
00218 int rargc;
00219 mgk_value *argv[MAX_REMCMD_ARGS];
00220 mgk_value *rargv[MAX_REMCMD_REPLIES];
00221 int num_incomplete;
00222 int done;
00223 int success;
00224 mgk_command_packet *next;
00225 };
00226
00227 struct __mgk_buffer_xfer {
00228 unsigned long serial_no;
00229 mgk_value *data;
00230 void *buffer;
00231 unsigned int items_left;
00232 unsigned int xfer_pos;
00233 void *packet;
00234 int argidx;
00235 mgk_type_info *type;
00236 mgk_buffer_xfer *next;
00237 };
00238
00239 struct __mgk_type_info {
00240 mgk_data_type type_code;
00241 unsigned int native_size;
00242 unsigned int packed_size;
00243 unsigned int packed_size2;
00244 unsigned int packed_size4;
00245 unsigned int max_cmd_pkt_pack_count;
00246 unsigned int max_data_pkt_pack_count;
00247 unsigned int buf_xfer_count;
00248 void (*pack) (void *data, unsigned int count);
00249 void (*unpk) (void *data, unsigned int count);
00250 void (*send) (void *data, unsigned int count, mgk_host * hp);
00251 void (*recv) (void *data, unsigned int count, mgk_host * hp);
00252 };
00253
00254 struct __mgk_host {
00255 type_tag tag;
00256 int index;
00257 unsigned long sent_msg_count;
00258 unsigned long acq_msg_count;
00259 unsigned long last_recvd_msg;
00260 unsigned long cmd_send_count;
00261 unsigned long data_send_count;
00262 unsigned long buffer_send_count;
00263 mgk_command_packet *queued_cmds;
00264 mgk_command_packet *last_queued_cmd;
00265 mgk_command_packet *send_incomplete_cmds;
00266 mgk_command_packet *sent_cmds;
00267 mgk_command_packet *reply_incomplete_cmds;
00268 mgk_command_packet *received_incomplete_cmds;
00269 mgk_command_packet *executed_cmds;
00270 mgk_data_packet *queued_data;
00271 mgk_data_packet *received_incomplete_data;
00272 mgk_buffer_xfer *queued_to_send_buffers;
00273 mgk_buffer_xfer *send_buffers;
00274 mgk_buffer_xfer *queued_to_recv_buffers;
00275 mgk_buffer_xfer *receive_buffers;
00276 int error;
00277 int sent_keepalive;
00278 };
00279
00280
00281
00282 extern mgk_node *__mgk_running_node;
00283 extern jmp_buf __mgk_node_abort_context;
00284 extern mgk_node **__mgk_local_nodes;
00285 extern int __mgk_num_local_nodes;
00286 extern mgk_host *__mgk_host_table;
00287 extern mgk_host *__mgk_local_host;
00288 extern int __mgk_num_hosts;
00289 extern unsigned long __mgk_tick;
00290
00291
00292
00293 #define __mgk_check_buffer(b) ( \
00294 ((b) != NULL) && \
00295 (((long)(b) & (sizeof(long) - 1)) == 0) && \
00296 (((mgk_bufferp)(b))[-1].tag == OBJ_BUFFER) \
00297 )
00298
00299 #define __mgk_check_host(h) ( \
00300 ((h) != NULL) && (((mgk_host *)(h))->tag == OBJ_HOST) \
00301 )
00302
00303 #define __mgk_check_node(n) ( \
00304 ((n) != NULL) && (((mgk_node *)(n))->tag == OBJ_NODE) \
00305 )
00306
00307 #define __mgk_check_remnode(n) ( \
00308 ((n) != NULL) && (((mgk_node *)(n))->tag == OBJ_REMNODE) \
00309 )
00310
00311 #define __mgk_buffer_header(b) \
00312 (((mgk_bufferp)(b)) - 1)
00313
00314 #define __mgk_checked_buffer_header(b) ( \
00315 __mgk_check_buffer(b) ? \
00316 __mgk_buffer_header(b) : \
00317 ((mgk_bufferp)(0)) \
00318 )
00319
00320 void *__mgk_allocate_buffer(unsigned int size);
00321 void *__mgk_copy_buffer(void *buffer);
00322 mgk_error_code __mgk_free_buffer(void *buffer);
00323
00324 #define __mgk_free_buffer_header(bh) __mgk_free_buffer((bh) + 1)
00325
00326 mgk_script __mgk_lookup_script(char *name);
00327 char *__mgk_script_name(mgk_script fn);
00328
00329 void __mgk_enqueue(mgk_node * node);
00330 void __mgk_dequeue(mgk_node * node);
00331 mgk_node *__mgk_next_node(void);
00332 void __mgk_execute_node(mgk_node * np);
00333
00334 void __mgk_update(mgk_node * node);
00335
00336 void __mgk_free_value(mgk_value * val);
00337 void __mgk_free_value_list(mgk_value * val);
00338
00339 mgk_value *__mgk_build_value(void *data, mgk_data_type type);
00340 mgk_value *__mgk_copy_value(mgk_value * vp);
00341 mgk_value *__mgk_alias_value(mgk_value * vp);
00342 mgk_value *__mgk_alias_value_autofree(mgk_value * vp, int *refcnt);
00343 void *__mgk_parse_value(mgk_value * value, mgk_data_type * typep);
00344 void *__mgk_extract_value(mgk_value * value, mgk_data_type * tp, mgk_scalar * sp);
00345
00346 mgk_remnode *__mgk_remnode_stub(mgk_host * h, unsigned long ID);
00347 mgk_node *__mgk_retrieve_node_by_ID(unsigned long ID);
00348 mgk_node *__mgk_locate_node(unsigned int hostidx, unsigned long ID);
00349
00350 int __mgk_remote_call(mgk_host * host, mgk_remcmd cmd,
00351 int argc, mgk_value ** argv,
00352 int rargc, mgk_value ** rargv);
00353 void __mgk_remote_propagate(mgk_link * lk);
00354
00355 #endif