xref: /llvm-project/libc/src/search/hcreate.cpp (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
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