MIDAS
Loading...
Searching...
No Matches
consume.cxx
Go to the documentation of this file.
1/********************************************************************\
2
3 Name: consume.c
4 Created by: Stefan Ritt
5
6 Contents: Buffer manager test program. Simple consumer connec-
7 ting to a SYSTEM buffer and receiving some data.
8
9 $Id$
10
11\********************************************************************/
12
13#include <stdio.h>
14#include <stdlib.h>
15#include "midas.h"
16
17#define MAX_EVENT_SIZE (10*1024*1024)
18
24
25/*----- Print any system message -----------------------------------*/
26
28{
29 /* just print message text which comes after event header */
30 printf("%s\n", (char *) message);
31}
32
33/*----- Print any run transition -----------------------------------*/
34
36{
37 printf("Transition, run #%d\n", run_number);
38 return CM_SUCCESS;
39}
40
41/*----- process_event ----------------------------------------------*/
42
43void process_event(HNDLE hBuf, HNDLE request_id, EVENT_HEADER * pheader, void *pevent)
44{
45 static int ser[10], jam = 0;
46
47 int size, *pdata, id;
48
49 /* accumulate received event size */
50 size = pheader->data_size;
51 id = pheader->event_id;
52 if (id > 9)
53 id = 9;
54 event_byte_count += size + sizeof(EVENT_HEADER);
55
56 /* check if first and last word inside event is equal
57 to size to check that nothing was overwritten... */
58
59 if (!jam) {
60 /* only test once */
61 pdata = (INT *) (pheader + 1);
62 if (pdata[0] != size || pdata[size / 4 - 1] != size)
63 cm_msg(MERROR, "process_event", "--> data jam <--");
64 jam = 1;
65 }
66
67 /* if only some events are requested, sleep a little bit
68 to simulate a random event consumer */
69 if (!all_flag)
70 ss_sleep(10);
71
72 /* if all events are requested, now check the serial number
73 if no events are missing */
74 if (all_flag && (INT) pheader->serial_number != ser[id] + 1) {
75 cm_msg(MERROR, "process_event",
76 "Serial number mismatch: Ser: %d, OldSer: %d, ID: %d, size: %d",
77 pheader->serial_number, ser[id], pheader->event_id, pheader->data_size);
79 }
80
81 ser[id] = pheader->serial_number;
82}
83
84/*------------------------------------------------------------------*/
85
86int main()
87{
88 INT start_time, stop_time;
89 double rate;
90 BUFFER_HEADER buffer_header;
91 INT status, size, trans, run_number;
92 char host_name[256], str[32];
93 INT event_id, request_id;
96
97 /* get parameters */
98
99 printf("ID of event to request: ");
100 ss_gets(str, 32);
101 event_id = atoi(str);
102
103 printf("Host to connect: ");
104 ss_gets(host_name, 256);
105
106 printf("Get all events (0/1): ");
107 ss_gets(str, 32);
108 all_flag = atoi(str);
109
110 printf("Receive via callback ([y]/n): ");
111 ss_gets(str, 32);
112 via_callback = str[0] != 'n';
113
114 /* connect to experiment */
116 all_flag ? "Power Consumer" : "Consumer", NULL);
117 if (status != CM_SUCCESS)
118 return 1;
119
120 /* open the "system" buffer, 1M size */
122
123 /* set the buffer cache size */
124 bm_set_cache_size(hBufEvent, 100000, 0);
125
126 /* place a request for a specific event id */
128 all_flag ? GET_ALL : GET_NONBLOCKING, &request_id,
130
131 /* place a request for system messages */
133
134 /* place a request for transition notification */
136
137 last_time = 0;
138 start_time = 0;
140
141 do {
142 if (via_callback)
143 status = cm_yield(1000);
144 else {
145 /* receive event "manually" and call receive_event */
146 size = sizeof(event_buffer);
148 if (status == BM_SUCCESS)
150 (void *) (((EVENT_HEADER *) event_buffer) + 1));
151
152 /* receive transitions "manually" */
155
156 /* call yield once every 100 ms */
157 if (ss_millitime() - last_time > 100) {
159 status = cm_yield(0);
160 }
161 }
162
163 /* calculate rates each second */
164 if (ss_millitime() - start_time > 1000) {
166 rate = event_byte_count / 1024.0 / 1024.0 / ((stop_time - start_time) / 1000.0);
167
168 /* get information about filling level of the buffer */
169 bm_get_buffer_info(hBufEvent, &buffer_header);
170 size = buffer_header.read_pointer - buffer_header.write_pointer;
171 if (size <= 0)
172 size += buffer_header.size;
173 printf("Level: %5.1lf %%, ", 100 - 100.0 * size / buffer_header.size);
174
175 printf("Rate: %1.2lf MB/sec, ser mismatches: %d\n", rate, count_mismatches);
176 start_time = stop_time;
178 }
179
180 } while (status != RPC_SHUTDOWN && status != SS_ABORT);
181
183
184 return 1;
185}
#define MAX_EVENT_SIZE
Definition consume.cxx:17
INT count_mismatches
Definition consume.cxx:22
INT transition(INT run_number, char *error)
Definition consume.cxx:35
INT all_flag
Definition consume.cxx:19
void process_event(HNDLE hBuf, HNDLE request_id, EVENT_HEADER *pheader, void *pevent)
Definition consume.cxx:43
char event_buffer[MAX_EVENT_SIZE]
Definition consume.cxx:23
INT event_byte_count
Definition consume.cxx:21
INT hBufEvent
Definition consume.cxx:20
void process_message(HNDLE hBuf, HNDLE id, EVENT_HEADER *pheader, void *message)
Definition consume.cxx:27
int main()
Definition consume.cxx:86
INT bm_open_buffer(const char *buffer_name, INT buffer_size, INT *buffer_handle)
Definition midas.cxx:6717
INT bm_request_event(HNDLE buffer_handle, short int event_id, short int trigger_mask, INT sampling_type, HNDLE *request_id, EVENT_HANDLER *func)
Definition midas.cxx:8465
INT bm_set_cache_size(INT buffer_handle, size_t read_size, size_t write_size)
Definition midas.cxx:8140
INT bm_receive_event(INT buffer_handle, void *destination, INT *buf_size, int timeout_msec)
Definition midas.cxx:10650
INT cm_register_transition(INT transition, INT(*func)(INT, char *), INT sequence_number)
Definition midas.cxx:3593
INT cm_yield(INT millisec)
Definition midas.cxx:5642
INT cm_connect_experiment(const char *host_name, const char *exp_name, const char *client_name, void(*func)(char *))
Definition midas.cxx:2278
INT cm_disconnect_experiment(void)
Definition midas.cxx:2846
#define CM_SUCCESS
Definition midas.h:582
#define BM_SUCCESS
Definition midas.h:605
#define SS_ABORT
Definition midas.h:677
#define RPC_SHUTDOWN
Definition midas.h:707
unsigned short int WORD
Definition mcstd.h:49
unsigned int DWORD
Definition mcstd.h:51
#define GET_NONBLOCKING
Definition midas.h:322
#define GET_ALL
Definition midas.h:321
#define TRIGGER_ALL
Definition midas.h:538
#define TR_START
Definition midas.h:405
#define BM_NO_WAIT
Definition midas.h:366
#define MERROR
Definition midas.h:559
DWORD ss_millitime()
Definition system.cxx:3393
INT ss_sleep(INT millisec)
Definition system.cxx:3628
char * ss_gets(char *string, int size)
Definition system.cxx:7770
INT cm_msg_register(EVENT_HANDLER *func)
Definition midas.cxx:1051
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
Definition midas.cxx:915
int cm_query_transition(int *transition, int *run_number, int *trans_time)
Definition midas.cxx:14120
INT run_number[2]
Definition mana.cxx:246
DWORD last_time
Definition mana.cxx:3070
char host_name[HOST_NAME_LENGTH]
Definition mana.cxx:242
BOOL via_callback
Definition mdump.cxx:31
DWORD stop_time
Definition mevb.cxx:55
INT bm_get_buffer_info(INT buffer_handle, BUFFER_HEADER *buffer_header)
Definition midas.cxx:7791
INT HNDLE
Definition midas.h:132
DWORD BOOL
Definition midas.h:105
int INT
Definition midas.h:129
#define message(type, str)
#define event_id
HNDLE hBuf
Definition minife.c:23
char str[256]
Definition odbhist.cxx:33
DWORD status
Definition odbhist.cxx:39
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
Definition rmidas.h:24
INT write_pointer
Definition midas.h:963
INT read_pointer
Definition midas.h:962
short int event_id
Definition midas.h:852
DWORD data_size
Definition midas.h:856
DWORD serial_number
Definition midas.h:854