forked from cacheMon/libCacheSim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
size.c
92 lines (76 loc) · 2.59 KB
/
size.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//
// Created by Juncheng on 5/29/21.
//
#include "../../include/libCacheSim/admissionAlgo.h"
#include "../../utils/include/mymath.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct size_admissioner {
int64_t size_threshold;
} size_admission_params_t;
bool size_admit(admissioner_t *admissioner, const request_t *req) {
size_admission_params_t *pa = (size_admission_params_t *)admissioner->params;
if (req->obj_size < pa->size_threshold) {
return true;
}
return false;
}
static void size_admissioner_parse_params(const char *init_params,
size_admission_params_t *pa) {
if (init_params == NULL) {
pa->size_threshold = INT64_MAX;
INFO("use default size admission: %ld", (long)pa->size_threshold);
} else {
char *params_str = strdup(init_params);
char *old_params_str = params_str;
char *end;
while (params_str != NULL && params_str[0] != '\0') {
/* different parameters are separated by comma,
* key and value are separated by = */
char *key = strsep((char **)¶ms_str, "=");
char *value = strsep((char **)¶ms_str, ",");
// skip the white space
while (params_str != NULL && *params_str == ' ') {
params_str++;
}
if (strcasecmp(key, "size") == 0) {
pa->size_threshold = strtoll(value, &end, 0);
if (strlen(end) > 2) {
ERROR("param parsing error, find string \"%s\" after number\n", end);
}
} else {
ERROR("size admission does not have parameter %s\n", key);
}
}
free(old_params_str);
}
}
admissioner_t *clone_size_admissioner(admissioner_t *admissioner) {
return create_size_admissioner(admissioner->init_params);
}
void free_size_admissioner(admissioner_t *admissioner) {
size_admission_params_t *pa = admissioner->params;
free(pa);
if (admissioner->init_params) {
free(admissioner->init_params);
}
free(admissioner);
}
admissioner_t *create_size_admissioner(const char *init_params) {
size_admission_params_t *pa =
(size_admission_params_t *)malloc(sizeof(size_admission_params_t));
memset(pa, 0, sizeof(size_admission_params_t));
size_admissioner_parse_params(init_params, pa);
admissioner_t *admissioner = (admissioner_t *)malloc(sizeof(admissioner_t));
memset(admissioner, 0, sizeof(admissioner_t));
admissioner->params = pa;
admissioner->admit = size_admit;
admissioner->free = free_size_admissioner;
admissioner->clone = clone_size_admissioner;
if (init_params != NULL) admissioner->init_params = strdup(init_params);
return admissioner;
}
#ifdef __cplusplus
}
#endif