static void SignalReloadPMNS(void) { int sts; /* Reload PMNS if necessary. * Note: this will only stat() the base name i.e. ASCII pmns, * typically $PCP_VAR_DIR/pmns/root and not $PCP_VAR_DIR/pmns/root.bin . * This is considered a very low risk problem, as the binary * PMNS is always compiled from the ASCII version; * when one changes so should the other. * This caveat was allowed to make the code a lot simpler. */ if (__pmHasPMNSFileChanged(pmnsfile)) { __pmNotifyErr(LOG_INFO, "Reloading PMNS \"%s\"", (pmnsfile==PM_NS_DEFAULT)?"DEFAULT":pmnsfile); pmUnloadNameSpace(); sts = pmLoadASCIINameSpace(pmnsfile, dupok); if (sts < 0) { __pmNotifyErr(LOG_ERR, "pmLoadASCIINameSpace(%s, %d): %s\n", (pmnsfile == PM_NS_DEFAULT) ? "DEFAULT" : pmnsfile, dupok, pmErrStr(sts)); } } else { __pmNotifyErr(LOG_INFO, "PMNS file \"%s\" is unchanged", (pmnsfile == PM_NS_DEFAULT) ? "DEFAULT" : pmnsfile); } }
static void * func2(void *arg) { int sts; char *fn = "func2"; int i; char msgbuf[PM_MAXERRMSGLEN]; for (i = 0; i < ITER; i++) { pmUnloadNameSpace(); if ((sts = pmLoadNameSpace(PM_NS_DEFAULT)) < 0) { printf("%s: pmLoadNameSpace[%d]: %s\n", fn, i, pmErrStr_r(sts, msgbuf, PM_MAXERRMSGLEN)); exit(1); } } pthread_exit(NULL); }
static void * func2(void *arg) { int sts; char *fn = "func2"; char *p; FILE *f; pthread_barrier_wait(&barrier); /* iter 0 */ pthread_barrier_wait(&barrier); pthread_barrier_wait(&barrier); /* iter 1 */ pmUnloadNameSpace(); pthread_barrier_wait(&barrier); pthread_barrier_wait(&barrier); /* iter 2 */ if ((sts = pmLoadASCIINameSpace(pmnsfile, 1)) < 0) { printf("%s: pmLoadASCIINameSpace: [reload] %s\n", fn, pmErrStr(sts)); exit(1); } pthread_barrier_wait(&barrier); pthread_barrier_wait(&barrier); /* iter 3 */ pmUnloadNameSpace(); for (p = pmns; *p; p++) { if (*p == 'u') { *p++ = 'd'; *p++ = 'e'; *p++ = 'f'; *p++ = 'i'; *p++ = 'n'; *p++ = 'e'; break; } } if ((f = fopen(pmnsfile, "w")) == NULL) { printf("fopen: %s: failed: %s\n", pmnsfile, pmErrStr(-oserror())); exit(1); } if (fwrite(pmns, strlen(pmns), 1, f) != 1) { printf("fwrite: %s: failed: %s\n", pmnsfile, pmErrStr(-oserror())); exit(1); } fclose(f); if ((sts = pmLoadASCIINameSpace(pmnsfile, 1)) < 0) { printf("%s: pmLoadASCIINameSpace: [extra reload] %s\n", fn, pmErrStr(sts)); exit(1); } pthread_barrier_wait(&barrier); pthread_barrier_wait(&barrier); /* iter 4 */ pthread_barrier_wait(&barrier); pthread_barrier_wait(&barrier); pthread_exit(NULL); }
int main(int argc, char **argv) { int c; int sts; char *endnum; iflag = isatty(0); while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) { switch (c) { case 'D': /* debug flag */ sts = __pmParseDebug(opts.optarg); if (sts < 0) { fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n", pmProgname, opts.optarg); opts.errors++; } else pmDebug |= sts; break; case 'e': /* echo input */ eflag++; break; case 'f': /* skip .dbpmdarc processing */ fflag++; break; case 'i': /* be interactive */ iflag = 1; break; case 'n': /* alternative name space file */ pmnsfile = opts.optarg; break; case 'q': sts = (int)strtol(opts.optarg, &endnum, 10); if (*endnum != '\0' || sts <= 0.0) { pmprintf("%s: -q requires a positive numeric argument\n", pmProgname); opts.errors++; } else { _creds_timeout = sts; } break; case 'U': /* run under alternate user account */ __pmSetProcessIdentity(opts.optarg); break; default: case '?': opts.errors++; break; } } if ((c = argc - opts.optind) > 0) { if (c > 1) opts.errors++; else { /* pid was specified */ if (primary) { pmprintf("%s: you may not specify both -P and a pid\n", pmProgname); opts.errors++; } else { pid = (int)strtol(argv[opts.optind], &endnum, 10); if (*endnum != '\0') { pmprintf("%s: pid must be a numeric process id\n", pmProgname); opts.errors++; } } } } if (opts.errors) { pmUsageMessage(&opts); exit(1); } if (pmnsfile == PM_NS_DEFAULT) { if ((sts = pmLoadNameSpace(pmnsfile)) < 0) { fprintf(stderr, "%s: Cannot load default namespace: %s\n", pmProgname, pmErrStr(sts)); exit(1); } } else { if ((sts = pmLoadASCIINameSpace(pmnsfile, 1)) < 0) { fprintf(stderr, "%s: Cannot load namespace from \"%s\": %s\n", pmProgname, pmnsfile, pmErrStr(sts)); exit(1); } } /* initialize the "fake context" ... */ setup_context(); setlinebuf(stdout); setlinebuf(stderr); #ifdef HAVE_ATEXIT atexit(cleanup); #endif for ( ; ; ) { initmetriclist(); yyparse(); if (yywrap()) { if (iflag) putchar('\n'); break; } __pmSetInternalState(PM_STATE_PMCS); switch (stmt_type) { case OPEN: profile_changed = 1; break; case CLOSE: switch (connmode) { case CONN_DSO: closedso(); break; case CONN_DAEMON: closepmda(); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } connmode = NO_CONN; break; case DESC: switch (connmode) { case CONN_DSO: dodso(PDU_DESC_REQ); break; case CONN_DAEMON: dopmda(PDU_DESC_REQ); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case FETCH: switch (connmode) { case CONN_DSO: dodso(PDU_FETCH); break; case CONN_DAEMON: dopmda(PDU_FETCH); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case INSTANCE: switch (connmode) { case CONN_DSO: dodso(PDU_INSTANCE_REQ); break; case CONN_DAEMON: dopmda(PDU_INSTANCE_REQ); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case STORE: switch (connmode) { case CONN_DSO: dodso(PDU_RESULT); break; case CONN_DAEMON: dopmda(PDU_RESULT); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case HELP: dohelp(param.number, param.pmid); break; case WATCH: break; case DBG: pmDebug = param.number; break; case QUIT: goto done; case STATUS: dostatus(); break; case INFO: switch (connmode) { case CONN_DSO: dodso(PDU_TEXT_REQ); break; case CONN_DAEMON: dopmda(PDU_TEXT_REQ); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case NAMESPACE: if (cmd_namespace != NULL) free(cmd_namespace); cmd_namespace = strdup(param.name); if (cmd_namespace == NULL) { fprintf(stderr, "%s: No memory for new namespace\n", pmProgname); exit(1); } pmUnloadNameSpace(); strcpy(cmd_namespace, param.name); if ((sts = pmLoadASCIINameSpace(cmd_namespace, 1)) < 0) { fprintf(stderr, "%s: Cannot load namespace from \"%s\": %s\n", pmProgname, cmd_namespace, pmErrStr(sts)); pmUnloadNameSpace(); if (pmnsfile == PM_NS_DEFAULT) { fprintf(stderr, "%s: Reload default namespace\n", pmProgname); if ((sts = pmLoadNameSpace(pmnsfile)) < 0) { fprintf(stderr, "%s: Cannot load default namespace: %s\n", pmProgname, pmErrStr(sts)); exit(1); } } else { fprintf(stderr, "%s: Reload namespace from \"%s\"\n", pmProgname, pmnsfile); if ((sts = pmLoadASCIINameSpace(pmnsfile, 1)) < 0) { fprintf(stderr, "%s: Cannot load namespace from \"%s\"" ": %s\n", pmProgname, pmnsfile, pmErrStr(sts)); exit(1); } } } break; case EOL: break; case PMNS_NAME: switch (connmode) { case CONN_DSO: dodso(PDU_PMNS_IDS); break; case CONN_DAEMON: dopmda(PDU_PMNS_IDS); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case PMNS_PMID: switch (connmode) { case CONN_DSO: dodso(PDU_PMNS_NAMES); break; case CONN_DAEMON: dopmda(PDU_PMNS_NAMES); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case PMNS_CHILDREN: switch (connmode) { case CONN_DSO: dodso(PDU_PMNS_CHILD); break; case CONN_DAEMON: dopmda(PDU_PMNS_CHILD); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case PMNS_TRAVERSE: switch (connmode) { case CONN_DSO: dodso(PDU_PMNS_TRAVERSE); break; case CONN_DAEMON: dopmda(PDU_PMNS_TRAVERSE); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case ATTR: switch (connmode) { case CONN_DSO: dodso(PDU_AUTH); break; case CONN_DAEMON: dopmda(PDU_AUTH); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; default: printf("Unexpected result (%d) from parser?\n", stmt_type); break; } __pmSetInternalState(PM_STATE_APPL); } done: cleanup(); exit(0); }