#include #include #include #include #define GEN_LOCAL #include #include #undef GEN_LOCAL struct scot_event_manager; struct scot_event_source { struct scot_event_manager * manager; unsigned int group; THREAD_T sthr; scot_event_source_entry_fptr event_source_thread_entry; int (*event_done_cb) (struct scot_event *); }; /* * das ist cool, mit folgender Struktur und der Tatsache das die registrierten * callbacks in einer Instanz dieser Struktur und dann in einer liste * gespeichert werden bedeutet, das ich mehrere callback zu einem event * registrieren kann. Im moment würden diese dann in undefinierter * Reihenfolge aufgerufen, sobald ein event auftaucht. * Sobald der tree code fertig ist sollte man die callbacks in einem * balanced b-tree speichern bei dem der key die event-nummer ist. * Das würde die zugriffe auf die callbacks nochmal erheblich beschleunigen. * Vorher könnte man sich überlegen callbacks sortiert einzufügen. * (Warscheinlich würde das auch schon reichen, da callbacks normalerweise * nur einmal zu beginn des Programms registriert werden und daher die * insert-zeit nicht so relevant ist.) */ struct scot_event_cb { uint32_t event; int (*cb) (struct scot_event *); /* wenn ein cb 0 zurückliefert werden keine weiteren registrierten callbacks zu diesem event ausgeführt, sonst so lange bis keine weiteren events vorliegen. */ }; typedef struct scot_event_cb scot_event_cb_t; GEN_LIST (scot_event_cb_t); struct scot_event_sink { struct scot_event_manager * manager; unsigned int group; uint32_t mask; list_scot_event_cb_t_node_t * cb_mappings; }; typedef struct scot_event scot_event_t; GEN_QUEUE (scot_event_t); struct scot_event_manager { struct scot_event_source sources [32]; struct scot_event_sink sinks [32]; queue_scot_event_node_t * queue; }; /* * Funktionen zum manager */ struct scot_event_manager * scot_event_manager_new (void); int scot_event_manager_register_source ( struct scot_event_manager *, struct scot_event_source *); int scot_event_manager_register_cb ( struct scot_event_manager *, uint32_t event, int (*cb) (struct scot_event *)); /* * Funktionen zur source */ struct scot_event_source * scot_event_source_init ( unsigned int group, int (*event_done_cb) (struct scot_event *)); int scot_event_source_register ( struct scot_event_source *); /* * Funktionen zur sink */