xref: /unit/src/test/nxt_mp_test.c (revision 384:8f86d3ff3e29)
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
nxt_mp_test(nxt_thread_t * thr,nxt_uint_t runs,nxt_uint_t nblocks,size_t max_size)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