1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef INCLUDED_RTL_ALLOC_CACHE_H 25*b1cdbd2cSJim Jagielski #define INCLUDED_RTL_ALLOC_CACHE_H 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include "sal/types.h" 28*b1cdbd2cSJim Jagielski #include "rtl/alloc.h" 29*b1cdbd2cSJim Jagielski #include "alloc_impl.h" 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski #ifdef __cplusplus 32*b1cdbd2cSJim Jagielski extern "C" { 33*b1cdbd2cSJim Jagielski #endif 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski /** rtl_cache_stat_type 36*b1cdbd2cSJim Jagielski * @internal 37*b1cdbd2cSJim Jagielski */ 38*b1cdbd2cSJim Jagielski typedef struct rtl_cache_stat_st rtl_cache_stat_type; 39*b1cdbd2cSJim Jagielski struct rtl_cache_stat_st 40*b1cdbd2cSJim Jagielski { 41*b1cdbd2cSJim Jagielski sal_uInt64 m_alloc; 42*b1cdbd2cSJim Jagielski sal_uInt64 m_free; 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski sal_Size m_mem_total; 45*b1cdbd2cSJim Jagielski sal_Size m_mem_alloc; 46*b1cdbd2cSJim Jagielski }; 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski /** rtl_cache_bufctl_type 50*b1cdbd2cSJim Jagielski * @internal 51*b1cdbd2cSJim Jagielski */ 52*b1cdbd2cSJim Jagielski typedef struct rtl_cache_bufctl_st rtl_cache_bufctl_type; 53*b1cdbd2cSJim Jagielski struct rtl_cache_bufctl_st 54*b1cdbd2cSJim Jagielski { 55*b1cdbd2cSJim Jagielski rtl_cache_bufctl_type * m_next; /* linkage */ 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski sal_uIntPtr m_addr; /* buffer address */ 58*b1cdbd2cSJim Jagielski sal_uIntPtr m_slab; /* parent slab address */ 59*b1cdbd2cSJim Jagielski }; 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski /** rtl_cache_slab_type 63*b1cdbd2cSJim Jagielski * @internal 64*b1cdbd2cSJim Jagielski */ 65*b1cdbd2cSJim Jagielski typedef struct rtl_cache_slab_st rtl_cache_slab_type; 66*b1cdbd2cSJim Jagielski struct rtl_cache_slab_st 67*b1cdbd2cSJim Jagielski { 68*b1cdbd2cSJim Jagielski rtl_cache_slab_type * m_slab_next; /* slab linkage */ 69*b1cdbd2cSJim Jagielski rtl_cache_slab_type * m_slab_prev; /* slab linkage */ 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski sal_Size m_ntypes; /* number of buffers used */ 72*b1cdbd2cSJim Jagielski sal_uIntPtr m_data; /* buffer start addr */ 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski sal_uIntPtr m_bp; /* free buffer linkage 'base pointer' */ 75*b1cdbd2cSJim Jagielski rtl_cache_bufctl_type * m_sp; /* free buffer linkage 'stack pointer' */ 76*b1cdbd2cSJim Jagielski }; 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski /** rtl_cache_magazine_type 80*b1cdbd2cSJim Jagielski * @internal 81*b1cdbd2cSJim Jagielski */ 82*b1cdbd2cSJim Jagielski #define RTL_CACHE_MAGAZINE_SIZE 61 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski typedef struct rtl_cache_magazine_st rtl_cache_magazine_type; 85*b1cdbd2cSJim Jagielski struct rtl_cache_magazine_st 86*b1cdbd2cSJim Jagielski { 87*b1cdbd2cSJim Jagielski rtl_cache_magazine_type * m_mag_next; /* depot linkage */ 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski sal_Size m_mag_size; 90*b1cdbd2cSJim Jagielski sal_Size m_mag_used; 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim Jagielski void * m_objects[RTL_CACHE_MAGAZINE_SIZE]; 93*b1cdbd2cSJim Jagielski }; 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski /** rtl_cache_depot_type 97*b1cdbd2cSJim Jagielski * @internal 98*b1cdbd2cSJim Jagielski */ 99*b1cdbd2cSJim Jagielski typedef struct rtl_cache_depot_st rtl_cache_depot_type; 100*b1cdbd2cSJim Jagielski struct rtl_cache_depot_st 101*b1cdbd2cSJim Jagielski { 102*b1cdbd2cSJim Jagielski /* magazine list */ 103*b1cdbd2cSJim Jagielski rtl_cache_magazine_type * m_mag_next; /* linkage */ 104*b1cdbd2cSJim Jagielski sal_Size m_mag_count; /* count */ 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski /* working set parameters */ 107*b1cdbd2cSJim Jagielski sal_Size m_curr_min; 108*b1cdbd2cSJim Jagielski sal_Size m_prev_min; 109*b1cdbd2cSJim Jagielski }; 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski /** rtl_cache_type 113*b1cdbd2cSJim Jagielski * @internal 114*b1cdbd2cSJim Jagielski */ 115*b1cdbd2cSJim Jagielski #define RTL_CACHE_HASH_SIZE 8 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski #define RTL_CACHE_FEATURE_HASH 1 118*b1cdbd2cSJim Jagielski #define RTL_CACHE_FEATURE_BULKDESTROY 2 119*b1cdbd2cSJim Jagielski #define RTL_CACHE_FEATURE_RESCALE 4 /* within hash rescale operation */ 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski struct rtl_cache_st 122*b1cdbd2cSJim Jagielski { 123*b1cdbd2cSJim Jagielski /* linkage */ 124*b1cdbd2cSJim Jagielski rtl_cache_type * m_cache_next; 125*b1cdbd2cSJim Jagielski rtl_cache_type * m_cache_prev; 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski /* properties */ 128*b1cdbd2cSJim Jagielski char m_name[RTL_CACHE_NAME_LENGTH + 1]; 129*b1cdbd2cSJim Jagielski long m_features; 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski sal_Size m_type_size; /* const */ 132*b1cdbd2cSJim Jagielski sal_Size m_type_align; /* const */ 133*b1cdbd2cSJim Jagielski sal_Size m_type_shift; /* log2(m_type_size); const */ 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski int (SAL_CALL * m_constructor)(void * obj, void * userarg); /* const */ 136*b1cdbd2cSJim Jagielski void (SAL_CALL * m_destructor) (void * obj, void * userarg); /* const */ 137*b1cdbd2cSJim Jagielski void (SAL_CALL * m_reclaim) (void * userarg); /* const */ 138*b1cdbd2cSJim Jagielski void * m_userarg; 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski /* slab layer */ 141*b1cdbd2cSJim Jagielski rtl_memory_lock_type m_slab_lock; 142*b1cdbd2cSJim Jagielski rtl_cache_stat_type m_slab_stats; 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski rtl_arena_type * m_source; /* slab supplier; const */ 145*b1cdbd2cSJim Jagielski sal_Size m_slab_size; /* const */ 146*b1cdbd2cSJim Jagielski sal_Size m_ntypes; /* number of buffers per slab; const */ 147*b1cdbd2cSJim Jagielski sal_Size m_ncolor; /* next slab color */ 148*b1cdbd2cSJim Jagielski sal_Size m_ncolor_max; /* max. slab color */ 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski rtl_cache_slab_type m_free_head; 151*b1cdbd2cSJim Jagielski rtl_cache_slab_type m_used_head; 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski rtl_cache_bufctl_type ** m_hash_table; 154*b1cdbd2cSJim Jagielski rtl_cache_bufctl_type * m_hash_table_0[RTL_CACHE_HASH_SIZE]; 155*b1cdbd2cSJim Jagielski sal_Size m_hash_size; /* m_hash_mask + 1 */ 156*b1cdbd2cSJim Jagielski sal_Size m_hash_shift; /* log2(m_hash_size) */ 157*b1cdbd2cSJim Jagielski 158*b1cdbd2cSJim Jagielski /* depot layer */ 159*b1cdbd2cSJim Jagielski rtl_memory_lock_type m_depot_lock; 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski rtl_cache_depot_type m_depot_empty; 162*b1cdbd2cSJim Jagielski rtl_cache_depot_type m_depot_full; 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski rtl_cache_type * m_magazine_cache; /* magazine supplier; const */ 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski /* cpu layer */ 167*b1cdbd2cSJim Jagielski rtl_cache_magazine_type * m_cpu_curr; 168*b1cdbd2cSJim Jagielski rtl_cache_magazine_type * m_cpu_prev; 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski rtl_cache_stat_type m_cpu_stats; 171*b1cdbd2cSJim Jagielski }; 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski 174*b1cdbd2cSJim Jagielski #ifdef __cplusplus 175*b1cdbd2cSJim Jagielski } 176*b1cdbd2cSJim Jagielski #endif 177*b1cdbd2cSJim Jagielski 178*b1cdbd2cSJim Jagielski #endif /* INCLUDED_RTL_ALLOC_CACHE_H */ 179