181e3e7e5SSchrodinger ZHU Yifan //===-- Implementation of hcreate -------------------------------*- C++ -*-===// 281e3e7e5SSchrodinger ZHU Yifan // 381e3e7e5SSchrodinger ZHU Yifan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481e3e7e5SSchrodinger ZHU Yifan // See https://llvm.org/LICENSE.txt for license information. 581e3e7e5SSchrodinger ZHU Yifan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681e3e7e5SSchrodinger ZHU Yifan // 781e3e7e5SSchrodinger ZHU Yifan //===----------------------------------------------------------------------===// 881e3e7e5SSchrodinger ZHU Yifan 981e3e7e5SSchrodinger ZHU Yifan #include "src/search/hcreate.h" 1081e3e7e5SSchrodinger ZHU Yifan #include "src/__support/HashTable/randomness.h" 1181e3e7e5SSchrodinger ZHU Yifan #include "src/__support/HashTable/table.h" 12*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 1381e3e7e5SSchrodinger ZHU Yifan #include "src/errno/libc_errno.h" 1481e3e7e5SSchrodinger ZHU Yifan #include "src/search/hsearch/global.h" 1581e3e7e5SSchrodinger ZHU Yifan 16*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 1781e3e7e5SSchrodinger ZHU Yifan LLVM_LIBC_FUNCTION(int, hcreate, (size_t capacity)) { 1886e99e11SSchrodinger ZHU Yifan // We follow FreeBSD's implementation here. If the global_hash_table is 1986e99e11SSchrodinger ZHU Yifan // already initialized, this function will do nothing and return 1. 2086e99e11SSchrodinger ZHU Yifan // https://cgit.freebsd.org/src/tree/lib/libc/stdlib/hcreate.c 2186e99e11SSchrodinger ZHU Yifan if (internal::global_hash_table != nullptr) 2286e99e11SSchrodinger ZHU Yifan return 1; 2386e99e11SSchrodinger ZHU Yifan 2481e3e7e5SSchrodinger ZHU Yifan uint64_t randomness = internal::randomness::next_random_seed(); 2581e3e7e5SSchrodinger ZHU Yifan internal::HashTable *table = 2681e3e7e5SSchrodinger ZHU Yifan internal::HashTable::allocate(capacity, randomness); 2781e3e7e5SSchrodinger ZHU Yifan if (table == nullptr) { 2881e3e7e5SSchrodinger ZHU Yifan libc_errno = ENOMEM; 2981e3e7e5SSchrodinger ZHU Yifan return 0; 3081e3e7e5SSchrodinger ZHU Yifan } 3181e3e7e5SSchrodinger ZHU Yifan internal::global_hash_table = table; 3281e3e7e5SSchrodinger ZHU Yifan return 1; 3381e3e7e5SSchrodinger ZHU Yifan } 3481e3e7e5SSchrodinger ZHU Yifan 35*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 36