event_new.c 2.57 KB
#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
 */