event_new.c
2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#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
*/