GNUnet 0.22.2
gnunet-service-rps_custommap.c File Reference

utilities for managing (information about) peers More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet-service-rps_custommap.h"
#include <inttypes.h>
Include dependency graph for gnunet-service-rps_custommap.c:

Go to the source code of this file.

Data Structures

struct  CustomPeerMap
 Peer map to store peers with specialised use-cases (push_list, pull_list, view, ...) More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "rps-peers", __VA_ARGS__)
 

Functions

struct CustomPeerMapCustomPeerMap_create (unsigned int len)
 Create an empty peermap. More...
 
unsigned int CustomPeerMap_size (const struct CustomPeerMap *c_peer_map)
 Get the size of the custom peer map. More...
 
int CustomPeerMap_put (const struct CustomPeerMap *c_peer_map, const struct GNUNET_PeerIdentity *peer)
 Insert peer into the custom peer map. More...
 
int CustomPeerMap_contains_peer (const struct CustomPeerMap *c_peer_map, const struct GNUNET_PeerIdentity *peer)
 Check whether custom peer map contains a peer. More...
 
static uint32_t * CustomPeerMap_get_index_pointer (const struct CustomPeerMap *c_peer_map, const struct GNUNET_PeerIdentity *peer)
 Get index of peer in custom peer map. More...
 
int CustomPeerMap_remove_peer (const struct CustomPeerMap *c_peer_map, const struct GNUNET_PeerIdentity *peer)
 Remove peer from custom peer map. More...
 
struct GNUNET_PeerIdentityCustomPeerMap_get_peer_by_index (const struct CustomPeerMap *c_peer_map, uint32_t index)
 Get a peer by index. More...
 
int CustomPeerMap_remove_peer_by_index (const struct CustomPeerMap *c_peer_map, uint32_t index)
 Remove peer from custom peer map by index. More...
 
void CustomPeerMap_clear (const struct CustomPeerMap *c_peer_map)
 Clear the custom peer map. More...
 
void CustomPeerMap_destroy (struct CustomPeerMap *c_peer_map)
 Destroy peermap. More...
 

Detailed Description

utilities for managing (information about) peers

Author
Julius Bünger

Definition in file gnunet-service-rps_custommap.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "rps-peers", __VA_ARGS__)

Definition at line 31 of file gnunet-service-rps_custommap.c.

Function Documentation

◆ CustomPeerMap_create()

struct CustomPeerMap * CustomPeerMap_create ( unsigned int  len)

Create an empty peermap.

Parameters
lenthe initial length for the internal maps
Returns
the newly created custom peer map

Definition at line 79 of file gnunet-service-rps_custommap.c.

