Multi-ApplicationOnlineProfiling  2.1
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Bloom_Filter.h
Go to the documentation of this file.
1 /* ############################ MALP License ############################## */
2 /* # Fri Jan 18 14:00:00 CET 2013 # */
3 /* # Copyright or (C) or Copr. Commissariat a l'Energie Atomique # */
4 /* # # */
5 /* # This software is governed by the CeCILL-C license under French law # */
6 /* # and abiding by the rules of distribution of free software. You can # */
7 /* # use, modify and/ or redistribute the software under the terms of # */
8 /* # the CeCILL-C license as circulated by CEA, CNRS and INRIA at the # */
9 /* # following URL http://www.cecill.info. # */
10 /* # # */
11 /* # The fact that you are presently reading this means that you have # */
12 /* # had knowledge of the CeCILL-C license and that you accept its # */
13 /* # terms. # */
14 /* # # */
15 /* # Authors: # */
16 /* # - BESNARD Jean-Baptiste jean-baptiste.besnard@cea.fr # */
17 /* # # */
18 /* ######################################################################## */
19 
26 #ifndef BLOOM_FILTER_H
27 #define BLOOM_FILTER_H
28 
29 #include "Bit_Array.h"
30 #include "Spinlock.h"
31 #include "CRC64.h"
32 
33 #ifdef __cplusplus
34  extern "C"
35  {
36 #endif
37 
42 {
43  struct Bit_Array array;
45  uint64_t size;
46  size_t sizeof_payload;
47 };
48 
55 void Bloom_Filter_init( struct Bloom_Filter *bf , uint64_t size, size_t sizeof_payload );
56 
61 void Bloom_Filter_release( struct Bloom_Filter *bf );
62 
69 static inline uint64_t Bloom_Filter_get_cell( struct Bloom_Filter *bf , void *payload )
70 {
71  uint64_t key = MALP_Trace_crc64( (char *)payload, bf->sizeof_payload );
72 
73  return (key % bf->size);
74 }
75 
81 static inline void Bloom_Filter_push( struct Bloom_Filter *bf , void *payload )
82 {
83  uint64_t cell = Bloom_Filter_get_cell( bf , payload );
84 
85  MALP_Spinlock_lock( &bf->lock );
86  Bit_Array_set( &bf->array, cell, 1 );
87  MALP_Spinlock_unlock( &bf->lock );
88 }
89 
96 static inline int Bloom_Filter_test( struct Bloom_Filter *bf , void *payload )
97 {
98  uint64_t ret = 0;
99  uint64_t cell = Bloom_Filter_get_cell( bf , payload );
100 
101  MALP_Spinlock_lock( &bf->lock );
102  ret = Bit_Array_get( &bf->array, cell);
103  MALP_Spinlock_unlock( &bf->lock );
104 
105  return ret;
106 }
107 
115 void Bloom_Filter_replicate( struct Bloom_Filter *dest , struct Bloom_Filter *src );
116 
117 
118 #ifdef __cplusplus
119 }
120 #endif
121 
122 #endif /* BLOOM_FILTER_H */
123 
static uint64_t MALP_Trace_crc64(char *source, uint64_t size)
Computes the hash of a given data.
Definition: CRC64.h:54
struct Bit_Array array
The bit Array containing the filter data.
Definition: Bloom_Filter.h:43
uint64_t size
The number of uint8_t array contains.
Definition: Bit_Array.h:92
MALP_Spinlock lock
The lock for concurrent access on the bit array.
Definition: Bloom_Filter.h:44
static void Bloom_Filter_push(struct Bloom_Filter *bf, void *payload)
Adds an element to the filter.
Definition: Bloom_Filter.h:81
static uint64_t Bloom_Filter_get_cell(struct Bloom_Filter *bf, void *payload)
Gets the given element's index within internal bit array.
Definition: Bloom_Filter.h:69
int MALP_Spinlock_unlock(MALP_Spinlock *mutex)
Unlocks the given MALP_Spinlock.
Definition: Spinlock.c:41
void Bloom_Filter_release(struct Bloom_Filter *bf)
Releases a Bloom_Filter.
Definition: Bloom_Filter.c:32
This is the main structure defining the Bloom Filter.
Definition: Bloom_Filter.h:41
size_t sizeof_payload
The size of elements that can be added to the filter.
Definition: Bloom_Filter.h:46
int MALP_Spinlock_lock(MALP_Spinlock *mutex)
Locks the given MALP_Spinlock.
Definition: Spinlock.c:29
static int Bloom_Filter_test(struct Bloom_Filter *bf, void *payload)
Tests if the filter contains an element.
Definition: Bloom_Filter.h:96
static void Bit_Array_set(struct Bit_Array *ba, uint64_t key, uint8_t value)
Sets a bit in a Bit_Array.
Definition: Bit_Array.h:140
volatile unsigned int MALP_Spinlock
The type of spinlocks in MALP.
Definition: Spinlock.h:63
void Bloom_Filter_init(struct Bloom_Filter *bf, uint64_t size, size_t sizeof_payload)
Initializes a Bloom_Filter.
Definition: Bloom_Filter.c:24
static uint8_t Bit_Array_get(struct Bit_Array *ba, uint64_t key)
Gets a bit in a Bit_Array.
Definition: Bit_Array.h:167
uint64_t size
The size of the filter data.
Definition: Bloom_Filter.h:45
void Bloom_Filter_replicate(struct Bloom_Filter *dest, struct Bloom_Filter *src)
Copies a Bloom_Filter within an other.
Definition: Bloom_Filter.c:42
Defines a bit array.
Definition: Bit_Array.h:90