You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.6 KiB
102 lines
2.6 KiB
#include <stdio.h>
|
|
#include <scot/scot_int.h>
|
|
#include <scot/event.h>
|
|
#include <scot/thread.h>
|
|
|
|
#define GEN_LOCAL
|
|
#include <scot/list.h>
|
|
#include <scot/queue.h>
|
|
#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
|
|
*/
|