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.
138 lines
2.9 KiB
138 lines
2.9 KiB
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <inttypes.h>
|
|
|
|
#include "trbase.h"
|
|
#include "trcomm.h"
|
|
#include "trevent.h"
|
|
#include "test_handler.h"
|
|
|
|
static
|
|
TR_EventDone
|
|
testHandlerHeartbeat(TR_EventHandler this, TR_Event event)
|
|
{
|
|
double size = (double)((TestHandler)this)->size;
|
|
double size_msg = ((TestHandler)this)->size
|
|
? size / ((TestHandler)this)->handled
|
|
: 0.0;
|
|
int div_count = ' ';
|
|
|
|
while (size > 1024. && div_count != 'G') {
|
|
size /= 1024.;
|
|
switch (div_count) {
|
|
case 0: div_count = 'K'; break;
|
|
case 'K': div_count = 'M'; break;
|
|
case 'M': div_count = 'G'; break;
|
|
}
|
|
}
|
|
|
|
printf("%zd beat(s) since last beat / "
|
|
"handled: %llu msg/s %4.2lf %cBytes/s %4.0lf Bytes/msg\n",
|
|
((TR_EventDispatcher)event->subject)->n_beats,
|
|
((TestHandler)this)->handled,
|
|
size, div_count, size_msg);
|
|
fflush(stdout);
|
|
((TestHandler)this)->handled = 0;
|
|
((TestHandler)this)->size = 0;
|
|
|
|
return TR_EVENT_DONE;
|
|
}
|
|
|
|
static
|
|
TR_EventDone
|
|
testHandlerNewMessage(TR_EventHandler this, TR_Event event)
|
|
{
|
|
TR_Event _event;
|
|
TR_ProtoMessageRaw message = event->data;
|
|
|
|
((TestHandler)this)->handled++;
|
|
((TestHandler)this)->size += message->size + 2;
|
|
|
|
_event = TR_eventSubjectEmit(
|
|
event->subject,
|
|
TR_CEP_EVENT_MSG_READY,
|
|
event->data);
|
|
|
|
TR_eventHandlerIssueEvent((TR_EventHandler)this, _event);
|
|
|
|
return TR_EVENT_DONE;
|
|
}
|
|
|
|
static
|
|
TR_EventDone
|
|
testHandlerClose(TR_EventHandler this, TR_Event event)
|
|
{
|
|
// puts("close");
|
|
|
|
return TR_EVENT_PENDING;
|
|
}
|
|
|
|
#if 0
|
|
static
|
|
TR_EventDone
|
|
testHandlerUpgrade(TR_EventHandler this, TR_Event event)
|
|
{
|
|
printf("upgrade: %"PRIdPTR"\n", event->id);
|
|
|
|
return TR_EVENT_PENDING;
|
|
}
|
|
#endif
|
|
|
|
static
|
|
int
|
|
testHandlerCtor(void * _this, va_list * params)
|
|
{
|
|
TR_PARENTCALL(TestHandler, _this, TR_Class, ctor, params);
|
|
((TestHandler)_this)->handled = 0;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static
|
|
void
|
|
testHandlerDtor(void * _this, va_list * params)
|
|
{
|
|
TR_PARENTCALL(TestHandler, _this, TR_Class, dtor);
|
|
}
|
|
|
|
static
|
|
void
|
|
testHandlerCvInit(TR_class_ptr class)
|
|
{
|
|
TR_CLASSVARS(TR_EventHandler, class)->event_methods->tree = TR_new(TR_Tree);
|
|
|
|
TR_EVENT_HANDLER_SET_METHOD(
|
|
class,
|
|
TR_EventDispatcher,
|
|
TR_DISPATCHER_EVENT_HEARTBEAT,
|
|
testHandlerHeartbeat);
|
|
TR_EVENT_HANDLER_SET_METHOD(
|
|
class,
|
|
TR_CommEndPoint,
|
|
TR_CEP_EVENT_NEW_MSG,
|
|
testHandlerNewMessage);
|
|
TR_EVENT_HANDLER_SET_METHOD(
|
|
class,
|
|
TR_CommEndPoint,
|
|
TR_CEP_EVENT_CLOSE,
|
|
testHandlerClose);
|
|
#if 0
|
|
TR_EVENT_HANDLER_SET_METHOD(
|
|
class,
|
|
TR_CommEndPoint,
|
|
TR_CEP_EVENT_UPGRADE,
|
|
testHandlerUpgrade);
|
|
#endif
|
|
}
|
|
|
|
TR_INSTANCE(TR_Hash, testHandlerEventMethods);
|
|
TR_INIT_IFACE(TR_Class, testHandlerCtor, testHandlerDtor, NULL);
|
|
TR_CREATE_CLASS(
|
|
TestHandler,
|
|
TR_EventHandler,
|
|
testHandlerCvInit,
|
|
TR_IF(TR_Class)) = {
|
|
{ &(_testHandlerEventMethods.data) }
|
|
};
|
|
|
|
// vim: set ts=4 sw=4:
|