1
1
#include "cache.h"
2
2
3
3
/* Global variable */
4
+ int readcnt ;
4
5
cache * CACHE_HEAD ;
5
- sem_t mutex ;
6
+ sem_t mutex , cnt_lock ;
6
7
7
8
/* initial CACHE_HEAD and sem_t mutex for the whole linked list */
8
9
void init_cache_list (void )
9
10
{
11
+ readcnt = 0 ;
10
12
CACHE_HEAD = NULL ;
11
13
Sem_init (& mutex , 0 , 1 );
14
+ Sem_init (& cnt_lock , 0 , 1 );
12
15
}
13
16
/* insert cachenode as the head */
14
17
void insert_cache_head (cache * cache_node )
15
18
{
16
- if (CACHE_HEAD == cache_node ) return ;
17
- else if (CACHE_HEAD )
19
+ if (CACHE_HEAD )
18
20
{
19
21
CACHE_HEAD -> prev_cache = cache_node ;
20
22
cache_node -> next_cache = CACHE_HEAD ;
@@ -28,16 +30,12 @@ void insert_cache_head(cache *cache_node)
28
30
void repair_cache_link (cache * cache_node )
29
31
{
30
32
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 ;
41
39
}
42
40
43
41
/* write cache */
@@ -84,14 +82,29 @@ void hadnle_after_disconn(cache *cache_node)
84
82
/* read cache */
85
83
char * read_cache (cache * cache_node )
86
84
{
85
+ char * buf ;
86
+
87
+ P (& cnt_lock );
88
+ readcnt ++ ;
89
+ if (readcnt == 1 ) P (& (cache_node -> mutex ));
90
+ V (& cnt_lock );
91
+
87
92
if (!(cache_node == CACHE_HEAD ))
88
93
{
89
94
P (& mutex );
90
95
repair_cache_link (cache_node );
91
96
insert_cache_head (cache_node );
92
97
V (& mutex );
93
98
}
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 ;
95
108
}
96
109
97
110
/* find cache based on host and path, if not exists, return NULL */
@@ -149,7 +162,9 @@ void delete_tail_cache(void)
149
162
cache * tail_cache = find_tail_cache ();
150
163
if (tail_cache )
151
164
{
165
+ P (& mutex );
152
166
repair_cache_link (tail_cache );
167
+ V (& mutex );
153
168
free (tail_cache );
154
169
}
155
170
}
0 commit comments