Browse Source

keep track of the anount of pending events on a subject

1.0.0
Georg Hopp 11 years ago
parent
commit
2c2cb317e5
  1. 6
      include/tr/event_subject.h
  2. 7
      src/event.c
  3. 2
      src/event_subject_emit.c

6
include/tr/event_subject.h

@ -28,7 +28,9 @@
#include "trbase.h" #include "trbase.h"
TR_CLASS(TR_EventSubject) {};
TR_CLASS(TR_EventSubject) {
size_t emitted;
};
TR_INSTANCE_INIT(TR_EventSubject); TR_INSTANCE_INIT(TR_EventSubject);
TR_CLASSVARS_DECL(TR_EventSubject) { TR_CLASSVARS_DECL(TR_EventSubject) {
size_t nevents; size_t nevents;
@ -48,6 +50,8 @@ TR_CLASSVARS_DECL(TR_EventSubject) {
#define TR_eventSubjectGetId(obj, idx) \ #define TR_eventSubjectGetId(obj, idx) \
TR__eventSubjectId(TR_GET_CLASS(obj), idx) TR__eventSubjectId(TR_GET_CLASS(obj), idx)
#define TR_eventSubjectHasUnhandledEvents(es) ((es)->emitted > 0)
intptr_t TR__eventSubjectId(TR_class_ptr, size_t); intptr_t TR__eventSubjectId(TR_class_ptr, size_t);
TR_Event TR_eventSubjectEmit(TR_EventSubject, int, void *); TR_Event TR_eventSubjectEmit(TR_EventSubject, int, void *);

7
src/event.c

@ -41,7 +41,12 @@ eventCtor(void * _this, va_list * params)
return 0; return 0;
} }
static void eventDtor(void * _this) {}
static void eventDtor(void * _this)
{
TR_Event this = _this;
this->subject->emitted--;
}
TR_INIT_IFACE(TR_Class, eventCtor, eventDtor, NULL); TR_INIT_IFACE(TR_Class, eventCtor, eventDtor, NULL);
TR_CREATE_CLASS(TR_Event, NULL, NULL, TR_IF(TR_Class)) = { 0 }; TR_CREATE_CLASS(TR_Event, NULL, NULL, TR_IF(TR_Class)) = { 0 };

2
src/event_subject_emit.c

@ -38,6 +38,8 @@ TR_eventSubjectEmit(TR_EventSubject this, int idx, void * data)
TR_eventSetData(event, data); TR_eventSetData(event, data);
} }
this->emitted++;
return event; return event;
} }

Loading…
Cancel
Save