80{
81 struct CustomPeerMap *c_peer_map;
82
83 c_peer_map = GNUNET_new (struct CustomPeerMap);
86 GNUNET_NO);
87 return c_peer_map;
88}
struct GNUNET_CONTAINER_MultiHashMap32 * GNUNET_CONTAINER_multihashmap32_create(unsigned int len)
Create a 32-bit key multi hash map.
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).
@ GNUNET_NO
#define GNUNET_new(type)
Allocate a struct or union of the given type.
Peer map to store peers with specialised use-cases (push_list, pull_list, view, .....
struct GNUNET_CONTAINER_MultiPeerMap * peer_map
Peermap to quickly check whether a peer is contained.
struct GNUNET_CONTAINER_MultiHashMap32 * hash_map
Multihashmap to be able to access a random index.

References GNUNET_CONTAINER_multihashmap32_create(), GNUNET_CONTAINER_multipeermap_create(), GNUNET_new, GNUNET_NO, CustomPeerMap::hash_map, and CustomPeerMap::peer_map.

Referenced by new_sub().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CustomPeerMap_size()

unsigned int CustomPeerMap_size ( const struct CustomPeerMap c_peer_map)

Get the size of the custom peer map.

Parameters
c_peer_mapthe custom peer map to look in
Returns
size of the map

Definition at line 99 of file gnunet-service-rps_custommap.c.

100{
103 return GNUNET_CONTAINER_multipeermap_size (c_peer_map->peer_map);
104}
unsigned int GNUNET_CONTAINER_multihashmap32_size(const struct GNUNET_CONTAINER_MultiHashMap32 *map)
Get the number of key-value pairs in the map.
unsigned int GNUNET_CONTAINER_multipeermap_size(const struct GNUNET_CONTAINER_MultiPeerMap *map)
Get the number of key-value pairs in the map.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.

References GNUNET_assert, GNUNET_CONTAINER_multihashmap32_size(), GNUNET_CONTAINER_multipeermap_size(), CustomPeerMap::hash_map, and CustomPeerMap::peer_map.

Referenced by CustomPeerMap_clear(), CustomPeerMap_put(), CustomPeerMap_remove_peer(), CustomPeerMap_remove_peer_by_index(), and do_round().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CustomPeerMap_put()

int CustomPeerMap_put ( const struct CustomPeerMap c_peer_map,
const struct GNUNET_PeerIdentity peer 
)

Insert peer into the custom peer map.

Parameters
c_peer_mapthe custom peer map to insert peer
peerthe peer to insert
Returns
GNUNET_OK if map did not contain peer previously GNUNET_NO if map did contain peer previously

Definition at line 117 of file gnunet-service-rps_custommap.c.

119{
120 uint32_t *index;
121 struct GNUNET_PeerIdentity *p;
122
126 peer))
127 {
128 /* Need to store the index of the peer in the peermap to be able to remove
129 * it properly */
130 index = GNUNET_new (uint32_t);
131 *index = CustomPeerMap_size (c_peer_map);
133 *p = *peer;
134 GNUNET_assert (p != peer);
135 GNUNET_assert (0 == memcmp (p,
136 peer,
137 sizeof(struct GNUNET_PeerIdentity)));
139 p,
140 index,
143 *index,
144 p,
147 c_peer_map->hash_map) ==
149 return GNUNET_OK;
150 }
151 return GNUNET_NO;
152}
unsigned int CustomPeerMap_size(const struct CustomPeerMap *c_peer_map)
Get the size of the custom peer map.
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-uri.c:38
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap32_put(struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multipeermap_contains(const struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key)
Check if the map contains any value under the given key (including values that are NULL).
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.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST
, ' bother checking if a value already exists (faster than GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE...
@ GNUNET_OK
The identity of the host (wraps the signing key of the peer).

References CustomPeerMap_size(), GNUNET_assert, GNUNET_CONTAINER_multihashmap32_put(), GNUNET_CONTAINER_multihashmap32_size(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_CONTAINER_multipeermap_contains(), GNUNET_CONTAINER_multipeermap_put(), GNUNET_CONTAINER_multipeermap_size(), GNUNET_new, GNUNET_NO, GNUNET_OK, CustomPeerMap::hash_map, p, and CustomPeerMap::peer_map.

Referenced by handle_peer_pull_reply(), handle_peer_push(), and insert_in_pull_map().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CustomPeerMap_contains_peer()

int CustomPeerMap_contains_peer ( const struct CustomPeerMap c_peer_map,
const struct GNUNET_PeerIdentity peer 
)

Check whether custom peer map contains a peer.

Parameters
c_peer_mapthe custom peer map to look in
peerthe peer to check for
Returns
GNUNET_OK if map contains peer GNUNET_NO otherwise

Definition at line 165 of file gnunet-service-rps_custommap.c.

167{
168 return GNUNET_CONTAINER_multipeermap_contains (c_peer_map->peer_map, peer);
169}

References GNUNET_CONTAINER_multipeermap_contains(), and CustomPeerMap::peer_map.

Referenced by check_sending_channel_needed(), clean_peer(), CustomPeerMap_get_index_pointer(), and CustomPeerMap_remove_peer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CustomPeerMap_get_index_pointer()

static uint32_t * CustomPeerMap_get_index_pointer ( const struct CustomPeerMap c_peer_map,
const struct GNUNET_PeerIdentity peer 
)
static

Get index of peer in custom peer map.

Parameters
c_peer_mapthe custom peer map to look in
peerthe peer to get the index from
Returns
the index

Definition at line 181 of file gnunet-service-rps_custommap.c.

183{
184 uint32_t *index;
185
187 index = GNUNET_CONTAINER_multipeermap_get (c_peer_map->peer_map, peer);
188 return index;
189}
int CustomPeerMap_contains_peer(const struct CustomPeerMap *c_peer_map, const struct GNUNET_PeerIdentity *peer)
Check whether custom peer map contains a peer.
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.
@ GNUNET_YES

References CustomPeerMap_contains_peer(), GNUNET_assert, GNUNET_CONTAINER_multipeermap_get(), GNUNET_YES, and CustomPeerMap::peer_map.

Referenced by CustomPeerMap_remove_peer(), and CustomPeerMap_remove_peer_by_index().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CustomPeerMap_remove_peer()

int CustomPeerMap_remove_peer ( const struct CustomPeerMap c_peer_map,
const struct GNUNET_PeerIdentity peer 
)

Remove peer from custom peer map.

Parameters
c_peer_mapthe custom peer map to remove the peer from
peerthe peer to remove
Returns
GNUNET_OK if map contained peer and removed it successfully GNUNET_NO if map does not contain peer

Definition at line 202 of file gnunet-service-rps_custommap.c.

204{
205 uint32_t *index;
206 struct GNUNET_PeerIdentity *p;
207 uint32_t *last_index;
208 struct GNUNET_PeerIdentity *last_p;
209 int ret;
210
211 if (GNUNET_NO == CustomPeerMap_contains_peer (c_peer_map,
212 peer))
213 {
214 return GNUNET_NO;
215 }
216 index = CustomPeerMap_get_index_pointer (c_peer_map,
217 peer);
218 GNUNET_assert (*index < CustomPeerMap_size (c_peer_map));
219 /* Need to get the pointer stored in the hashmap to free it */
221 *index);
222 GNUNET_assert (NULL != p);
224 *index);
225 // TODO wrong peerid?
227 peer);
228 if (*index != CustomPeerMap_size (c_peer_map))
229 { /* fill 'gap' with peer at last index */
230 last_p =
232 CustomPeerMap_size (c_peer_map));
233 GNUNET_assert (NULL != last_p);
234 last_index = GNUNET_CONTAINER_multipeermap_get (c_peer_map->peer_map,
235 last_p);
236 GNUNET_assert (NULL != last_index);
237 GNUNET_assert (CustomPeerMap_size (c_peer_map) == *last_index);
239 *index,
240 last_p,
244 *last_index);
245 *last_index = *index;
246 }
247 GNUNET_free (index);
250 GNUNET_free (p);
251 return GNUNET_OK;
252}
static int ret
Final status code.
Definition: gnunet-arm.c:93
static uint32_t * CustomPeerMap_get_index_pointer(const struct CustomPeerMap *c_peer_map, const struct GNUNET_PeerIdentity *peer)
Get index of peer in custom peer map.
void * GNUNET_CONTAINER_multihashmap32_get(const struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key)
Given a key find a value in the map matching the key.
int GNUNET_CONTAINER_multipeermap_remove_all(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key)
Remove all entries for the given key from the map.
int GNUNET_CONTAINER_multihashmap32_remove_all(struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key)
Remove all entries for the given key 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...
#define GNUNET_free(ptr)
Wrapper around free.

