GNUnet 0.22.0
peer.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet
3 Copyright (C) 2006, 2008, 2009 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20
27#include "platform.h"
28#include "gnunet_util_lib.h"
29
30#define LOG(kind, ...) GNUNET_log_from (kind, "util-peer", __VA_ARGS__)
31
32
34{
39
45
49 unsigned int rc;
50};
51
52
56static struct PeerEntry **table;
57
64
68static unsigned int size;
69
74static unsigned int free_list_start;
75
76
85{
86 struct PeerEntry *e;
87
88 if (NULL == pid)
89 return 0;
90 if (NULL == map)
91 return 0;
93 if (NULL == e)
94 return 0;
95 GNUNET_assert (e->rc > 0);
96 return e->pid;
97}
98
99
109{
111 struct PeerEntry *e;
112
113 if (NULL == pid)
114 return 0;
115 if (NULL == map)
118 if (NULL != e)
119 {
120 GNUNET_assert (e->rc > 0);
121 e->rc++;
122 return e->pid;
123 }
125 if (ret == size)
126 {
128 for (unsigned int i = ret; i < size; i++)
129 {
130 table[i] = GNUNET_new (struct PeerEntry);
131 table[i]->pid = i + 1;
132 }
133 }
134 if (0 == ret)
135 {
136 memset (&table[0]->id, 0, sizeof(struct GNUNET_PeerIdentity));
137 table[0]->pid = 0;
138 table[0]->rc = 1;
139 ret = 1;
140 }
142 GNUNET_assert (0 == table[ret]->rc);
144 table[ret]->id = *pid;
145 table[ret]->rc = 1;
146 table[ret]->pid = ret;
149 &table[ret]->id,
150 table[ret],
152 return ret;
153}
154
155
156void
157GNUNET_PEER_decrement_rcs (const GNUNET_PEER_Id *ids, unsigned int count)
158{
159 int i;
161
162 if (0 == count)
163 return;
164 for (i = count - 1; i >= 0; i--)
165 {
166 id = ids[i];
167 if (0 == id)
168 continue;
169 GNUNET_assert (id < size);
170 GNUNET_assert (table[id]->rc > 0);
171 table[id]->rc--;
172 if (0 == table[id]->rc)
173 {
176 &table[id]->id,
177 table[id]));
180 }
181 }
182}
183
184
191void
193{
194 if (0 == id)
195 return;
196 GNUNET_assert (id < size);
197 GNUNET_assert (table[id]->rc > 0);
198 GNUNET_assert ((delta >= 0) ||
199 (table[id]->rc >= (unsigned int) (-delta)));
200 table[id]->rc += delta;
201 if (0 == table[id]->rc)
202 {
205 &table[id]->id,
206 table[id]));
209 }
210}
211
212
219void
221{
222 if (0 == id)
223 {
224 memset (pid, 0, sizeof(struct GNUNET_PeerIdentity));
225 return;
226 }
227 GNUNET_assert (id < size);
228 GNUNET_assert (table[id]->rc > 0);
229 *pid = table[id]->id;
230}
231
232
233const struct GNUNET_PeerIdentity *
235{
236 GNUNET_assert (id < size);
237 GNUNET_assert (table[id]->rc > 0);
238 return &table[id]->id;
239}
240
241
242/* end of peer.c */
static int ret
Final status code.
Definition: gnunet-arm.c:93
static struct GNUNET_IDENTITY_Handle * id
Handle to IDENTITY.
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
void * GNUNET_CONTAINER_multipeermap_get(const struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key)
Given a key find a value in the map matching the key.
struct GNUNET_CONTAINER_MultiPeerMap * GNUNET_CONTAINER_multipeermap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
int GNUNET_CONTAINER_multipeermap_put(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multipeermap_remove(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, const void *value)
Remove the given key-value pair from the map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY
There must only be one value per key; storing a value should fail if a value under the same key alrea...
@ GNUNET_OK
@ GNUNET_YES
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void GNUNET_PEER_decrement_rcs(const GNUNET_PEER_Id *ids, unsigned int count)
Decrement multiple RCs of peer identities by one.
Definition: peer.c:157
unsigned int GNUNET_PEER_Id
A GNUNET_PEER_Id is simply a shorter version of a "struct GNUNET_PeerIdentifier" that can be used ins...
GNUNET_PEER_Id GNUNET_PEER_search(const struct GNUNET_PeerIdentity *pid)
Search for a peer identity.
Definition: peer.c:84
void GNUNET_PEER_change_rc(GNUNET_PEER_Id id, int delta)
Change the reference counter of an interned PID.
Definition: peer.c:192
const struct GNUNET_PeerIdentity * GNUNET_PEER_resolve2(GNUNET_PEER_Id id)
Convert an interned PID to a normal peer identity.
Definition: peer.c:234
void GNUNET_PEER_resolve(GNUNET_PEER_Id id, struct GNUNET_PeerIdentity *pid)
Convert an interned PID to a normal peer identity.
Definition: peer.c:220
GNUNET_PEER_Id GNUNET_PEER_intern(const struct GNUNET_PeerIdentity *pid)
Intern an peer identity.
Definition: peer.c:108
static struct PeerEntry ** table
Table with our interned peer IDs.
Definition: peer.c:56
static unsigned int free_list_start
Index of the beginning of the free list in the table; set to "size" if no slots are free in the table...
Definition: peer.c:74
static struct GNUNET_CONTAINER_MultiPeerMap * map
Peermap of PeerIdentities to "struct PeerEntry" (for fast lookup).
Definition: peer.c:63
static unsigned int size
Size of the "table".
Definition: peer.c:68
static struct GNUNET_TIME_Relative delta
Definition: speedup.c:36
Internal representation of the hash map.
The identity of the host (wraps the signing key of the peer).
Per-peer information.
Definition: peer.c:34
struct GNUNET_PeerIdentity id
The identifier itself.
Definition: peer.c:38
unsigned int rc
Reference counter, 0 if this slot is not used.
Definition: peer.c:49
GNUNET_PEER_Id pid
Short version of the identifier; if the RC==0, then index of next free slot in table,...
Definition: peer.c:44