void print_all_rw(lockgroup_info_t *lockgroup) { unsigned int i; for (i = 0;i < count;i++) print_rw(i, lockgroup); printf("\n"); }
int main(int argc, char **argv) { kern_return_t kr; int arg2; unsigned int i; int found; setlinebuf(stdout); pgmname = argv[0]; gDebug = (NULL != strstr(argv[0], "debug")); host_control = mach_host_self(); kr = host_lockgroup_info(host_control, &lockgroup_info, &count); if (kr != KERN_SUCCESS) { mach_error("host_statistics", kr); exit (EXIT_FAILURE); } if (gDebug) { printf("count = %d\n", count); for (i = 0; i < count; i++) { printf("%s\n",lockgroup_info[i].lockgroup_name); } } switch (argc) { case 2: if (strcmp(argv[1], "all") == 0) { print_spin_hdr(); print_all_spin(lockgroup_info); print_mutex_hdr(); print_all_mutex(lockgroup_info); print_rw_hdr(); print_all_rw(lockgroup_info); } else if (strcmp(argv[1], "spin") == 0) { print_spin_hdr(); print_all_spin(lockgroup_info); } else if (strcmp(argv[1], "mutex") == 0) { print_mutex_hdr(); print_all_mutex(lockgroup_info); } else if (strcmp(argv[1], "rw") == 0) { print_rw_hdr(); print_all_rw(lockgroup_info); } else { found = 0; for (i = 0;i < count;i++) { if (strcmp(argv[1], lockgroup_info[i].lockgroup_name) == 0) { found = 1; print_spin_hdr(); print_spin(i, lockgroup_info); print_mutex_hdr(); print_mutex(i, lockgroup_info); print_rw_hdr(); print_rw(i, lockgroup_info); break; } } if (found == 0) { usage(); } } break; case 3: if (sscanf(argv[2], "%d", &arg2) != 1) { usage(); } if (arg2 < 0) { usage(); } prime_lockgroup_deltas(); if (strcmp(argv[1], "all") == 0) { while (1) { sleep(arg2); get_lockgroup_deltas(); print_spin_hdr(); print_all_spin(lockgroup_deltas); print_mutex_hdr(); print_all_mutex(lockgroup_deltas); print_rw_hdr(); print_all_rw(lockgroup_deltas); } } else if (strcmp(argv[1], "spin") == 0) { while (1) { sleep(arg2); get_lockgroup_deltas(); print_spin_hdr(); print_all_spin(lockgroup_deltas); } } else if (strcmp(argv[1], "mutex") == 0) { while (1) { sleep(arg2); get_lockgroup_deltas(); print_mutex_hdr(); print_all_mutex(lockgroup_deltas); } } else if (strcmp(argv[1], "rw") == 0) { while (1) { sleep(arg2); get_lockgroup_deltas(); print_rw_hdr(); print_all_rw(lockgroup_deltas); } } else { found = 0; for (i = 0;i < count;i++) { if (strcmp(argv[1], lockgroup_info[i].lockgroup_name) == 0) { found = 1; while (1) { sleep(arg2); get_lockgroup_deltas(); print_spin_hdr(); print_spin(i, lockgroup_deltas); print_mutex_hdr(); print_mutex(i, lockgroup_deltas); print_rw_hdr(); print_rw(i, lockgroup_deltas); } } } if (found == 0) { usage(); } } break; case 4: if (strcmp(argv[3], "abs") != 0) { usage(); } if (sscanf(argv[2], "%d", &arg2) != 1) { usage(); } if (strcmp(argv[1], "all") == 0) { while (1) { print_spin_hdr(); print_all_spin(lockgroup_info); print_mutex_hdr(); print_all_mutex(lockgroup_info); print_rw_hdr(); print_all_rw(lockgroup_info); sleep(arg2); } } else if (strcmp(argv[1], "spin") == 0) { while (1) {print_all_spin(lockgroup_info); sleep(arg2); } } else if (strcmp(argv[1], "mutex") == 0) { print_mutex_hdr(); while (1) {print_all_mutex(lockgroup_info); sleep(arg2); } } else if (strcmp(argv[1], "rw") == 0) { print_rw_hdr(); while (1) {print_all_rw(lockgroup_info); sleep(arg2); } } else { found = 0; for (i = 0;i < count;i++) { if (strcmp(argv[1], lockgroup_info[i].lockgroup_name) == 0) { found = 1; while (1) { print_spin_hdr(); print_spin(i, lockgroup_info); print_mutex_hdr(); print_mutex(i, lockgroup_info); print_rw_hdr(); print_rw(i, lockgroup_info); sleep(arg2); } } } if (found == 0) { usage(); } } break; default: usage(); break; } exit(0); }
static void print_rwlist(void) { int ret; unsigned int numq, numa; const char *query[2]; char **answer; struct list_t *lhead, *llast, *ltmp, *lnext; /* the upsname is now required */ if (!upsname) { fatalx(EXIT_FAILURE, "Error: a UPS name must be specified (upsname[@hostname[:port]])"); } llast = lhead = NULL; query[0] = "RW"; query[1] = upsname; numq = 2; ret = upscli_list_start(ups, numq, query); if (ret < 0) { /* old upsd --> fall back on old LISTRW technique */ if (upscli_upserror(ups) == UPSCLI_ERR_UNKCOMMAND) { fatalx(EXIT_FAILURE, "Error: upsd is too old to support this query"); } fatalx(EXIT_FAILURE, "Error: %s", upscli_strerror(ups)); } ret = upscli_list_next(ups, numq, query, &numa, &answer); while (ret == 1) { /* RW <upsname> <varname> <value> */ if (numa < 4) { fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least 4)", numa); } /* sock this entry away for later */ ltmp = xmalloc(sizeof(struct list_t)); ltmp->name = xstrdup(answer[2]); ltmp->next = NULL; if (llast) { llast->next = ltmp; } else { lhead = ltmp; } llast = ltmp; ret = upscli_list_next(ups, numq, query, &numa, &answer); } /* use the list to get descriptions and types */ ltmp = lhead; while (ltmp) { lnext = ltmp->next; print_rw(ltmp->name); free(ltmp->name); free(ltmp); ltmp = lnext; } }