summaryrefslogtreecommitdiff
path: root/qa/src/ipc.c
diff options
context:
space:
mode:
Diffstat (limited to 'qa/src/ipc.c')
-rw-r--r--qa/src/ipc.c303
1 files changed, 303 insertions, 0 deletions
diff --git a/qa/src/ipc.c b/qa/src/ipc.c
new file mode 100644
index 0000000..de67b88
--- /dev/null
+++ b/qa/src/ipc.c
@@ -0,0 +1,303 @@
+/*
+ * Copyright (c) 1995-2002 Silicon Graphics, Inc. All Rights Reserved.
+ */
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/sem.h>
+
+#include <pcp/pmapi.h>
+#include <pcp/impl.h>
+
+#define SEMAPHORES /* comment this to NOT test semaphores */
+
+#define IPC_N 4
+#define NSEMS 8
+
+int shm_list[IPC_N], shm_n=0, shmindom;
+int sem_list[IPC_N * NSEMS], sem_n=0, semindom;
+int semset_list[IPC_N], semset_n = 0, semsetindom;
+
+static char *metrics[] = {
+ "ipc.shm.nattch",
+ "ipc.shm.segsz",
+#ifdef SEMAPHORES
+ "ipc.sem.nsems",
+ "ipc.sem.ncnt",
+ "ipc.sem.zcnt",
+#endif
+NULL };
+
+static int npmids;
+static pmID pmids[sizeof(metrics) / sizeof(metrics[0])];
+
+static void
+_force_err_noprofile(pmInDom indom, pmID pmid)
+{
+ pmResult *result;
+ int sts;
+
+ pmAddProfile(indom, 0, NULL);
+ sts = pmFetch(1, &pmid, &result);
+ fprintf(stderr, "\n\ndeliberate error check (no explicit profile) : %s\n", pmErrStr(sts));
+ __pmDumpResult(stderr, result);
+ pmFreeResult(result);
+}
+
+static void
+_force_err_unknown_inst(pmInDom indom, pmID pmid)
+{
+ pmResult *result;
+ int sts;
+ int i;
+
+ pmDelProfile(indom, 0, NULL);
+ i = -3;
+ pmAddProfile(indom, 1, &i);
+ sts = pmFetch(1, &pmid, &result);
+ fprintf(stderr, "\n\ndeliberate error check (1 unknown instance) : %s\n", pmErrStr(sts));
+ __pmDumpResult(stderr, result);
+ pmFreeResult(result);
+}
+
+static void
+_force_err_unknown_and_known_inst(pmInDom indom, int inst, pmID pmid)
+{
+ pmResult *result;
+ int sts;
+ int i;
+
+ pmDelProfile(indom, 0, NULL);
+ i = -3; pmAddProfile(indom, 1, &i);
+ pmAddProfile(indom, 1, &inst);
+ sts = pmFetch(1, &pmid, &result);
+ fprintf(stderr, "\n\ndeliberate error check (1 unknown instance + 1 known) : %s\n", pmErrStr(sts));
+ __pmDumpResult(stderr, result);
+ pmFreeResult(result);
+}
+
+static void
+_force_err(pmInDom indom, int inst, pmID pmid)
+{
+ _force_err_noprofile(indom, pmid);
+ _force_err_unknown_inst(indom, pmid);
+ _force_err_unknown_and_known_inst(indom, inst, pmid);
+}
+
+int
+main(int argc, char **argv)
+{
+ int c;
+ int i;
+ int j;
+ key_t key;
+ int sts;
+ char *p;
+ int errflag = 0;
+ char *host = "localhost";
+ char *namespace = PM_NS_DEFAULT;
+ int iterations = 1;
+ int iter;
+ pmResult *result;
+ pmDesc desc;
+ int id;
+ int e;
+#ifdef PCP_DEBUG
+ static char *debug = "[-D N] ";
+#else
+ static char *debug = "";
+#endif
+ static char *usage = "[-h hostname] [-n namespace] [-i iterations]";
+ extern char *optarg;
+ extern int optind;
+ extern int pmDebug;
+
+ /* trim command name of leading directory components */
+ pmProgname = argv[0];
+ for (p = pmProgname; *p; p++) {
+ if (*p == '/')
+ pmProgname = p+1;
+ }
+
+ while ((c = getopt(argc, argv, "D:h:l:n:i:")) != EOF) {
+ switch (c) {
+
+#ifdef PCP_DEBUG
+ case 'D': /* debug flag */
+ sts = __pmParseDebug(optarg);
+ if (sts < 0) {
+ fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n",
+ pmProgname, optarg);
+ errflag++;
+ }
+ else
+ pmDebug |= sts;
+ break;
+#endif
+
+ case 'h': /* hostname for PMCD to contact */
+ host = optarg;
+ break;
+
+ case 'i': /* iterations */
+ iterations = atoi(optarg);
+ break;
+
+ case 'n': /* alternative name space file */
+ namespace = optarg;
+ break;
+
+ case '?':
+ default:
+ errflag++;
+ break;
+ }
+ }
+
+ if (errflag) {
+USAGE:
+ fprintf(stderr, "Usage: %s %s%s\n", pmProgname, debug, usage);
+ exit(1);
+ }
+
+ if ((sts = pmLoadNameSpace(namespace)) < 0) {
+ printf("%s: Cannot load namespace from \"%s\": %s\n", pmProgname, namespace, pmErrStr(sts));
+ exit(1);
+ }
+
+ sts = pmNewContext(PM_CONTEXT_HOST, host);
+
+ if (sts < 0) {
+ printf("%s: Cannot connect to PMCD on host \"%s\": %s\n", pmProgname, host, pmErrStr(sts));
+ exit(1);
+ }
+
+ /* non-flag args are argv[optind] ... argv[argc-1] */
+ if (optind > argc)
+ goto USAGE;
+
+ memset(pmids, 0, sizeof(pmids));
+ for (npmids=0; metrics[npmids]; npmids++) {
+ if ((sts = pmLookupName(1, &metrics[npmids], &pmids[npmids])) < 0) {
+ fprintf(stderr, "%s: metric ``%s'' : %s\n", pmProgname, metrics[npmids], pmErrStr(sts));
+ exit(1);
+ }
+ fprintf(stderr, "pmid=%s <%s>\n", pmIDStr(pmids[npmids]), metrics[npmids]);
+ }
+
+ if ((e = pmLookupDesc(pmids[0], &desc)) < 0) {
+ printf("pmLookupDesc: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ shmindom = desc.indom;
+
+#ifdef SEMAPHORES
+ if ((e = pmLookupDesc(pmids[2], &desc)) < 0) {
+ printf("pmLookupDesc: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ semsetindom = desc.indom;
+ if ((e = pmLookupDesc(pmids[3], &desc)) < 0) {
+ printf("pmLookupDesc: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ semindom = desc.indom;
+#endif
+
+ fprintf(stderr, "shmindom=%s", pmInDomStr(shmindom));
+#ifdef SEMAPHORES
+ fprintf(stderr, " semsetindom=%s", pmInDomStr(semsetindom));
+ fprintf(stderr, " semindom=%s", pmInDomStr(semindom));
+#endif
+ fputc('\n', stderr);
+
+ key = (key_t)0xabcd0000;
+ for (i=0; i < IPC_N; i++) {
+ if ((id = shmget(key++, 4096, IPC_CREAT|IPC_EXCL|0777)) >= 0) {
+ shm_list[shm_n++] = id;
+ fprintf(stderr, "SHMID_%d\n", id);
+ }
+ else {
+ perror("shmget");
+ goto CLEANUP;
+ }
+
+#ifdef SEMAPHORES
+ if ((id = semget(key++, NSEMS, IPC_CREAT|IPC_EXCL|0777)) >= 0) {
+ semset_list[semset_n++] = id;
+ fprintf(stderr, "SEMSET_%d\n", id);
+ for (j=0; j < NSEMS; j++) {
+ sem_list[sem_n++] = (id << 16) | j;
+ fprintf(stderr, "SEMID_%d.%d ", id, j);
+ }
+ fputc('\n', stderr);
+ }
+ else {
+ perror("semget");
+ goto CLEANUP;
+ }
+#endif
+ }
+
+ pmDelProfile(shmindom, 0, NULL);
+ pmAddProfile(shmindom, shm_n, shm_list);
+
+#ifdef SEMAPHORES
+ pmDelProfile(semsetindom, 0, NULL);
+ pmAddProfile(semsetindom, semset_n, semset_list);
+ pmDelProfile(semindom, 0, NULL);
+ pmAddProfile(semindom, sem_n, sem_list);
+#endif
+
+ fprintf(stderr, "Single Metrics ...\n");
+ for (j = 0; j < npmids; j++) {
+ sts = pmFetch(1, &pmids[j], &result);
+ if (sts < 0) {
+ fprintf(stderr, "%s: metric %s : %s\n", pmProgname, metrics[j], pmErrStr(sts));
+ exit(1);
+ }
+ __pmDumpResult(stderr, result);
+ pmFreeResult(result);
+ }
+
+ fprintf(stderr, "Cascading Sets of Metrics ...\n");
+ for (iter=0; iter < iterations; iter++) {
+ fprintf(stderr, "Iteration: %d\n", iter);
+ for (j = 0; j < npmids; j++) {
+ sts = pmFetch(j+1, pmids, &result);
+ if (sts < 0) {
+ fprintf(stderr, "%s: iteration %d cascade %d : %s\n",
+ pmProgname, iter, j, pmErrStr(sts));
+ exit(1);
+ }
+ __pmDumpResult(stderr, result);
+ pmFreeResult(result);
+ }
+ }
+
+
+ /* now test the err conditions */
+ _force_err(shmindom, shm_list[0], pmids[0]);
+
+#ifdef SEMAPHORES
+ _force_err(semsetindom, semset_list[0], pmids[2]);
+ _force_err(semindom, sem_list[0], pmids[3]);
+#endif
+
+CLEANUP:
+ for (i=0; i < shm_n; i++) {
+ if (shm_list[i] >= 0)
+ if (shmctl(shm_list[i], IPC_RMID, 0) < 0)
+ perror("shmctl(IPC_RMID)");
+ }
+#ifdef SEMAPHORES
+ for (i=0; i < sem_n; i += NSEMS) {
+ if (sem_list[i] >= 0)
+ if (semctl(sem_list[i] >> 16, 0, IPC_RMID) < 0)
+ perror("semctl(IPC_RMID)");
+ }
+#endif
+
+ exit(0);
+}