performance/shared.c
///////////////////////////////////////////////////////////////////////////////
// Filename: shared.c
///////////////////////////////////////////////////////////////////////////////
// Purpose: measure how long it takes to add/remove a shared memory segment
///////////////////////////////////////////////////////////////////////////////
// History:
// ========
//
// Date     Time     Name      Description   
// -------- -------- --------  ------------------------------------------------
// 96/02/29 07:17:38 muellerg: created
//
///////////////////////////////////////////////////////////////////////////////
// Feature test switches ///////////////////////////// Feature test switches //
    /* NONE */
// System headers /////////////////////////////////////////// System headers //
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
// Local headers ///////////////////////////////////////////// Local headers //
#include "../common.h"
// Macros /////////////////////////////////////////////////////////// Macros //
    /* NONE */
// File scope objects /////////////////////////////////// File scope objects //
const int NUMBER_REPEAT = 10000;// how often for measurements
const int measurement_max = 64; // how many measurements do we want to do?
                                // 16 should be enough....
const int SHM_SIZE = 100000;    // shared memory size for getting number of
                                // available shared memory segments
const int SHM_MODE = (SHM_R | SHM_W);       // user read/write
// 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 //
    /* NONE */
// Main /////////////////////////////////////////////////////////////// Main //
int
main(int argc, char *argv[])
{
    error.set_program_name(argv[0]);    
    int i;
    // do some performance measurements
    cout << "Measuring how long it takes to create, attach, detach and\n"
         << "destroy a shared memory region (buffersize = how big is region " 
         << "in bytes)" << endl << endl;
    measurement mes(argv[0], "mes", measurement_max);
    int size;
    int shmid;  
    char *shmptr;
#ifndef SHMMAX
#define SHMMAX 2000000
#endif
    for(size=1024; size <= SHMMAX; size*=2 )
    {
        // start timer
        mes.start(size, NUMBER_REPEAT);
        for(i=0; i < NUMBER_REPEAT; i++)
        {
            // get shared memory 
            if ((shmid = shmget(IPC_PRIVATE, size, SHM_MODE)) == -1)
                error.system("shmget error");
            if ((shmptr = (char *)shmat(shmid, 0, 0)) == (char *)-1)
                error.system("shmat error");
            
            // destry shared memory
            if (shmdt(shmptr) == -1)
                error.system("shmdt error");
        
            if (shmctl(shmid, IPC_RMID, 0) == -1)
                error.system("shmctl error");
        }
        // store data about measurement
        mes.end();
    }
    mes.writeout_logfile(false, true, true);// use cout to display results
    mes.writeout_plain_logfile(false, true);// and write gnuplot result file
    return(EXIT_SUCCESS);
}