dnotifier.c
Go to the documentation of this file.00001
00039 #include <cfg/debug.h>
00040
00041 #include <dt/dtag.h>
00042 #include <dt/dnotifier.h>
00043 #include <struct/list.h>
00044
00049 static void notifier_update(DNotifier *n, dtag_t tag, dval_t val)
00050 {
00051 dnotify_targets(n, tag, val);
00052 }
00053
00057 void notifier_init(DNotifier *n)
00058 {
00059
00060 n->update = notifier_update;
00061 LIST_INIT(&n->targets);
00062 }
00063
00070 void filter_update(DFilter *f, dtag_t tag, dval_t val)
00071 {
00072
00073 const DFilterMap *map = f->map;
00074
00075 if (map)
00076 {
00077 while (map->src.tag != TAG_END)
00078 {
00079 if ((map->src.tag == tag) && (map->src.val == val))
00080 {
00081 tag = map->dst.tag;
00082 val = map->dst.val;
00083 break;
00084 }
00085
00086 if (map->src.tag == TAG_ANY)
00087 break;
00088 map++;
00089 }
00090
00091 if (map->src.tag != TAG_END)
00092 dnotify(f->target, tag, val);
00093 }
00094 else
00095 dnotify(f->target, tag, val);
00096 }
00097
00098
00106 void filter_mask_update(DFilter *f, dtag_t tag, dval_t val)
00107 {
00108
00109 const DFilterMap *map = f->map;
00110 dfilter_mask_t mask;
00111
00112 if (map)
00113 {
00114 while (map->src.tag != TAG_END)
00115 {
00116 mask = (dfilter_mask_t) map->src.val;
00117 if ((map->src.tag == tag) && ((mask & (dfilter_mask_t)val) == mask))
00118 {
00119 tag = map->dst.tag;
00120 val = map->dst.val;
00121 break;
00122 }
00123
00124 if (map->src.tag == TAG_ANY)
00125 break;
00126 map++;
00127 }
00128
00129
00130 if (map->src.tag != TAG_END)
00131 dnotify(f->target, tag, val);
00132 }
00133 else
00134 dnotify(f->target, tag, val);
00135 }
00136
00137
00138 #define FILTER_MAGIC_ACTIVE 0xAA
00139
00143 void filter_init(DFilter *f, const DFilterMap *map, bool masked, DNotifier *source, DNotifier *target)
00144 {
00145
00146 if (masked)
00147 f->update = (update_filter_ptr)filter_mask_update;
00148 else
00149 f->update = (update_filter_ptr)filter_update;
00150
00151
00152 f->map = map;
00153 f->target = target;
00154
00155
00156 ASSERT(f->magic != FILTER_MAGIC_ACTIVE);
00157 DB(f->magic = FILTER_MAGIC_ACTIVE;)
00158
00159
00160 ADDTAIL(&source->targets, &f->link);
00161 }