common/readdata.c
///////////////////////////////////////////////////////////////////////////////
// Filename: readdata.c
///////////////////////////////////////////////////////////////////////////////
// Purpose: for performance measurements: read the data generated by
// writedata(). The time used to read all the data is displayed.
///////////////////////////////////////////////////////////////////////////////
// History:
// ========
//
// Date Time Name Description
// -------- -------- -------- ------------------------------------------------
// 96/02/27 18:32:15 muellerg: created
//
///////////////////////////////////////////////////////////////////////////////
// Feature test switches ///////////////////////////// Feature test switches //
/* NONE */
// System headers /////////////////////////////////////////// System headers //
#include <stdlib.h>
// Local headers ///////////////////////////////////////////// Local headers //
#include "../common.h"
#include "readwritedata.h"
// Macros /////////////////////////////////////////////////////////// Macros //
/* NONE */
// File scope objects /////////////////////////////////// File scope objects //
/* NONE */
// External variables, functions, and classes ///////////// External objects //
/* NONE */
// Signal catching functions ///////////////////// Signal catching functions //
/* NONE */
// Structures, unions, and class definitions /////////////////// Definitions //
/* NONE */
// Functions and class implementation /// Functions and class implementation //
/*
* readdata(): read the data generated by writedata() and writes out how
* long it took to read all the data
* the function needs a descriptor to read from, so it is
* only usable for IPC facilities which allow reading and writing
* data to descriptors.
*
* in: name: base name for logfile(s)
* ext: extension (e.g. "read" or "write")
* fd: descriptor to read from
* pid: process to synchronize with (if 0, no synchronization is done,
* e.g. if processes run on different computers...)
* to use these facility the caller has to install a special
* signal handler with synchronization_init();
*
* returns: true if everything is ok, else false
*
*/
bool
readdata(char *name, char *ext, int fd, pid_t pid)
{
char *buffer=new char[size_max];
if(!buffer) return false;
measurement mes(name, ext, measurement_max);
int i, size;
for(size=1; size <= size_max; size *= 2 )
{
if(pid)
{
// signal other process that we are ready to read
synchronization_signal_parent(pid);
// and wait for acknowledgment
synchronization_wait();
}
// start timer
mes.start(size, how_often);
for(i=0; i < how_often; i++)
{
readn(fd, buffer, size);
}
// store data about measurement
mes.end();
}
mes.writeout_logfile();
mes.writeout_plain_logfile();
delete[] buffer;
return true;
}
// Main /////////////////////////////////////////////////////////////// Main //
/* NONE */