void expand_symbol_table() { Pair *new_table, *bucket_ptr, cur_pair, next_pair; Psc cur_psc; size_t index, new_size, new_index; new_size = next_prime(symbol_table.size); new_table = (Pair *)mem_calloc(new_size, sizeof(void *),ATOM_SPACE); for (bucket_ptr = (Pair *)symbol_table.table, index = 0; index < symbol_table.size; bucket_ptr++, index++) for (cur_pair = *bucket_ptr; cur_pair != NULL; cur_pair = next_pair) { next_pair = pair_next(cur_pair); cur_psc = pair_psc(cur_pair); new_index = hash(get_name(cur_psc), get_arity(cur_psc), new_size); pair_next(cur_pair) = new_table[new_index]; new_table[new_index] = cur_pair; } mem_dealloc((void *)symbol_table.table,symbol_table.size,ATOM_SPACE); symbol_table.size = new_size; symbol_table.table = (void **)new_table; /*printf("expanded atom table to: %d\n",new_size);*/ }
/* * Create a PSC-PAIR record, set it to point to a PSC record, and place * it at the head of a PSC-PAIR record chain. */ static Pair make_psc_pair(Psc psc_ptr, Pair *link_ptr) { Pair new_pair; new_pair = (Pair)mem_alloc(sizeof(struct psc_pair)); pair_psc(new_pair) = psc_ptr; /* set 1st to point to psc_rec */ pair_next(new_pair) = *link_ptr; /* set 2nd to old head */ *link_ptr = new_pair; /* new symbol is in the head! */ return new_pair; }
/* * Create a PSC-PAIR record, set it to point to a PSC record, and place * it at the head of a PSC-PAIR record chain. */ static Pair make_psc_pair(Psc psc_ptr, Pair *link_ptr) { Pair new_pair; new_pair = (Pair)mem_alloc(sizeof(struct psc_pair),ATOM_SPACE); // printf("new_psc_pair %d, prev %d\n",(int)new_pair, (int)*link_ptr); pair_psc(new_pair) = psc_ptr; /* set 1st to point to psc_rec */ pair_next(new_pair) = *link_ptr; /* set 2nd to old head */ *link_ptr = new_pair; /* new symbol is in the head! */ return new_pair; }
void symbol_table_stats(CTXTdecl) { UInteger i, symbols, bucket_contains, used_buckets, unused_buckets, fullest_bucket_size, fullest_bucket_num, last_index; UInteger first_index; Pair pair_ptr; SYS_MUTEX_LOCK( MUTEX_SYMBOL ) ; symbols = used_buckets = unused_buckets = last_index = 0; fullest_bucket_size = fullest_bucket_num = 0; first_index = -1; for (i = 0; i < symbol_table.size; i++) { if (symbol_table.table[i] != NULL) { if (first_index == -1) first_index = i; last_index = i; used_buckets++; bucket_contains = 0; for (pair_ptr = (Pair)symbol_table.table[i]; pair_ptr != NULL; pair_ptr = pair_next(pair_ptr)) { symbols++; bucket_contains++; } if (bucket_contains > fullest_bucket_size) { fullest_bucket_size = bucket_contains; fullest_bucket_num = i; } } else unused_buckets++; } printf("\nSymbol table statistics:"); printf("\n------------------------\n"); printf("Table Size:\t%" UIntfmt "\n", symbol_table.size); printf("Total Symbols:\t%" UIntfmt "\n", symbols); if (symbols != symbol_table.contains) printf("Symbol count incorrect in 'symbol_table': %" UIntfmt "\n", symbol_table.contains); printf("\tused buckets:\t%" UIntfmt " (range: [%" Intfmt", %" UIntfmt "])\n", used_buckets, first_index, last_index); printf("\tunused buckets:\t%" UIntfmt "\n", unused_buckets); printf("\tmaximum bucket size:\t%" UIntfmt " (#: %" UIntfmt ")\n", fullest_bucket_size, fullest_bucket_num); SYS_MUTEX_UNLOCK( MUTEX_SYMBOL ) ; }