TEMU  3.0
The Terma Emulator
Events.h
Go to the documentation of this file.
1 //===-- temu-c/Events.h - Event Queue API -----------------------*- C++ -*-===//
2 //
3 // TEMU: The Terma Emulator
4 // (c) Terma 2015, 2016
5 // Authors: Mattias Holm <maho (at) terma.com>
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef TEMU_EVENTS_H
10 #define TEMU_EVENTS_H
11 
12 #include <stdint.h>
13 #include "temu-c/Support/Objsys.h"
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 
20 // New style events
22 
23 typedef struct temu_Event {
24  int64_t Time; // Managed internally, do not touch
25  int64_t EventId; // Managed internally, do not touch
26  uint32_t Flags; // Internal use, do not touch
27  int QueueIdx; // Managed internally, do not touch
28  temu_EventQueue *Queue; // Managed internally, do not touch
29  void *Obj; // Managed internally, only for reading
30  void (*Func)(struct temu_Event*);
31 
32  int64_t Period; // Managed: Period (cycles) for cyclic events
33  int64_t RTTime; // Managed: Time (monotonic ns) for RT exec
34  int64_t RTPeriod; // Managed: Period (ns) for RT events
35 } temu_Event;
36 
37 // Posting callback from other threads
38 typedef void (*temu_ThreadSafeCb)(void*);
39 
40 
41 typedef struct {
42  // Async callbacks
43  void (*postCallback)(void *Obj, temu_ThreadSafeCb Cb, void *Arg);
44  void (*removeCallback)(void *Obj, temu_ThreadSafeCb Cb, void *Arg);
45 
46  // New event API
47  void (*postAbsolute)(void *Obj, int64_t EvId, int64_t T);
48  void (*postRelative)(void *Obj, int64_t EvId, int64_t T);
49  void (*postOnStack)(void *Obj, int64_t EvId);
51 #define TEMU_EVENT_IFACE_TYPE "EventIface"
53 
65 TEMU_API int64_t temu_eventPublishStruct(const char *EvName, temu_Event *Ev, void *Obj,
66  void (*Func)(temu_Event*));
67 
74 TEMU_API void temu_eventDepublish(int64_t EvID);
75 
96 TEMU_API int64_t temu_eventPublish(const char *EvName, void *Obj,
97  void (*Func)(temu_Event*));
98 
99 // Synchronisation events
100 typedef enum {
101  teSE_Cpu, // Trigger event when CPU reaches timer
102  teSE_Machine, // Synchronise event on machine
104 
119 TEMU_API void temu_eventPostCycles(void *Q, int64_t EvID, int64_t Delta,
120  temu_SyncEvent Sync);
131 TEMU_API void temu_eventPostNanos(void *Q, int64_t EvID, int64_t Delta,
132  temu_SyncEvent Sync);
142 TEMU_API void temu_eventPostSecs(void *Q, int64_t EvID, double Delta,
143  temu_SyncEvent Sync);
144 
157 TEMU_API void temu_eventPostStack(void *Q, int64_t EvID, temu_SyncEvent Sync);
158 
167 TEMU_API int temu_eventIsScheduled(int64_t EvID);
168 
174 TEMU_API void temu_eventDeschedule(int64_t EvID);
175 
183 TEMU_API int64_t temu_eventGetCycles(void *Q, int64_t EvID);
184 
192 TEMU_API int64_t temu_eventGetNanos(void *Q, int64_t EvID);
193 
201 TEMU_API double temu_eventGetSecs(void *Q, int64_t EvID);
202 
203 
204 //======================== EXPERIMENTAL API ==================================//
206 #define TEMU_ASYNC_CYCLIC 1
207 #define TEMU_ASYNC_READ (1 << 1)
208 #define TEMU_ASYNC_WRITE (1 << 2)
209 
239 TEMU_API int temu_asyncTimerAdd(void *Q, double T,
240  unsigned Flags, void (*CB)(void*),
241  void *Data);
242 
248 TEMU_API void temu_asyncTimerRemove(int Fd);
249 
266 TEMU_API int temu_asyncSocketAdd(void *Q, int Sock, unsigned Flags,
267  void (*CB)(void*),
268  void *Data);
269 
276 TEMU_API void temu_asyncSocketRemove(int Fd, unsigned Flags);
277 
286 TEMU_API void temu_eventPostAsync(void *Q, temu_ThreadSafeCb CB, void *Data,
287  temu_SyncEvent Sync);
288 
289 
320 TEMU_API int temu_eventSetRealTime(int64_t EvID);
321 
322 
336 TEMU_API void temu_eventSetPeriodCycles(int64_t EvID, int64_t Period);
337 
345 TEMU_API void temu_eventSetRTPeriodNanos(int64_t EvID, int64_t Period);
346 
357 TEMU_API void temu_eventSetRTTime(int64_t EvID, int64_t Time);
358 
362 TEMU_API uint64_t temu_eventQueueGetFreq(void *Q);
363 
364 //================= END OF EXPERIMENTAL API ==================================//
365 
366 #ifdef __cplusplus
367 }
368 #endif
369 
370 #endif /* ! TEMU_EVENTS_H */
TEMU_API void temu_eventDeschedule(int64_t EvID)
struct temu_EventQueue temu_EventQueue
Definition: Events.h:21
TEMU_API int temu_asyncSocketAdd(void *Q, int Sock, unsigned Flags, void(*CB)(void *), void *Data)
TEMU_API int64_t temu_eventPublish(const char *EvName, void *Obj, void(*Func)(temu_Event *))
TEMU_API int temu_eventIsScheduled(int64_t EvID)
temu_EventQueue * Queue
Definition: Events.h:28
Definition: Events.h:41
Definition: Events.h:23
int64_t Time
Definition: Events.h:24
TEMU_API void temu_eventPostCycles(void *Q, int64_t EvID, int64_t Delta, temu_SyncEvent Sync)
TEMU_API int temu_eventSetRealTime(int64_t EvID)
uint32_t Flags
Definition: Events.h:26
Definition: Events.h:101
TEMU_API void temu_eventPostAsync(void *Q, temu_ThreadSafeCb CB, void *Data, temu_SyncEvent Sync)
TEMU_API int64_t temu_eventGetNanos(void *Q, int64_t EvID)
TEMU_API int64_t temu_eventPublishStruct(const char *EvName, temu_Event *Ev, void *Obj, void(*Func)(temu_Event *))
TEMU_API int64_t temu_eventGetCycles(void *Q, int64_t EvID)
#define TEMU_API
Definition: Attributes.h:53
int64_t EventId
Definition: Events.h:25
TEMU_API void temu_eventSetPeriodCycles(int64_t EvID, int64_t Period)
temu_SyncEvent
Definition: Events.h:100
TEMU_API uint64_t temu_eventQueueGetFreq(void *Q)
TEMU_API void temu_eventPostStack(void *Q, int64_t EvID, temu_SyncEvent Sync)
int64_t RTPeriod
Definition: Events.h:34
TEMU_API void temu_asyncSocketRemove(int Fd, unsigned Flags)
int QueueIdx
Definition: Events.h:27
TEMU_IFACE_REFERENCE_TYPE(temu_Event)
TEMU_API double temu_eventGetSecs(void *Q, int64_t EvID)
struct temu_Event temu_Event
TEMU_API int temu_asyncTimerAdd(void *Q, double T, unsigned Flags, void(*CB)(void *), void *Data)
TEMU_API void temu_eventPostNanos(void *Q, int64_t EvID, int64_t Delta, temu_SyncEvent Sync)
TEMU_API void temu_eventSetRTTime(int64_t EvID, int64_t Time)
void * Obj
Definition: Events.h:29
TEMU_API void temu_eventPostSecs(void *Q, int64_t EvID, double Delta, temu_SyncEvent Sync)
int64_t RTTime
Definition: Events.h:33
TEMU_API void temu_eventSetRTPeriodNanos(int64_t EvID, int64_t Period)
int64_t Period
Definition: Events.h:32
TEMU_API void temu_asyncTimerRemove(int Fd)
void(* Func)(struct temu_Event *)
Definition: Events.h:30
Definition: Events.h:102
TEMU_API void temu_eventDepublish(int64_t EvID)
void(* temu_ThreadSafeCb)(void *)
Definition: Events.h:38