@@ -24,48 +24,73 @@ static inline cache_t *create_cache(const char *trace_path, const char *eviction
2424
2525 /* the trace provided is small */
2626 if (trace_path != NULL && strstr (trace_path , "data/trace." ) != NULL ) cc_params .hashpower -= 8 ;
27+ typedef struct {
28+ const char * name ;
29+ cache_t * (* init_func )(common_cache_params_t , const char * );
30+ } eviction_algo_entry_t ;
2731
28- if (strcasecmp (eviction_algo , "lru" ) == 0 ) {
29- cache = LRU_init (cc_params , eviction_params );
30- } else if (strcasecmp (eviction_algo , "fifo" ) == 0 ) {
31- cache = FIFO_init (cc_params , eviction_params );
32- } else if (strcasecmp (eviction_algo , "arc" ) == 0 ) {
33- cache = ARC_init (cc_params , eviction_params );
34- } else if (strcasecmp (eviction_algo , "arcv0" ) == 0 ) {
35- cache = ARCv0_init (cc_params , eviction_params );
36- } else if (strcasecmp (eviction_algo , "lhd" ) == 0 ) {
37- cache = LHD_init (cc_params , eviction_params );
38- } else if (strcasecmp (eviction_algo , "random" ) == 0 ) {
39- cache = Random_init (cc_params , eviction_params );
40- } else if (strcasecmp (eviction_algo , "randomTwo" ) == 0 ) {
41- cache = RandomTwo_init (cc_params , eviction_params );
42- } else if (strcasecmp (eviction_algo , "lfu" ) == 0 ) {
43- cache = LFU_init (cc_params , eviction_params );
44- } else if (strcasecmp (eviction_algo , "gdsf" ) == 0 ) {
45- cache = GDSF_init (cc_params , eviction_params );
46- } else if (strcasecmp (eviction_algo , "lfuda" ) == 0 ) {
47- cache = LFUDA_init (cc_params , eviction_params );
48- } else if (strcasecmp (eviction_algo , "twoq" ) == 0 || strcasecmp (eviction_algo , "2q" ) == 0 ) {
49- cache = TwoQ_init (cc_params , eviction_params );
50- } else if (strcasecmp (eviction_algo , "slru" ) == 0 ) {
51- cache = SLRU_init (cc_params , eviction_params );
52- } else if (strcasecmp (eviction_algo , "slruv0" ) == 0 ) {
53- cache = SLRUv0_init (cc_params , eviction_params );
32+ static const eviction_algo_entry_t simple_algos [] = {
33+ {"lru" , LRU_init },
34+ {"fifo" , FIFO_init },
35+ {"arc" , ARC_init },
36+ {"arcv0" , ARCv0_init },
37+ {"lhd" , LHD_init },
38+ {"random" , Random_init },
39+ {"randomTwo" , RandomTwo_init },
40+ {"lfu" , LFU_init },
41+ {"gdsf" , GDSF_init },
42+ {"lfuda" , LFUDA_init },
43+ {"twoq" , TwoQ_init },
44+ {"2q" , TwoQ_init },
45+ {"slru" , SLRU_init },
46+ {"slruv0" , SLRUv0_init },
47+ {"lecar" , LeCaR_init },
48+ {"lecarv0" , LeCaRv0_init },
49+ {"RandomLRU" , RandomLRU_init },
50+ {"cacheus" , Cacheus_init },
51+ {"size" , Size_init },
52+ {"lfucpp" , LFUCpp_init },
53+ {"wtinyLFU" , WTinyLFU_init },
54+ {"nop" , nop_init },
55+ {"fifo-reinsertion" , Clock_init },
56+ {"clock" , Clock_init },
57+ {"second-chance" , Clock_init },
58+ {"clockpro" , ClockPro_init },
59+ {"lirs" , LIRS_init },
60+ {"fifomerge" , FIFO_Merge_init },
61+ {"fifo-merge" , FIFO_Merge_init },
62+ {"flashProb" , flashProb_init },
63+ {"sfifo" , SFIFO_init },
64+ {"sfifov0" , SFIFOv0_init },
65+ {"lru-prob" , LRU_Prob_init },
66+ {"fifo-belady" , FIFO_Belady_init },
67+ {"lru-belady" , LRU_Belady_init },
68+ {"sieve-belady" , Sieve_Belady_init },
69+ {"s3lru" , S3LRU_init },
70+ {"s3fifo" , S3FIFO_init },
71+ {"s3-fifo" , S3FIFO_init },
72+ {"s3fifov0" , S3FIFOv0_init },
73+ {"s3-fifov0" , S3FIFOv0_init },
74+ {"s3fifod" , S3FIFOd_init },
75+ {"qdlp" , QDLP_init },
76+ {"CAR" , CAR_init },
77+ {"sieve" , Sieve_init },
78+ };
79+
80+ cache_t * (* init_func )(common_cache_params_t , const char * ) = NULL ;
81+ for (size_t i = 0 ; i < sizeof (simple_algos ) / sizeof (simple_algos [0 ]); ++ i ) {
82+ if (strcasecmp (eviction_algo , simple_algos [i ].name ) == 0 ) {
83+ init_func = simple_algos [i ].init_func ;
84+ break ;
85+ }
86+ }
87+
88+ // Initializing for algorithms which require special handling (not in simple_algos)
89+ if (init_func ) {
90+ cache = init_func (cc_params , eviction_params );
5491 } else if (strcasecmp (eviction_algo , "hyperbolic" ) == 0 ) {
5592 cc_params .hashpower = MAX (cc_params .hashpower - 8 , 16 );
5693 cache = Hyperbolic_init (cc_params , eviction_params );
57- } else if (strcasecmp (eviction_algo , "lecar" ) == 0 ) {
58- cache = LeCaR_init (cc_params , eviction_params );
59- } else if (strcasecmp (eviction_algo , "lecarv0" ) == 0 ) {
60- cache = LeCaRv0_init (cc_params , eviction_params );
61- } else if (strcasecmp (eviction_algo , "RandomLRU" ) == 0 ) {
62- cache = RandomLRU_init (cc_params , eviction_params );
63- } else if (strcasecmp (eviction_algo , "cacheus" ) == 0 ) {
64- cache = Cacheus_init (cc_params , eviction_params );
65- } else if (strcasecmp (eviction_algo , "size" ) == 0 ) {
66- cache = Size_init (cc_params , eviction_params );
67- } else if (strcasecmp (eviction_algo , "lfucpp" ) == 0 ) {
68- cache = LFUCpp_init (cc_params , eviction_params );
6994 } else if (strcasecmp (eviction_algo , "tinyLFU" ) == 0 ) {
7095 if (eviction_params == NULL ) {
7196 cache = WTinyLFU_init (cc_params , eviction_params );
@@ -79,8 +104,6 @@ static inline cache_t *create_cache(const char *trace_path, const char *eviction
79104 cache = WTinyLFU_init (cc_params , eviction_params );
80105 }
81106 }
82- } else if (strcasecmp (eviction_algo , "wtinyLFU" ) == 0 ) {
83- cache = WTinyLFU_init (cc_params , eviction_params );
84107 } else if (strcasecmp (eviction_algo , "belady" ) == 0 && strcasestr (trace_path , "lcs" ) == NULL ) {
85108 if (strcasestr (trace_path , "oracleGeneral" ) == NULL ) {
86109 WARN ("belady is only supported for oracleGeneral and lcs trace\n" );
@@ -90,8 +113,6 @@ static inline cache_t *create_cache(const char *trace_path, const char *eviction
90113 exit (1 );
91114 }
92115 cache = Belady_init (cc_params , eviction_params );
93- } else if (strcasecmp (eviction_algo , "nop" ) == 0 ) {
94- cache = nop_init (cc_params , eviction_params );
95116 } else if (strcasecmp (eviction_algo , "beladySize" ) == 0 ) {
96117 if (strcasestr (trace_path , "oracleGeneral" ) == NULL && strcasestr (trace_path , "lcs" ) == NULL ) {
97118 WARN ("beladySize is only supported for oracleGeneral and lcs trace\n" );
@@ -102,46 +123,6 @@ static inline cache_t *create_cache(const char *trace_path, const char *eviction
102123 }
103124 cc_params .hashpower = MAX (cc_params .hashpower - 8 , 16 );
104125 cache = BeladySize_init (cc_params , eviction_params );
105- } else if (strcasecmp (eviction_algo , "fifo-reinsertion" ) == 0 || strcasecmp (eviction_algo , "clock" ) == 0 ||
106- strcasecmp (eviction_algo , "second-chance" ) == 0 ) {
107- cache = Clock_init (cc_params , eviction_params );
108- } else if (strcasecmp (eviction_algo , "clockpro" ) == 0 ) {
109- cache = ClockPro_init (cc_params , eviction_params );
110- } else if (strcasecmp (eviction_algo , "lirs" ) == 0 ) {
111- cache = LIRS_init (cc_params , eviction_params );
112- } else if (strcasecmp (eviction_algo , "fifomerge" ) == 0 || strcasecmp (eviction_algo , "fifo-merge" ) == 0 ) {
113- cache = FIFO_Merge_init (cc_params , eviction_params );
114- // } else if (strcasecmp(eviction_algo, "fifo-reinsertion") == 0) {
115- // cache = FIFO_Reinsertion_init(cc_params, eviction_params);
116- } else if (strcasecmp (eviction_algo , "flashProb" ) == 0 ) {
117- // used to measure application level write amp
118- cache = flashProb_init (cc_params , eviction_params );
119- } else if (strcasecmp (eviction_algo , "sfifo" ) == 0 ) {
120- cache = SFIFO_init (cc_params , eviction_params );
121- } else if (strcasecmp (eviction_algo , "sfifov0" ) == 0 ) {
122- cache = SFIFOv0_init (cc_params , eviction_params );
123- } else if (strcasecmp (eviction_algo , "lru-prob" ) == 0 ) {
124- cache = LRU_Prob_init (cc_params , eviction_params );
125- } else if (strcasecmp (eviction_algo , "fifo-belady" ) == 0 ) {
126- cache = FIFO_Belady_init (cc_params , eviction_params );
127- } else if (strcasecmp (eviction_algo , "lru-belady" ) == 0 ) {
128- cache = LRU_Belady_init (cc_params , eviction_params );
129- } else if (strcasecmp (eviction_algo , "sieve-belady" ) == 0 ) {
130- cache = Sieve_Belady_init (cc_params , eviction_params );
131- } else if (strcasecmp (eviction_algo , "s3lru" ) == 0 ) {
132- cache = S3LRU_init (cc_params , eviction_params );
133- } else if (strcasecmp (eviction_algo , "s3fifo" ) == 0 || strcasecmp (eviction_algo , "s3-fifo" ) == 0 ) {
134- cache = S3FIFO_init (cc_params , eviction_params );
135- } else if (strcasecmp (eviction_algo , "s3fifov0" ) == 0 || strcasecmp (eviction_algo , "s3-fifov0" ) == 0 ) {
136- cache = S3FIFOv0_init (cc_params , eviction_params );
137- } else if (strcasecmp (eviction_algo , "s3fifod" ) == 0 ) {
138- cache = S3FIFOd_init (cc_params , eviction_params );
139- } else if (strcasecmp (eviction_algo , "qdlp" ) == 0 ) {
140- cache = QDLP_init (cc_params , eviction_params );
141- } else if (strcasecmp (eviction_algo , "CAR" ) == 0 ) {
142- cache = CAR_init (cc_params , eviction_params );
143- } else if (strcasecmp (eviction_algo , "sieve" ) == 0 ) {
144- cache = Sieve_init (cc_params , eviction_params );
145126#ifdef ENABLE_3L_CACHE
146127 } else if (strcasecmp (eviction_algo , "3LCache" ) == 0 ) {
147128 cache = ThreeLCache_init (cc_params , eviction_params );
0 commit comments