/* * Copyright (C) Igor Sysoev * Copyright (C) NGINX, Inc. */ #include #include "nxt_tests.h" nxt_int_t nxt_mem_zone_test(nxt_thread_t *thr, nxt_uint_t runs, nxt_uint_t nblocks, size_t max_size) { void *start, **blocks; size_t total, zone_size; uint32_t size; nxt_uint_t i, n; nxt_mem_zone_t *zone; const size_t page_size = 4096; nxt_thread_time_update(thr); nxt_log_error(NXT_LOG_NOTICE, thr->log, "mem zone test started, max:%uz", max_size); zone_size = (max_size + 1) * nblocks; start = nxt_memalign(page_size, zone_size); if (start == NULL) { return NXT_ERROR; } zone = nxt_mem_zone_init(start, zone_size, page_size); if (zone == NULL) { return NXT_ERROR; } blocks = nxt_malloc(nblocks * sizeof(void *)); if (blocks == NULL) { return NXT_ERROR; } size = 0; for (i = 0; i < runs; i++) { total = 0; for (n = 0; n < nblocks; n++) { size = nxt_murmur_hash2(&size, sizeof(uint32_t)); total += size & max_size; blocks[n] = nxt_mem_zone_alloc(zone, size & max_size); if (blocks[n] == NULL) { nxt_log_error(NXT_LOG_NOTICE, thr->log, "mem zone test failed: %uz", total); return NXT_ERROR; } } for (n = 0; n < nblocks; n++) { nxt_mem_zone_free(zone, blocks[n]); } } nxt_free(blocks); nxt_free(zone); nxt_thread_time_update(thr); nxt_log_error(NXT_LOG_NOTICE, thr->log, "mem zone test passed"); return NXT_OK; }