static Scheme_Object *make_hash_table(int argc, Scheme_Object *argv[]) { int flags[2] = { 0 /* weak */ , 0 /* equal */ }; check_hash_table_flags("make-hash-table", 0, argc, argv, flags); if (flags[0]) { /* Weak */ Scheme_Bucket_Table *t; t = scheme_make_bucket_table(20, SCHEME_hash_weak_ptr); if (flags[1]) { Scheme_Object *sema; sema = scheme_make_sema(1); t->mutex = sema; t->compare = compare_equal; t->make_hash_indices = make_hash_indices_for_equal; } return (Scheme_Object *)t; } else { /* Normal */ if (flags[1]) return (Scheme_Object *)scheme_make_hash_table_equal(); else return (Scheme_Object *)scheme_make_hash_table(SCHEME_hash_ptr); } }
Scheme_Hash_Table *scheme_make_hash_table_equal() { Scheme_Hash_Table *t; Scheme_Object *sema; t = scheme_make_hash_table(SCHEME_hash_ptr); sema = scheme_make_sema(1); t->mutex = sema; t->compare = compare_equal; t->make_hash_indices = make_hash_indices_for_equal; return t; }
static Scheme_Object *make_sema(int n, Scheme_Object **p) { intptr_t v; v = scheme_get_semaphore_init("make-semaphore", n, p); return scheme_make_sema(v); }