1*384Szelenkov@nginx.com 2*384Szelenkov@nginx.com /* 3*384Szelenkov@nginx.com * Copyright (C) Igor Sysoev 4*384Szelenkov@nginx.com * Copyright (C) NGINX, Inc. 5*384Szelenkov@nginx.com */ 6*384Szelenkov@nginx.com 7*384Szelenkov@nginx.com #include <nxt_main.h> 8*384Szelenkov@nginx.com #include "nxt_tests.h" 9*384Szelenkov@nginx.com 10*384Szelenkov@nginx.com 11*384Szelenkov@nginx.com nxt_int_t 12*384Szelenkov@nginx.com nxt_mp_test(nxt_thread_t *thr, nxt_uint_t runs, nxt_uint_t nblocks, 13*384Szelenkov@nginx.com size_t max_size) 14*384Szelenkov@nginx.com { 15*384Szelenkov@nginx.com void **blocks; 16*384Szelenkov@nginx.com size_t total; 17*384Szelenkov@nginx.com uint32_t value, size; 18*384Szelenkov@nginx.com nxt_mp_t *mp; 19*384Szelenkov@nginx.com nxt_bool_t valid; 20*384Szelenkov@nginx.com nxt_uint_t i, n; 21*384Szelenkov@nginx.com 22*384Szelenkov@nginx.com const size_t min_chunk_size = 16; 23*384Szelenkov@nginx.com const size_t page_size = 128; 24*384Szelenkov@nginx.com const size_t page_alignment = 128; 25*384Szelenkov@nginx.com const size_t cluster_size = page_size * 8; 26*384Szelenkov@nginx.com 27*384Szelenkov@nginx.com nxt_thread_time_update(thr); 28*384Szelenkov@nginx.com nxt_log_error(NXT_LOG_NOTICE, thr->log, 29*384Szelenkov@nginx.com "mem pool test started, max:%uz", max_size); 30*384Szelenkov@nginx.com 31*384Szelenkov@nginx.com blocks = nxt_malloc(nblocks * sizeof(void *)); 32*384Szelenkov@nginx.com if (blocks == NULL) { 33*384Szelenkov@nginx.com return NXT_ERROR; 34*384Szelenkov@nginx.com } 35*384Szelenkov@nginx.com 36*384Szelenkov@nginx.com valid = nxt_mp_test_sizes(cluster_size, page_alignment, page_size, 37*384Szelenkov@nginx.com min_chunk_size); 38*384Szelenkov@nginx.com if (!valid) { 39*384Szelenkov@nginx.com return NXT_ERROR; 40*384Szelenkov@nginx.com } 41*384Szelenkov@nginx.com 42*384Szelenkov@nginx.com mp = nxt_mp_create(cluster_size, page_alignment, page_size, min_chunk_size); 43*384Szelenkov@nginx.com if (mp == NULL) { 44*384Szelenkov@nginx.com return NXT_ERROR; 45*384Szelenkov@nginx.com } 46*384Szelenkov@nginx.com 47*384Szelenkov@nginx.com value = 0; 48*384Szelenkov@nginx.com 49*384Szelenkov@nginx.com for (i = 0; i < runs; i++) { 50*384Szelenkov@nginx.com 51*384Szelenkov@nginx.com total = 0; 52*384Szelenkov@nginx.com 53*384Szelenkov@nginx.com for (n = 0; n < nblocks; n++) { 54*384Szelenkov@nginx.com value = nxt_murmur_hash2(&value, sizeof(uint32_t)); 55*384Szelenkov@nginx.com 56*384Szelenkov@nginx.com size = value & max_size; 57*384Szelenkov@nginx.com 58*384Szelenkov@nginx.com if (size == 0) { 59*384Szelenkov@nginx.com size++; 60*384Szelenkov@nginx.com } 61*384Szelenkov@nginx.com 62*384Szelenkov@nginx.com total += size; 63*384Szelenkov@nginx.com blocks[n] = nxt_mp_alloc(mp, size); 64*384Szelenkov@nginx.com 65*384Szelenkov@nginx.com if (blocks[n] == NULL) { 66*384Szelenkov@nginx.com nxt_log_error(NXT_LOG_NOTICE, thr->log, 67*384Szelenkov@nginx.com "mem pool test failed: %uz", total); 68*384Szelenkov@nginx.com return NXT_ERROR; 69*384Szelenkov@nginx.com } 70*384Szelenkov@nginx.com } 71*384Szelenkov@nginx.com 72*384Szelenkov@nginx.com for (n = 0; n < nblocks; n++) { 73*384Szelenkov@nginx.com nxt_mp_free(mp, blocks[n]); 74*384Szelenkov@nginx.com } 75*384Szelenkov@nginx.com } 76*384Szelenkov@nginx.com 77*384Szelenkov@nginx.com if (!nxt_mp_is_empty(mp)) { 78*384Szelenkov@nginx.com nxt_log_error(NXT_LOG_NOTICE, thr->log, "mem pool is not empty"); 79*384Szelenkov@nginx.com return NXT_ERROR; 80*384Szelenkov@nginx.com } 81*384Szelenkov@nginx.com 82*384Szelenkov@nginx.com nxt_mp_destroy(mp); 83*384Szelenkov@nginx.com 84*384Szelenkov@nginx.com nxt_free(blocks); 85*384Szelenkov@nginx.com 86*384Szelenkov@nginx.com nxt_thread_time_update(thr); 87*384Szelenkov@nginx.com nxt_log_error(NXT_LOG_NOTICE, thr->log, "mem pool test passed"); 88*384Szelenkov@nginx.com 89*384Szelenkov@nginx.com return NXT_OK; 90*384Szelenkov@nginx.com } 91