References CustomPeerMap_contains_peer(), CustomPeerMap_get_index_pointer(), CustomPeerMap_size(), GNUNET_assert, GNUNET_CONTAINER_multihashmap32_get(), GNUNET_CONTAINER_multihashmap32_put(), GNUNET_CONTAINER_multihashmap32_remove_all(), GNUNET_CONTAINER_multihashmap32_size(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_CONTAINER_multipeermap_get(), GNUNET_CONTAINER_multipeermap_remove_all(), GNUNET_CONTAINER_multipeermap_size(), GNUNET_free, GNUNET_NO, GNUNET_OK, CustomPeerMap::hash_map, p, CustomPeerMap::peer_map, and ret.

Referenced by CustomPeerMap_remove_peer_by_index(), and remove_peer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CustomPeerMap_get_peer_by_index()

struct GNUNET_PeerIdentity * CustomPeerMap_get_peer_by_index ( const struct CustomPeerMap c_peer_map,
uint32_t  index 
)

Get a peer by index.

Parameters
c_peer_mapthe custom peer map to look in
indexthe index of the peer to get
Returns
peer to the corresponding index. if this index is not known, return NULL

Definition at line 265 of file gnunet-service-rps_custommap.c.

267{
268 if (GNUNET_YES ==
270 {
271 return GNUNET_CONTAINER_multihashmap32_get (c_peer_map->hash_map, index);
272 }
273 return NULL;
274}
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap32_contains(const struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key)
Check if the map contains any value under the given key (including values that are NULL).

References GNUNET_CONTAINER_multihashmap32_contains(), GNUNET_CONTAINER_multihashmap32_get(), GNUNET_YES, and CustomPeerMap::hash_map.

Referenced by CustomPeerMap_remove_peer_by_index(), and do_round().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CustomPeerMap_remove_peer_by_index()

int CustomPeerMap_remove_peer_by_index ( const struct CustomPeerMap c_peer_map,
uint32_t  index 
)

Remove peer from custom peer map by index.

Parameters
c_peer_mapthe custom peer map to remove the peer from
indexthe index of the peer to remove
Returns
GNUNET_OK if map contained peer and removed it successfully GNUNET_NO if map does not contain (index of) peer

Definition at line 287 of file gnunet-service-rps_custommap.c.

289{
290 uint32_t *index_p;
291 struct GNUNET_PeerIdentity *peer;
292
293 if (index >= CustomPeerMap_size (c_peer_map))
294 {
295 return GNUNET_NO;
296 }
299 if (GNUNET_NO ==
301 {
302 return GNUNET_NO;
303 }
304 peer = CustomPeerMap_get_peer_by_index (c_peer_map, index);
305 GNUNET_assert (NULL != peer);
306 index_p = CustomPeerMap_get_index_pointer (c_peer_map, peer);
307 GNUNET_assert (index == *index_p);
308 CustomPeerMap_remove_peer (c_peer_map, peer);
311 return GNUNET_OK;
312}
int CustomPeerMap_remove_peer(const struct CustomPeerMap *c_peer_map, const struct GNUNET_PeerIdentity *peer)
Remove peer from custom peer map.
struct GNUNET_PeerIdentity * CustomPeerMap_get_peer_by_index(const struct CustomPeerMap *c_peer_map, uint32_t index)
Get a peer by index.

References CustomPeerMap_get_index_pointer(), CustomPeerMap_get_peer_by_index(), CustomPeerMap_remove_peer(), CustomPeerMap_size(), GNUNET_assert, GNUNET_CONTAINER_multihashmap32_contains(), GNUNET_CONTAINER_multihashmap32_size(), GNUNET_CONTAINER_multipeermap_size(), GNUNET_NO, GNUNET_OK, CustomPeerMap::hash_map, and CustomPeerMap::peer_map.

Referenced by CustomPeerMap_clear().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CustomPeerMap_clear()

void CustomPeerMap_clear ( const struct CustomPeerMap c_peer_map)

Clear the custom peer map.

Parameters
c_peer_mapthe custom peer map to look in
Returns
size of the map

Definition at line 323 of file gnunet-service-rps_custommap.c.

324{
325 while (0 < CustomPeerMap_size (c_peer_map))
326 {
329 c_peer_map->hash_map,
331 c_peer_map) - 1));
335 c_peer_map) - 1));
336 }
337 GNUNET_assert (0 == CustomPeerMap_size (c_peer_map));
338}
int CustomPeerMap_remove_peer_by_index(const struct CustomPeerMap *c_peer_map, uint32_t index)
Remove peer from custom peer map by index.

