static int read_distance_table(void) { int nd, len; char *line = NULL; size_t linelen = 0; int maxnode = numa_max_node() + 1; int *table = NULL; int err = -1; for (nd = 0;; nd++) { char fn[100]; FILE *dfh; sprintf(fn, "/sys/devices/system/node/node%d/distance", nd); dfh = fopen(fn, "r"); if (!dfh) { if (errno == ENOENT) err = 0; if (!err && nd<maxnode) continue; else break; } len = getdelim(&line, &linelen, '\n', dfh); fclose(dfh); if (len <= 0) break; if (!table) { table = calloc(maxnode * maxnode, sizeof(int)); if (!table) { errno = ENOMEM; break; } } parse_numbers(line, table + nd * maxnode); } free(line); if (err) { numa_warn(W_distance, "Cannot parse distance information in sysfs: %s", strerror(errno)); free(table); return err; } /* Update the global table pointer. Race window here with other threads, but in the worst case we leak one distance array one time, which is tolerable. This avoids a dependency on pthreads. */ if (distance_table) { free(table); return 0; } distance_numnodes = maxnode; distance_table = table; return 0; }
/* when we have new data in the entry above the sheet, we copy the data to the cells/registers this don't get called when it is clicked in, only when we hit return */ static void activate_sheet_entry(GtkWidget *widget, Register_Window *rw) { GtkSheet *sheet; // GtkEntry *sheet_entry; gint row, col; // gint justification=GTK_JUSTIFY_RIGHT; if(widget==NULL|| rw==NULL) { printf("Warning activate_sheet_entry(%x,%x)\n",(unsigned int)widget,(unsigned int)rw); return; } sheet=GTK_SHEET(rw->register_sheet); row=sheet->active_cell.row; col=sheet->active_cell.col; parse_numbers(GTK_WIDGET(sheet),sheet->active_cell.row,sheet->active_cell.col,rw); update_ascii(rw,row); }
/* Parses the whole DO REPEAT command specification. Returns success. */ static bool parse_specification (struct lexer *lexer, struct dictionary *dict, struct hmap *dummies) { struct dummy_var *first_dv = NULL; hmap_init (dummies); do { struct dummy_var *dv; const char *name; bool ok; /* Get a stand-in variable name and make sure it's unique. */ if (!lex_force_id (lexer)) goto error; name = lex_tokcstr (lexer); if (dict_lookup_var (dict, name)) msg (SW, _("Dummy variable name `%s' hides dictionary variable `%s'."), name, name); if (find_dummy_var (dummies, name, strlen (name))) { msg (SE, _("Dummy variable name `%s' is given twice."), name); goto error; } /* Make a new macro. */ dv = xmalloc (sizeof *dv); dv->name = xstrdup (name); dv->values = NULL; dv->n_values = 0; hmap_insert (dummies, &dv->hmap_node, hash_dummy (name, strlen (name))); /* Skip equals sign. */ lex_get (lexer); if (!lex_force_match (lexer, T_EQUALS)) goto error; /* Get the details of the variable's possible values. */ if (lex_token (lexer) == T_ID || lex_token (lexer) == T_ALL) ok = parse_ids (lexer, dict, dv); else if (lex_is_number (lexer)) ok = parse_numbers (lexer, dv); else if (lex_is_string (lexer)) ok = parse_strings (lexer, dv); else { lex_error (lexer, NULL); goto error; } if (!ok) goto error; assert (dv->n_values > 0); if (lex_token (lexer) != T_SLASH && lex_token (lexer) != T_ENDCMD) { lex_error (lexer, NULL); goto error; } /* If this is the first variable then it defines how many replacements there must be; otherwise enforce this number of replacements. */ if (first_dv == NULL) first_dv = dv; else if (first_dv->n_values != dv->n_values) { msg (SE, _("Dummy variable `%s' had %zu substitutions, so `%s' must " "also, but %zu were specified."), first_dv->name, first_dv->n_values, dv->name, dv->n_values); goto error; } lex_match (lexer, T_SLASH); } while (!lex_match (lexer, T_ENDCMD)); while (lex_match (lexer, T_ENDCMD)) continue; return true; error: destroy_dummies (dummies); return false; }