1 /*======================================================================*
2 * Copyright (C) 2008 Light Weight Event System *
3 * All rights reserved. *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the Free Software *
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
18 * Boston, MA 02110-1301 USA. *
19 *======================================================================*/
20 #include "lwes_emitter.h"
22 /*************************************************************************
23 PRIVATE API prototypes, shouldn't be called by a user of the library.
24 *************************************************************************/
26 lwes_emitter_emit_event
27 (struct lwes_emitter
*emitter
,
28 struct lwes_event
*event
);
31 lwes_emitter_collect_statistics
32 (struct lwes_emitter
*emitter
);
34 void lwes_emitter_calculate_and_send_statistics
35 (struct lwes_emitter
*emitter
,
36 struct lwes_event
*stats_event
,
39 /*************************************************************************
41 *************************************************************************/
44 (LWES_CONST_SHORT_STRING address
,
45 LWES_CONST_SHORT_STRING iface
,
47 LWES_BOOLEAN emit_heartbeat
,
50 return lwes_emitter_create_with_ttl (address
,
59 lwes_emitter_create_with_ttl
60 (LWES_CONST_SHORT_STRING address
,
61 LWES_CONST_SHORT_STRING iface
,
63 LWES_BOOLEAN emit_heartbeat
,
67 struct lwes_event
* tmp_event
;
68 struct lwes_emitter
* emitter
=
69 (struct lwes_emitter
*) malloc (sizeof (struct lwes_emitter
));
76 if (lwes_net_open (&(emitter
->connection
),address
,iface
,port
) < 0)
82 if (lwes_net_set_ttl (&(emitter
->connection
), ttl
) == -1)
88 emitter
->buffer
= (LWES_BYTE_P
) malloc (sizeof (LWES_BYTE
)*MAX_MSG_SIZE
);
89 if (emitter
->buffer
== NULL
)
96 emitter
->count_since_last_beat
= 0;
97 emitter
->sequence
= 0;
98 emitter
->frequency
= freq
;
99 emitter
->emitHeartbeat
= emit_heartbeat
;
101 /* Send an event saying we are starting up */
102 if (emitter
->emitHeartbeat
)
104 tmp_event
= lwes_event_create (NULL
,(LWES_SHORT_STRING
)"System::Startup");
105 if ( tmp_event
!= NULL
)
107 emitter
->last_beat_time
= time (NULL
);
108 lwes_emitter_emit_event (emitter
,tmp_event
);
109 lwes_event_destroy (tmp_event
);
118 (struct lwes_emitter
*emitter
,
119 struct lwes_event
*event
)
129 error
= lwes_emitter_emit_event (emitter
,event
);
131 lwes_emitter_collect_statistics (emitter
);
138 (LWES_SHORT_STRING address
,
139 LWES_SHORT_STRING iface
,
141 struct lwes_emitter
*emitter
,
142 struct lwes_event
*event
)
152 if ((size
= lwes_event_to_bytes (event
,emitter
->buffer
,MAX_MSG_SIZE
,0)) < 0)
157 if (lwes_net_sendto_bytes (&(emitter
->connection
),
161 emitter
->buffer
,size
) < 0 )
171 (struct lwes_emitter
*emitter
)
173 /* Send an event saying we are shutting down */
175 if (emitter
->emitHeartbeat
)
177 struct lwes_event
*tmp_event
=
178 lwes_event_create(NULL
,(LWES_SHORT_STRING
)"System::Shutdown");
179 time_t current_time
= time (NULL
);
181 lwes_emitter_calculate_and_send_statistics (emitter
,
186 /* shutdown the network, use the return code here for library users */
187 ret
= lwes_net_close (&(emitter
->connection
));
189 /* free our memory */
190 if ( emitter
!= NULL
&& emitter
->buffer
!= NULL
)
192 free(emitter
->buffer
);
194 if ( emitter
!= NULL
)
203 lwes_emitter_emit_bytes
204 (struct lwes_emitter
*emitter
,
208 return lwes_net_send_bytes (&(emitter
->connection
), bytes
,length
);
211 /*************************************************************************
213 *************************************************************************/
215 lwes_emitter_emit_event
216 (struct lwes_emitter
*emitter
,
217 struct lwes_event
*event
)
221 if ((size
= lwes_event_to_bytes (event
,emitter
->buffer
,MAX_MSG_SIZE
,0)) < 0)
226 if (lwes_emitter_emit_bytes (emitter
, emitter
->buffer
, size
) == -1)
234 void lwes_emitter_calculate_and_send_statistics
235 (struct lwes_emitter
*emitter
,
236 struct lwes_event
*stats_event
,
239 if (stats_event
!= NULL
)
241 LWES_INT_16 frequency_this_period
;
242 time_t tmp
= (current_time
- emitter
->last_beat_time
);
245 frequency_this_period
=32767;
249 frequency_this_period
=0;
253 frequency_this_period
=(LWES_INT_16
)tmp
;
256 lwes_event_set_INT_16(stats_event
,(LWES_SHORT_STRING
)"freq",
257 frequency_this_period
);
258 lwes_event_set_INT_64(stats_event
,(LWES_SHORT_STRING
)"seq",
260 lwes_event_set_INT_64(stats_event
,(LWES_SHORT_STRING
)"count",
261 emitter
->count_since_last_beat
);
262 lwes_event_set_INT_64(stats_event
,(LWES_SHORT_STRING
)"total",
264 lwes_emitter_emit_event(emitter
,stats_event
);
265 lwes_event_destroy(stats_event
);
270 lwes_emitter_collect_statistics
271 (struct lwes_emitter
*emitter
)
273 time_t current_time
= time (NULL
);
277 emitter
->count_since_last_beat
++;
279 /* Send a heartbeat event */
280 if ( emitter
->emitHeartbeat
281 && (current_time
- emitter
->last_beat_time
) >= emitter
->frequency
)
283 struct lwes_event
*tmp_event
=
284 lwes_event_create (NULL
,(LWES_SHORT_STRING
)"System::Heartbeat");
286 if (tmp_event
!= NULL
)
289 lwes_emitter_calculate_and_send_statistics (emitter
,
292 emitter
->last_beat_time
= current_time
;
293 emitter
->count_since_last_beat
= 0;