static void print_chains(struct pevent *pevent) { struct chain *chain = chains; int pid; for (; chain; chain = chain->next) { pid = chain->pid_list->pid; if (chain != chains) printf("\n"); if (compact) printf(" %%%3.2f <all pids> %30s #%d\n", get_percent(total_counts, chain->count), chain->func, chain->count); else printf(" %%%3.2f (%d) %s %30s #%d\n", get_percent(total_counts, chain->count), pid, pevent_data_comm_from_pid(pevent, pid), chain->func, chain->count); printf(START); if (chain->event) printf(TICK "*%s*\n", chain->func); else printf(TICK "%s\n", chain->func); print_parents(pevent, chain, 0); } }
/* * Parents of all terms in t's class */ void print_parents_of_term(FILE *f, egraph_t *egraph, eterm_t t) { class_t c; fputs("parents of ", f); print_eterm_name(f, t); fputs(":\n", f); c = egraph_term_class(egraph, t); print_parents(f, egraph_class_parents(egraph, c)); }
static void print_parents(struct pevent *pevent, struct chain *chain, int indent) { struct chain *parent = chain->parents; int x; if (single_chain(chain)) { dump_chain(pevent, chain, indent); return; } line_mask |= 1ULL << (indent); for (x = 0; parent; x++, parent = parent->sibling) { struct chain *save_parent; make_indent(indent + 1); printf("\n"); make_indent(indent + 1); printf("--%%%.2f-- %s # %d\n", get_percent(chain->count, parent->count), parent->func, parent->count); if (x == chain->nr_parents - 1) line_mask &= (1ULL << indent) - 1; if (single_chain(parent)) dump_chain(pevent, parent, indent + 1); else { save_parent = parent; while (parent && parent->parents && parent->nr_parents < 2 && parent->parents->count == parent->count) { print_single_parent(parent, indent + 1); parent = parent->parents; } if (parent) print_parents(pevent, parent, indent + 1); parent = save_parent; } } }
/* ----------------------------------------------------------- bus_config --- */ double RTcmix::bus_config(float p[], int n_args, double pp[]) { ErrCode err; int i, j, k, startchan, endchan; char *str, *instname, *busname; BusType type; BusSlot *bus_slot; char inbusses[80], outbusses[80]; // for verbose message if (n_args < 2) die("bus_config", "Wrong number of args."); bus_slot = new BusSlot; if (bus_slot == NULL) return -1.0; inbusses[0] = outbusses[0] = '\0'; Lock localLock(&bus_slot_lock); // This will unlock when going out of scope. /* do the old Minc casting rigamarole to get string pointers from a double */ str = DOUBLE_TO_STRING(pp[0]); instname = strdup(str); // Note: If we exit nonfatally, we have to free. for (i = 1; i < n_args; i++) { busname = DOUBLE_TO_STRING(pp[i]); err = parse_bus_name(busname, &type, &startchan, &endchan); if (err) goto error; switch (type) { case BUS_IN: if (bus_slot->in_count > 0) strcat(inbusses, ", "); strcat(inbusses, busname); if (bus_slot->auxin_count > 0) { die("bus_config", "Can't have 'in' and 'aux-in' buses in same bus_config."); } j = bus_slot->in_count; for (k = startchan; k <= endchan; k++) bus_slot->in[j++] = k; bus_slot->in_count += (endchan - startchan) + 1; /* Make sure max channel count set in rtsetparams can accommodate the highest input chan number in this bus config. */ if (endchan >= NCHANS) { die("bus_config", "You specified %d channels in rtsetparams,\n" "but this bus_config requires %d channels.", NCHANS, endchan + 1); } break; case BUS_OUT: if (bus_slot->out_count > 0) strcat(outbusses, ", "); strcat(outbusses, busname); if (bus_slot->auxout_count > 0) { die("bus_config", "Can't have 'out' and 'aux-out' buses in same bus_config."); } j = bus_slot->out_count; for (k = startchan; k <= endchan; k++) { bus_slot->out[j++] = k; pthread_mutex_lock(&out_in_use_lock); OutInUse[k] = YES; // DJT added pthread_mutex_unlock(&out_in_use_lock); } bus_slot->out_count += (endchan - startchan) + 1; /* Make sure max output chans set in rtsetparams can accommodate the highest output chan number in this bus config. */ if (endchan >= NCHANS) { die("bus_config", "You specified %d output channels in rtsetparams,\n" "but this bus_config requires %d channels.", NCHANS, endchan + 1); } break; case BUS_AUX_IN: if (bus_slot->auxin_count > 0) strcat(inbusses, ", "); strcat(inbusses, busname); if (bus_slot->in_count > 0) { die("bus_config", "Can't have 'in' and 'aux-in' buses in same bus_config."); } j = bus_slot->auxin_count; for (k = startchan; k <= endchan; k++) bus_slot->auxin[j++] = k; bus_slot->auxin_count += (endchan - startchan) + 1; break; case BUS_AUX_OUT: if (bus_slot->auxout_count > 0) strcat(outbusses, ", "); strcat(outbusses, busname); if (bus_slot->out_count > 0) { die("bus_config", "Can't have 'out' and 'aux-out' buses in same bus_config."); } j = bus_slot->auxout_count; for (k = startchan; k <= endchan; k++) { bus_slot->auxout[j++] = k; pthread_mutex_lock(&aux_out_in_use_lock); AuxOutInUse[k] = YES; pthread_mutex_unlock(&aux_out_in_use_lock); } bus_slot->auxout_count += (endchan - startchan) + 1; break; default: break; } } err = check_bus_inst_config(bus_slot, YES); if (!err) { err = insert_bus_slot(instname, bus_slot); } if (err) // BGG mm -- print an error, don't exit die("bus_config", "couldn't configure the busses"); // exit(1); /* This is probably what user wants? */ /* Make sure specified aux buses have buffers allocated. */ for (i = 0; i < bus_slot->auxin_count; i++) allocate_aux_buffer(bus_slot->auxin[i], RTBUFSAMPS); for (i = 0; i < bus_slot->auxout_count; i++) allocate_aux_buffer(bus_slot->auxout[i], RTBUFSAMPS); #ifdef PRINTALL print_children(); print_parents(); #endif create_play_order(); #ifdef PRINTPLAY print_play_order(); #endif #ifdef DEBUG err = print_inst_bus_config(); #endif rtcmix_advise("bus_config", "(%s) => %s => (%s)", inbusses, instname, outbusses); free(instname); return 0.0; error: free(instname); die("bus_config", "Cannot parse arguments."); return -1.0; }