/alps/fwbench

To get this branch, use:
bzr branch http://darksoft.org/webbzr/alps/fwbench
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
1
#define _BSD_SOURCE
1 by Suren A. Chilingaryan
Initial release
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <string.h>
5
#include <errno.h>
6
#include <fcntl.h>
7
#include <glib.h>
8
#include <math.h>
9
#include <unistd.h>
10
#include <sys/stat.h>
11
#include <sys/time.h>
3 by Suren A. Chilingaryan
getopt support
12
#include <getopt.h>
13
#include <stdarg.h>
1 by Suren A. Chilingaryan
Initial release
14
15
#include <fastwriter.h>
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
16
17
#ifdef USE_UFO_GENERATOR
18
# include <ufo/ufo-graph.h>
19
#endif /* USE_UFO_GENERATOR */
1 by Suren A. Chilingaryan
Initial release
20
21
#include "config.h"
22
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
23
//#define USE_FIFO
1 by Suren A. Chilingaryan
Initial release
24
#define WRITE_INTERVAL 1
25
#define WRITE_SUMMARY 5
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
26
#define DELTA_TOLERANCE 5
1 by Suren A. Chilingaryan
Initial release
27
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
28
#ifdef USE_UFO_GENERATOR
29
# ifndef USE_FIFO
30
#  define USE_FIFO
31
# endif /* !USE_FIFO */
32
#endif /* USE_UFO_GENERATOR */
1 by Suren A. Chilingaryan
Initial release
33
34
const char *fifo_name = ".fifo";
35
36
struct setup_s {
37
    size_t width;
38
    size_t height;
39
    size_t bpp;
40
    size_t fps;
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
41
3 by Suren A. Chilingaryan
getopt support
42
    size_t fpf;
1 by Suren A. Chilingaryan
Initial release
43
    size_t iters;
3 by Suren A. Chilingaryan
getopt support
44
    double tolerance;
45
    const char *output;
46
    const char *fs;
47
    
48
    int verbose;
1 by Suren A. Chilingaryan
Initial release
49
50
    volatile int run_started;
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
51
52
    struct timeval tv_started;
53
    struct timeval tv_last_written;
54
55
    int broken_frame;
56
    unsigned long frames, lost;
57
    unsigned long last_frames, last_lost;
58
59
    size_t frame_size;
60
    size_t num_read;
61
    size_t buf_max;
62
    
63
    size_t writeouts;
64
    
65
    fastwriter_t *fw;
3 by Suren A. Chilingaryan
getopt support
66
    char *current_output;
1 by Suren A. Chilingaryan
Initial release
67
};
68
69
typedef struct setup_s setup_t;
70
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
71
3 by Suren A. Chilingaryan
getopt support
72
73
typedef enum {
74
    OPT_OUTPUT = 'o',
75
    OPT_BUFFER = 'b',
76
    OPT_SIZE = 's',
77
    OPT_TIME = 't',
78
    OPT_RATE = 'r',
79
    OPT_FRAMES = 'n',
80
    OPT_GEOMETRY = 'g',
81
    OPT_FPF = 'f',
82
    OPT_MISSING = 'm',
83
    OPT_QUIET = 'q',
84
    OPT_HELP = 'h'
85
} options_t;
86
87
88
void Usage(int argc,  char* const argv[], const char *format, ...) {
89
    if (format) {
90
	va_list ap;
91
    
92
	va_start(ap, format);
93
	printf("Error %i: ", errno);
94
	vprintf(format, ap);
95
	printf("\n");
96
	va_end(ap);
97
    
98
        printf("\n");
99
    }
100
101
    printf(
102
"Usage:\n"
103
" %s [options]\n"
104
"   -o <file|device>	- Output to file/device [/dev/null]\n"
105
"			use %%zu to replace with frame number\n"
106
"   -f <number>		- Number of frames per file [all]\n"
107
"   -b size		- Buffer Size (MB)\n"
108
"   -r rate		- Write rate (MB/s)\n"
109
"   -s size		- Total size of data to write (GB)\n"
110
"   -t run_time		- Run time (s)\n"
111
"   -n frames		- Number of frames to write\n"
112
"   -g <width>x<height>	- Geometry [1024]\n"
113
"   -g <pixels>		- Number of megapixels [0.7]\n"
4 by Suren A. Chilingaryan
Fix handling of size argument
114
"   -m <percent>	        - Tolerable missing frames  [100%%]\n"
3 by Suren A. Chilingaryan
getopt support
115
"   -q			- Quiete\n"
116
"   -h			- Help\n"
117
"\n\n",
118
argv[0]);
119
120
    exit(0);
121
}
122
123
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
124
#ifdef USE_UFO_GENERATOR
125
static void handle_error(GError *error) {
1 by Suren A. Chilingaryan
Initial release
126
    if (error != NULL) {
127
        g_print("%s\n", error->message); 
128
        g_error_free(error);
129
        exit(EXIT_FAILURE);
130
    }
131
}
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
132
#endif /* USE_UFO_GENERATOR */
133
3 by Suren A. Chilingaryan
getopt support
134
static void set_verbosity(setup_t *setup, int level) {
135
    setup->verbose = level;
136
}
137
138
static void set_current_output(setup_t *setup, size_t frame) {
139
    sprintf(setup->current_output, setup->output, frame);
140
}
141
142
static void set_output(setup_t *setup, const char *name) {
143
    setup->output = name;
144
    setup->fs = name;
145
    setup->current_output = malloc(strlen(setup->output) + 32);
146
    g_assert(setup->current_output);
147
    set_current_output(setup, 0);
148
}
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
149
150
static void set_dim(setup_t *setup, size_t width, size_t height) {
1 by Suren A. Chilingaryan
Initial release
151
    setup->bpp = sizeof(float);
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
152
    setup->width = width;
153
    setup->height = height;
154
155
    setup->frame_size = setup->width * setup->height * setup->bpp;
156
}
157
3 by Suren A. Chilingaryan
getopt support
158
static void set_pixels(setup_t *setup, size_t pixels) {
159
    int width = sqrt(4 * pixels / 3);
160
    set_dim(setup, width, width * 3 / 4);
161
}
162
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
163
static void set_speed(setup_t *setup, size_t speed) {
1 by Suren A. Chilingaryan
Initial release
164
    setup->fps = 1 + speed / setup->width / setup->height / setup->bpp;
165
}
166
3 by Suren A. Chilingaryan
getopt support
167
static void set_iters(setup_t *setup, size_t iters) {
168
    setup->iters = iters;
169
}
170
171
static void set_time(setup_t *setup, size_t run_time) {
172
    setup->iters = run_time * setup->fps;
173
}
174
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
175
static void set_size(setup_t *setup, size_t size) {
4 by Suren A. Chilingaryan
Fix handling of size argument
176
    setup->iters = size / setup->frame_size + ((size % setup->frame_size)?1:0);
3 by Suren A. Chilingaryan
getopt support
177
}
178
179
static void set_frames_per_file(setup_t *setup, size_t fpf) {
180
    setup->fpf = fpf;
181
}
182
183
static void set_fail_tolerance(setup_t *setup, double fail_rate) {
184
    setup->tolerance = fail_rate;
185
}
186
1 by Suren A. Chilingaryan
Initial release
187
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
188
static int callback(setup_t *s, size_t result, void *buffer);
189
1 by Suren A. Chilingaryan
Initial release
190
static void *run(setup_t *setup) {
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
191
#ifdef USE_UFO_GENERATOR
1 by Suren A. Chilingaryan
Initial release
192
    GError *error = NULL;
193
    UfoGraph *graph = NULL;
194
    /* If you want to use system-wide installed filters: 
195
     * graph = ufo_graph_new(); */
196
197
    graph = g_object_new(UFO_TYPE_GRAPH,
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
198
# ifdef METABALLS_PATH
1 by Suren A. Chilingaryan
Initial release
199
            "paths", METABALLS_PATH,
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
200
# endif /* METABALLS_PATH */
1 by Suren A. Chilingaryan
Initial release
201
            NULL);
202
203
//    printf("%lu %lu %lu %lu\n", setup->width, setup->height, setup->iters, setup->width * setup->height * setup->iters * sizeof(float));
204
    UfoFilter *metaballs = ufo_graph_get_filter(graph, "metaballs", &error);
205
    handle_error(error);
206
    g_object_set(G_OBJECT(metaballs),
207
            "width", setup->width,
208
            "height", setup->height,
209
            "num-balls", 1,
210
            "num-iterations", setup->iters,
211
            "frames-per-second", setup->fps,
212
            NULL);
213
214
    UfoFilter *writer = ufo_graph_get_filter(graph, "pipeoutput", &error);
215
    handle_error(error);
216
    g_object_set(G_OBJECT(writer),
217
            "pipe-name", fifo_name,
218
            NULL);
219
220
    ufo_filter_connect_to(metaballs, writer, &error);
221
    handle_error(error);
222
223
    setup->run_started = 1;
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
224
1 by Suren A. Chilingaryan
Initial release
225
    ufo_graph_run(graph, &error);
226
    handle_error(error);
3 by Suren A. Chilingaryan
getopt support
227
228
    g_thread_exit(NULL);
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
229
#else /* USE_UFO_GENERATOR */
230
    size_t i;
231
    struct timeval tv;
232
    size_t size = setup->width * setup->height * setup->bpp;
233
    char buffer[size];
234
    double interval = 1000000. / setup->fps, nextus;
235
    ssize_t tmp;
236
    size_t nexts;
237
238
    setup->run_started = 1;
239
240
#ifdef USE_FIFO
241
    int fd = open(fifo_name, O_WRONLY);
242
    g_assert(fd >= 0);
243
#endif /* USE_FIFO */
244
    gettimeofday(&tv, NULL); 
245
    nexts = tv.tv_sec;
246
    nextus = tv.tv_usec + interval;
247
    for (i = 0; i < setup->iters; i++) {
248
#ifdef USE_FIFO
249
	ssize_t res = write(fd, buffer, size);
250
	g_assert(res == size);
251
#else /* USE_FIFO */
252
	callback(setup, size, buffer);
253
#endif /* USE_FIFO */
254
255
	tmp = ((size_t)round(nextus)) / 1000000;
256
	nexts += tmp;
257
	nextus -= tmp * 1000000;
258
259
	gettimeofday(&tv, NULL);
260
	tmp = (nexts - tv.tv_sec)*1000000 + (nextus - tv.tv_usec);
261
	if (tmp > 10) usleep(tmp);
262
	
263
	nextus += interval;
264
    }
265
266
#ifdef USE_FIFO
267
    close(fd);
268
#endif /* USE_FIFO */
269
270
#endif /* USE_UFO_GENERATOR */
1 by Suren A. Chilingaryan
Initial release
271
272
    return NULL;
273
}
274
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
275
static int callback(setup_t *s, size_t result, void *buffer) {
276
    int err;
277
    struct timeval tv;
278
279
    fastwriter_t *fw = s->fw;
280
    fastwriter_stats_t stats;
281
282
    size_t duration, last_duration, expected;
283
    long delta;
284
3 by Suren A. Chilingaryan
getopt support
285
    gettimeofday(&tv, NULL);
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
286
287
    if (!s->broken_frame) {
288
	err = fastwriter_push(fw, result, buffer);
289
    	if (err) {
290
    	    if (err == EWOULDBLOCK) {
3 by Suren A. Chilingaryan
getopt support
291
    		if (!s->tolerance) {
292
    		    if (s->verbose >= 0) printf("Lost frame...\n");
293
    		    exit(1);
294
    		}
295
    		
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
296
		if (s->num_read) fastwriter_cancel(fw);
297
		s->broken_frame = 1;
298
    	    } else {
299
	    	if (err) printf("FastWriter returned error %i\n", err);
300
		g_assert(!err);
301
	    }
302
	}
303
    }
304
305
    s->num_read += result; 
306
307
    if (s->num_read < s->frame_size) return 0;
308
309
    s->num_read = 0;
310
311
    if (s->broken_frame) {
312
	s->lost++;
313
	s->broken_frame = 0;
314
    } else {
315
	err = fastwriter_commit(fw);
316
	s->frames++;
3 by Suren A. Chilingaryan
getopt support
317
318
	if ((s->fpf)&&((s->frames%s->fpf) == 0)) {
319
	    fastwriter_close(s->fw);
320
	    set_current_output(s, s->frames);
321
	    err = fastwriter_open(s->fw, s->current_output,  FASTWRITER_FLAGS_OVERWRITE);
322
	    if (err) {
323
		printf("FastWriter returned error %i\n", err);
324
		g_assert(!err);
325
	    }
326
327
	// reopen
328
    }
329
330
    }
331
    
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
332
    if (!s->tv_started.tv_sec) {
333
    	memcpy(&s->tv_started, &tv, sizeof(struct timeval));
334
    	if (s->tv_started.tv_usec >= (1000000 / s->fps)) 
335
    	    s->tv_started.tv_usec -= (1000000 / s->fps);
336
    	else {
337
    	    s->tv_started.tv_sec--;
338
    	    s->tv_started.tv_usec += 1000000 - (1000000 / s->fps);
339
    	}
340
    	memcpy(&s->tv_last_written, &s->tv_started, sizeof(struct timeval));
341
    }
342
343
    fastwriter_get_stats(fw, &stats);
344
    if (stats.buffer_used > s->buf_max) s->buf_max = stats.buffer_used;
345
346
    if ((tv.tv_sec - s->tv_last_written.tv_sec) >= WRITE_INTERVAL) {
3 by Suren A. Chilingaryan
getopt support
347
	if ((s->tolerance > 0)&&(s->tolerance < 100)) {
348
	    double lost = (100. * s->lost / (s->lost + s->frames));
349
	    double last_lost = (100. * (s->lost - s->last_lost) / (s->lost + s->frames - s->last_lost - s->last_frames));
350
	    if ((lost > s->tolerance)||(last_lost > s->tolerance)) {
351
		if (s->verbose >= 0)
352
		    printf("Lost %.2lf%% (%lu) frames, total: %.2lf%% (%lu)\n", last_lost, s->lost - s->last_lost, lost, s->lost);
353
		exit(1);
354
	    }
355
	}
356
	
357
	if (s->verbose >= 0) {
358
	    last_duration = (tv.tv_sec - s->tv_last_written.tv_sec) * 1000000 + (tv.tv_usec - s->tv_last_written.tv_usec);
359
	    printf("Lost  %6.2lf%% (% 8lu of % 8lu), %9.3lf GB at %8.3lf MB/s, buf:%6.2lf%%\n", 100.*(s->lost - s->last_lost) / (s->lost + s->frames - s->last_lost - s->last_frames), s->lost - s->last_lost, s->lost + s->frames - (s->last_lost + s->last_frames), 1. * s->frame_size * (s->frames - s->last_frames) / 1024 / 1024 / 1024, 1000000. * s->frame_size * (s->frames - s->last_frames) / last_duration / 1024 / 1024, 100.*s->buf_max/stats.buffer_size);
360
	}
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
361
362
	if (((++s->writeouts)%WRITE_SUMMARY)==0) {
363
	    duration = (tv.tv_sec - s->tv_started.tv_sec) * 1000000 + (tv.tv_usec - s->tv_started.tv_usec);
364
	    expected = (tv.tv_sec - s->tv_started.tv_sec) * s->fps + round(1.*(tv.tv_usec - s->tv_started.tv_usec)*s->fps/1000000);
365
	    delta = expected - s->lost - s->frames;
366
    	    if ((delta > DELTA_TOLERANCE)||(delta < -DELTA_TOLERANCE))
367
    		printf(" *** Unexpected frame rate: %.2lf (%lu), delta: %li (%lu, %lu)\n", 1000000. * (s->frames + s->lost) / duration, s->fps, delta, s->lost + s->frames, expected); 
368
    		
3 by Suren A. Chilingaryan
getopt support
369
    	    if (s->verbose >= 0) {
370
		printf("Total %6.2lf%% (% 8lu of % 8lu), %9.3lf GB at %8.3lf MB/s, buf:%6.2lf%%\n", 100. * s->lost / (s->lost + s->frames), s->lost, s->lost + s->frames, 1. * s->frames * s->frame_size / 1024 / 1024 / 1024, 1000000. * s->frames * s->frame_size / duration / 1024 / 1024,  100.*stats.buffer_max / stats.buffer_size);
371
	    }
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
372
	}
373
	
374
	s->buf_max = 0;
375
	memcpy(&s->tv_last_written, &tv, sizeof(struct timeval));
376
	s->last_frames = s->frames;
377
	s->last_lost = s->lost;
378
    }
379
    
380
    return 0;
381
}
1 by Suren A. Chilingaryan
Initial release
382
383
3 by Suren A. Chilingaryan
getopt support
384
int main(int argc, char* const argv[])
1 by Suren A. Chilingaryan
Initial release
385
{
386
    int err;
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
387
388
#ifdef USE_FIFO
1 by Suren A. Chilingaryan
Initial release
389
    GError *gerr;
390
    GThread *thr;
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
391
#endif /* USE_FIFO */
392
1 by Suren A. Chilingaryan
Initial release
393
    setup_t setup;
3 by Suren A. Chilingaryan
getopt support
394
395
    unsigned char c;
396
    const char *sptr;
1 by Suren A. Chilingaryan
Initial release
397
    const char *out = "/dev/null";
3 by Suren A. Chilingaryan
getopt support
398
    double mpix = 0;
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
399
    size_t width = 1024;
400
    size_t height = 768;
1 by Suren A. Chilingaryan
Initial release
401
    size_t speed = 850;
3 by Suren A. Chilingaryan
getopt support
402
    size_t size = 0;
403
    size_t run_time = 0;
404
    size_t iters = 0x7FFFFFFF;
405
    size_t fw_buffer = 0;
406
    double fail_rate = 100.;
407
    size_t fpf = 0;
408
    int quiet = 0;
409
    
1 by Suren A. Chilingaryan
Initial release
410
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
411
    fastwriter_stats_t stats;
412
413
    g_thread_init(NULL);
414
415
#ifdef USE_UFO_GENERATOR
1 by Suren A. Chilingaryan
Initial release
416
    g_type_init();
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
417
#endif /* USE_UFO_GENERATOR */
1 by Suren A. Chilingaryan
Initial release
418
3 by Suren A. Chilingaryan
getopt support
419
420
421
    while ((c = getopt(argc, argv, "hqo:s:t:r:n:g:f:m:b:")) != (unsigned char)-1) {
422
	switch (c) {
423
	 case OPT_OUTPUT:
424
	    out = optarg;
425
	    break;
426
	 case OPT_BUFFER:
427
            fw_buffer = atol(optarg);
428
	    break;
429
         case OPT_SIZE:
430
            size = atol(optarg);
431
	    break;
432
         case OPT_TIME:
433
            run_time = atol(optarg);
434
	    break;
435
         case OPT_FRAMES:
436
            iters = atol(optarg);
437
	    break;
438
         case OPT_RATE:
439
            speed = atoi(optarg);
440
            break;
441
         case OPT_GEOMETRY:
442
            sptr = strchr(optarg, 'x');
443
            if (sptr) {
444
        	width = atol(optarg);
445
        	height = atol(sptr + 1);
446
            } else {
447
        	mpix = atof(optarg);
448
            }
449
            break;
450
         case OPT_FPF:
451
            fpf = atol(optarg);
452
            break;
453
         case OPT_MISSING:
454
            fail_rate = atof(optarg);
455
            break;
456
        case OPT_QUIET:
457
    	    quiet = 1;
458
	    break;
459
         case OPT_HELP:
460
	    Usage(argc, argv, NULL);
461
     }
1 by Suren A. Chilingaryan
Initial release
462
    }
463
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
464
#ifdef USE_FIFO
1 by Suren A. Chilingaryan
Initial release
465
    unlink(fifo_name);
466
    g_assert(!mkfifo(fifo_name, S_IWUSR | S_IRUSR));
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
467
#endif /* USE_FIFO */
1 by Suren A. Chilingaryan
Initial release
468
3 by Suren A. Chilingaryan
getopt support
469
470
    memset(&setup, 0, sizeof(setup_t));
471
472
    if (quiet) set_verbosity(&setup, -1);
473
    set_output(&setup, out);
474
    
475
    if (mpix) set_pixels(&setup, mpix * 1000000);
476
    else set_dim(&setup, width, height);
477
478
    set_speed(&setup, speed * 1024 * 1024);
479
480
    if (size) set_size(&setup, size * 1024 * 1024 * 1024);
481
    else if (run_time) set_time(&setup, run_time);
482
    else set_iters(&setup, iters);
483
    
484
    set_fail_tolerance(&setup, fail_rate);
485
    set_frames_per_file(&setup, fpf);
486
487
488
    setup.fw = fastwriter_init(setup.fs, FASTWRITER_FLAGS_OVERWRITE);
489
    g_assert(setup.fw);
490
491
    if (fw_buffer) 
492
	fastwriter_set_buffer_size(setup.fw, fw_buffer * 1024 * 1024);
493
    else
494
	fastwriter_set_buffer_size(setup.fw, FASTWRITER_BUFFER_MAX);
495
    
496
    err = fastwriter_open(setup.fw, setup.current_output,  FASTWRITER_FLAGS_OVERWRITE);
1 by Suren A. Chilingaryan
Initial release
497
    if (err) printf("FastWriter returned error %i\n", err);
498
    g_assert(!err);
499
3 by Suren A. Chilingaryan
getopt support
500
501
    fastwriter_get_stats(setup.fw, &stats);
502
    if (!quiet)
503
	printf("*** Writing to %s, rate: %lu, data: %lu MB/s, buffer: %lu MB\n", out, setup.fps, speed, stats.buffer_size/1024/1024);
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
504
505
    void *buffer = malloc(setup.frame_size);
1 by Suren A. Chilingaryan
Initial release
506
    g_assert(buffer);
507
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
508
#ifdef USE_FIFO
1 by Suren A. Chilingaryan
Initial release
509
    thr = g_thread_create((GThreadFunc)run, &setup, 1, &gerr);
510
    g_assert(thr);
511
512
    while (!setup.run_started);
513
514
    int fd = open(fifo_name, O_RDONLY);
515
    g_assert(fd);
516
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
517
    ssize_t result = read(fd, buffer, setup.frame_size);
1 by Suren A. Chilingaryan
Initial release
518
519
    while (result > 0) {
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
520
	callback(&setup, result, buffer);
521
        result = read(fd, buffer, setup.frame_size - setup.num_read);
1 by Suren A. Chilingaryan
Initial release
522
    }
523
4 by Suren A. Chilingaryan
Fix handling of size argument
524
    if (!quiet)
525
	printf("Wrote %lu GB\n", setup.frame_size * setup.frames / 1024 / 1024 / 1024);
1 by Suren A. Chilingaryan
Initial release
526
527
    g_thread_join(thr);
528
529
    close(fd);
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
530
#else /* USE_FIFO */
531
    run(&setup);
532
#endif /* USE_FIFO */
1 by Suren A. Chilingaryan
Initial release
533
534
    free(buffer);
3 by Suren A. Chilingaryan
getopt support
535
    fastwriter_close(setup.fw);
536
    fastwriter_destroy(setup.fw);
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
537
538
#ifdef USE_FIFO
1 by Suren A. Chilingaryan
Initial release
539
    unlink(fifo_name);
2 by Suren A. Chilingaryan
Use local data generator until high-speed ufo simulator is provided
540
#endif /* USE_FIFO */
1 by Suren A. Chilingaryan
Initial release
541
542
    return 0;
543
}