Growler

Growler is a C++-based distributed object and event architecture. It is written in C++, and supports serialization of C++ objects as part of its Remote Method Invocation, Event Channels, and in its Interface Definition Language. Its primary application has been in support of interactive, distributed and collaborative visualization, computational steering, and concurrent visualization.


Development

Growler is distributed under the NASA Open Source Agreement (NOSA).
Copyright © 2008 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved.

Author:
Bryan Green bgreen@nas.nasa.gov
See the Source Forge projects page. SourceForge
  Logo

Growler was developed under the auspices of the Visualization Group at the NASA Advanced Supercomputing facility (NAS) at NASA Ames Research Center.


Download

Growler is in alpha release. The latest release is version 0.3.10 (releasenotes). Releases may be downloaded from SourceForge.net.


Documentation

Growler's documentation consists of a User's Guide (under construction) and a Reference Manual.


IDL example

Growler has an Interface Definition Language (IDL) for generating stub/skeletion code for distributed communications. Growler's IDL is one of its most unique features. The interface definition language for Growler is called PIDL: The Parsifal Interface Definition Language.
Here are some example PIDL files:
This eventchannel definition is used for distributing field data from a live fvGCM run:
%cinclude <lib/buffer.h>
%cinclude <lib/vector.h>
%cinclude <lib/array.h>
%cinclude <lib/utility.h>

enum { DataVectorPort = 10100 };

typedef lib::Array<uint32_t,3> dimarray;

struct MetaData {
    int32_t lat, lon;
    uint32_t nymd, nhms;
    uint32_t pdt;
    uint32_t nsteps;
    uint32_t stride;
    std::vector<std::pair<std::string,dimarray> > fields;
}

eventport DataVectorChannel
{
    metadata(MetaData mdat) state;
    datavec[16](lib::Vector<float> dv);
}
This is the cpumon.pidl specification used by NodeMon for distributing cpu statistics:
%import <nodemon/nodemon.pidl>
%cinclude <lib/vector.h>

/*
 * About /proc/stat:
 *
The very first  "cpu" line aggregates the  numbers in all  of the other "cpuN"
lines.  These numbers identify the amount of time the CPU has spent performing
different kinds of work.  Time units are in USER_HZ (typically hundredths of a
second).  The meanings of the columns are as follows, from left to right:

- user: normal processes executing in user mode
- nice: niced processes executing in user mode
- system: processes executing in kernel mode
- idle: twiddling thumbs
- iowait: waiting for I/O to complete
- irq: servicing interrupts
- softirq: servicing softirqs
*/

struct CPUData {
    uint32_t v[7]; // the seven columns
}

// CPUDataVector: array of cpu data rows from /proc/stat
typedef std::vector<CPUData> CPUDataVector;

typedef std::vector<uint32_t> CPUSetVector;
typedef std::vector<std::string> CPUSetNameVector;

eventport CPUMonChannel
{
    cpu_data(CPUDataVector) nonqueued;
    cpuset_data(CPUSetVector) state;
    cpuset_names(CPUSetNameVector) state;
}

port CPUMon : nodemon::NodeMonAgent
{
    CPUMonChannel_ptr getMonChannel(out uint32_t cpucount);
}


www.nas.nasa.gov/~bgreen