References CustomPeerMap_remove_peer_by_index(), CustomPeerMap_size(), GNUNET_assert, GNUNET_CONTAINER_multihashmap32_contains(), GNUNET_OK, GNUNET_YES, and CustomPeerMap::hash_map.

Referenced by CustomPeerMap_destroy(), and do_round().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CustomPeerMap_destroy()

void CustomPeerMap_destroy ( struct CustomPeerMap c_peer_map)

Destroy peermap.

Parameters
c_peer_mapthe map to destroy

Definition at line 347 of file gnunet-service-rps_custommap.c.

348{
349 CustomPeerMap_clear (c_peer_map);
352 GNUNET_free (c_peer_map);
353}
void CustomPeerMap_clear(const struct CustomPeerMap *c_peer_map)
Clear the custom peer map.
void GNUNET_CONTAINER_multipeermap_destroy(struct GNUNET_CONTAINER_MultiPeerMap *map)
Destroy a hash map.
void GNUNET_CONTAINER_multihashmap32_destroy(struct GNUNET_CONTAINER_MultiHashMap32 *map)
Destroy a 32-bit key hash map.

References CustomPeerMap_clear(), GNUNET_CONTAINER_multihashmap32_destroy(), GNUNET_CONTAINER_multipeermap_destroy(), GNUNET_free, CustomPeerMap::hash_map, and CustomPeerMap::peer_map.

Referenced by destroy_sub().

Here is the call graph for this function:
Here is the caller graph for this function: