-
Notifications
You must be signed in to change notification settings - Fork 42
/
hashtable-seq.c
142 lines (124 loc) · 2.83 KB
/
hashtable-seq.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
* File: hashtable-seq.c
* Author: Vasileios Trigonakis <vasileios.trigonakis@epfl.ch>
* Description:
* hashtable-seq.c is part of ASCYLIB
*
* Copyright (c) 2014 Vasileios Trigonakis <vasileios.trigonakis@epfl.ch>,
* Tudor David <tudor.david@epfl.ch>
* Distributed Programming Lab (LPD), EPFL
*
* ASCYLIB is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, version 2
* of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include "hashtable-seq.h"
#include "ssalloc.h"
unsigned int maxhtlength;
void
ht_delete(ht_intset_t *set)
{
node_t *node, *next;
int i;
for (i=0; i < maxhtlength; i++)
{
node = set->buckets[i].head;
while (node != NULL)
{
next = node->next;
/* free(node); */
ssfree((void*) node); /* TODO: fix with ssmem */
node = next;
}
}
free(set);
}
int
ht_size(ht_intset_t *set)
{
int size = 0;
node_t *node;
int i;
for (i=0; i < maxhtlength; i++)
{
node = set->buckets[i].head;
while (node->next)
{
size++;
node = node->next;
}
}
return size;
}
ht_intset_t*
ht_new()
{
ht_intset_t *set;
int i;
if ((set = (ht_intset_t *)ssalloc_aligned_alloc(1, CACHE_LINE_SIZE, sizeof(ht_intset_t))) == NULL)
{
perror("malloc");
exit(1);
}
set->hash = maxhtlength - 1;
size_t bs = (maxhtlength + 1) * sizeof(intset_t);
bs += CACHE_LINE_SIZE - (bs & CACHE_LINE_SIZE);
if ((set->buckets = ssalloc_alloc(1, bs)) == NULL)
{
perror("malloc buckets");
exit(1);
}
for (i=0; i < maxhtlength; i++)
{
bucket_set_init(&set->buckets[i]);
}
return set;
}
sval_t
ht_contains(ht_intset_t *set, skey_t key)
{
int addr = key & set->hash;
return set_contains(&set->buckets[addr], key);
}
int
ht_add(ht_intset_t *set, skey_t key, sval_t val)
{
int addr = key & set->hash;
return set_add(&set->buckets[addr], key, val);
}
sval_t
ht_remove(ht_intset_t *set, skey_t key)
{
int addr = key & set->hash;
return set_remove(&set->buckets[addr], key);
}
/*
* Move an element in the hashtable (from one linked-list to another)
*/
int
ht_move(ht_intset_t *set, int val1, int val2)
{
int result = 0;
return result;
}
/*
* Read all elements of the hashtable (parses all linked-lists)
* This cannot be consistent when used with move operation.
*/
int ht_snapshot_unmovable(ht_intset_t *set) {
int sum = 0;
return sum;
}
/*
* Read all elements of the hashtable (parses all linked-lists)
*/
int ht_snapshot(ht_intset_t *set) {
return 1;
}