root/usr/src/cmd/sendmail/libsm/t-memstat.c
/*
 * Copyright (c) 2005-2007 Sendmail, Inc. and its suppliers.
 *      All rights reserved.
 *
 * By using this file, you agree to the terms and conditions set
 * forth in the LICENSE file which can be found at the top level of
 * the sendmail distribution.
 */

#include <sm/gen.h>
SM_IDSTR(id, "@(#)$Id: t-memstat.c,v 1.9 2007/03/14 21:41:09 ca Exp $")

#include <sm/misc.h>

/*
**  Simple test program for memstat
*/

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <strings.h>
#include <string.h>

extern char *optarg;
extern int optind;

void
usage(prg)
        char *prg;
{
        fprintf(stderr, "usage: %s [options]\n", prg);
        fprintf(stderr, "options:\n");
        fprintf(stderr, "-l n    loop n times\n");
        fprintf(stderr, "-m n    allocate n bytes per iteration\n");
        fprintf(stderr, "-r name use name as resource to query\n");
        fprintf(stderr, "-s n    sleep n seconds per iteration\n");
}

int
main(argc, argv)
        int argc;
        char **argv;
{
        int r, r2, i, l, slp, sz;
        long v;
        char *resource;

        l = 1;
        sz = slp = 0;
        resource = NULL;
        while ((r = getopt(argc, argv, "l:m:r:s:")) != -1)
        {
                switch ((char) r)
                {
                  case 'l':
                        l = strtol(optarg, NULL, 0);
                        break;

                  case 'm':
                        sz = strtol(optarg, NULL, 0);
                        break;

                  case 'r':
                        resource = strdup(optarg);
                        break;

                  case 's':
                        slp = strtol(optarg, NULL, 0);
                        break;

                  default:
                        usage(argv[0]);
                        exit(1);
                }
        }

        r = sm_memstat_open();
        r2 = -1;
        for (i = 0; i < l; i++)
        {
                char *mem;

                r2 = sm_memstat_get(resource, &v);
                if (slp > 0 && i + 1 < l && 0 == r)
                {
                        printf("open=%d, memstat=%d, %s=%ld\n", r, r2,
                                resource != NULL ? resource : "default-value",
                                v);
                        sleep(slp);
                        if (sz > 0)
                        {
                                /*
                                **  Just allocate some memory to test the
                                **  values that are returned.
                                **  Note: this is a memory leak, but that
                                **  doesn't matter here.
                                */

                                mem = malloc(sz);
                                if (NULL == mem)
                                        printf("malloc(%d) failed\n", sz);
                        }
                }
        }
        printf("open=%d, memstat=%d, %s=%ld\n", r, r2,
                resource != NULL ? resource : "default-value", v);
        r = sm_memstat_close();
        return r;
}