dispatch_st.h (2883B)
1 /* Copyright (c) 2001, Matej Pfajfar. 2 * Copyright (c) 2001-2004, Roger Dingledine. 3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. 4 * Copyright (c) 2007-2021, The Tor Project, Inc. */ 5 /* See LICENSE for licensing information */ 6 7 /** 8 * \file dispatch_st.h 9 * 10 * \brief private structures used for the dispatcher module 11 */ 12 13 #ifndef TOR_DISPATCH_ST_H 14 #define TOR_DISPATCH_ST_H 15 16 #ifdef DISPATCH_PRIVATE 17 18 #include "lib/container/smartlist.h" 19 20 /** 21 * Information about the recipient of a message. 22 **/ 23 typedef struct dispatch_rcv_t { 24 /** The subsystem receiving a message. */ 25 subsys_id_t sys; 26 /** True iff this recipient is enabled. */ 27 bool enabled; 28 /** The function that will handle the message. */ 29 recv_fn_t fn; 30 } dispatch_rcv_t; 31 32 /** 33 * Information used by a dispatcher to handle and dispatch a single message 34 * ID. It maps that message ID to its type, channel, and list of receiver 35 * functions. 36 * 37 * This structure is used when the dispatcher is running. 38 **/ 39 typedef struct dtbl_entry_t { 40 /** The number of enabled non-stub subscribers for this message. 41 * 42 * Note that for now, this will be the same as <b>n_fns</b>, since there is 43 * no way to turn these subscribers on an off yet. */ 44 uint16_t n_enabled; 45 /** The channel that handles this message. */ 46 channel_id_t channel; 47 /** The associated C type for this message. */ 48 msg_type_id_t type; 49 /** 50 * The number of functions pointers for subscribers that receive this 51 * message, in rcv. */ 52 uint16_t n_fns; 53 /** 54 * The recipients for this message. 55 */ 56 dispatch_rcv_t rcv[FLEXIBLE_ARRAY_MEMBER]; 57 } dtbl_entry_t; 58 59 /** 60 * A queue of messages for a given channel, used by a live dispatcher. 61 */ 62 typedef struct dqueue_t { 63 /** The queue of messages itself. */ 64 TOR_SIMPLEQ_HEAD( , msg_t) queue; 65 /** A function to be called when the queue becomes nonempty. */ 66 dispatch_alertfn_t alert_fn; 67 /** An argument for the alert_fn. */ 68 void *alert_fn_arg; 69 } dqueue_t ; 70 71 /** 72 * A single dispatcher for cross-module messages. 73 */ 74 struct dispatch_t { 75 /** 76 * The length of <b>table</b>: the number of message IDs that this 77 * dispatcher can handle. 78 */ 79 size_t n_msgs; 80 /** 81 * The length of <b>queues</b>: the number of channels that this dispatcher 82 * has configured. 83 */ 84 size_t n_queues; 85 /** 86 * The length of <b>typefns</b>: the number of C type IDs that this 87 * dispatcher has configured. 88 */ 89 size_t n_types; 90 /** 91 * An array of message queues, indexed by channel ID. 92 */ 93 dqueue_t *queues; 94 /** 95 * An array of entries about how to handle particular message types, indexed 96 * by message ID. 97 */ 98 dtbl_entry_t **table; 99 /** 100 * An array of function tables for manipulating types, index by message 101 * type ID. 102 **/ 103 dispatch_typefns_t *typefns; 104 }; 105 106 #endif /* defined(DISPATCH_PRIVATE) */ 107 108 #endif /* !defined(TOR_DISPATCH_ST_H) */