Skip to content

Commit dae51a6

Browse files
committed
idea from 12.5.15 a reader-first model to improve read performance.
1 parent 6f811fb commit dae51a6

File tree

1 file changed

+29
-14
lines changed

1 file changed

+29
-14
lines changed

proxylab-handout/cache.c

+29-14
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
#include "cache.h"
22

33
/* Global variable */
4+
int readcnt;
45
cache *CACHE_HEAD;
5-
sem_t mutex;
6+
sem_t mutex, cnt_lock;
67

78
/* initial CACHE_HEAD and sem_t mutex for the whole linked list */
89
void init_cache_list(void)
910
{
11+
readcnt = 0;
1012
CACHE_HEAD = NULL;
1113
Sem_init(&mutex, 0, 1);
14+
Sem_init(&cnt_lock, 0, 1);
1215
}
1316
/* insert cachenode as the head */
1417
void insert_cache_head(cache *cache_node)
1518
{
16-
if(CACHE_HEAD == cache_node) return;
17-
else if(CACHE_HEAD)
19+
if(CACHE_HEAD)
1820
{
1921
CACHE_HEAD->prev_cache = cache_node;
2022
cache_node->next_cache = CACHE_HEAD;
@@ -28,16 +30,12 @@ void insert_cache_head(cache *cache_node)
2830
void repair_cache_link(cache *cache_node)
2931
{
3032
cache *prev, *next;
31-
if(cache_node == CACHE_HEAD) return;
32-
else
33-
{
34-
prev = cache_node->prev_cache;
35-
next = cache_node->next_cache;
36-
if(prev) prev->next_cache = next;
37-
if(next) next->prev_cache = prev;
38-
cache_node->prev_cache = NULL;
39-
cache_node->next_cache = NULL;
40-
}
33+
prev = cache_node->prev_cache;
34+
next = cache_node->next_cache;
35+
if(prev) prev->next_cache = next;
36+
if(next) next->prev_cache = prev;
37+
cache_node->prev_cache = NULL;
38+
cache_node->next_cache = NULL;
4139
}
4240

4341
/* write cache */
@@ -84,14 +82,29 @@ void hadnle_after_disconn(cache *cache_node)
8482
/* read cache */
8583
char *read_cache(cache *cache_node)
8684
{
85+
char *buf;
86+
87+
P(&cnt_lock);
88+
readcnt++;
89+
if(readcnt == 1) P(&(cache_node->mutex));
90+
V(&cnt_lock);
91+
8792
if(!(cache_node == CACHE_HEAD))
8893
{
8994
P(&mutex);
9095
repair_cache_link(cache_node);
9196
insert_cache_head(cache_node);
9297
V(&mutex);
9398
}
94-
return cache_node->buf;
99+
100+
buf = cache_node->buf;
101+
102+
P(&cnt_lock);
103+
readcnt--;
104+
if(readcnt == 0) V(&(cache_node->mutex));
105+
V(&cnt_lock);
106+
107+
return buf;
95108
}
96109

97110
/* find cache based on host and path, if not exists, return NULL */
@@ -149,7 +162,9 @@ void delete_tail_cache(void)
149162
cache *tail_cache = find_tail_cache();
150163
if(tail_cache)
151164
{
165+
P(&mutex);
152166
repair_cache_link(tail_cache);
167+
V(&mutex);
153168
free(tail_cache);
154169
}
155170
}

0 commit comments

Comments
 (0)