]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/test_and_benchmark/libshared/src/libshared_memory/libshared_memory_add.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / test_and_benchmark / libshared / src / libshared_memory / libshared_memory_add.c
1 /***** includes *****/
2 #include "libshared_memory_internal.h"
3
4 /***** private prototypes *****/
5 static void alloc_and_init_memory_element( struct libshared_memory_element **me, void *memory, lfds710_pal_uint_t memory_size_in_bytes );
6
7
8
9
10 /****************************************************************************/
11 void libshared_memory_add_memory_from_numa_node( struct libshared_memory_state *ms, lfds710_pal_uint_t numa_node_id, void *memory, lfds710_pal_uint_t memory_size_in_bytes )
12 {
13   struct libshared_memory_element
14     *me;
15
16   LFDS710_PAL_ASSERT( ms != NULL );
17   // TRD : numa_node_id can be any value in its range
18   LFDS710_PAL_ASSERT( memory != NULL );
19   // TRD : memory_size_in_bytes can be any value in its range
20
21   alloc_and_init_memory_element( &me, memory, memory_size_in_bytes );
22
23   me->known_numa_node_flag = RAISED;
24   me->numa_node_id = numa_node_id;
25
26   LFDS710_LIST_ASU_SET_KEY_IN_ELEMENT( me->lasue, me );
27   LFDS710_LIST_ASU_SET_VALUE_IN_ELEMENT( me->lasue, me );
28   lfds710_list_asu_insert_at_start( &ms->list_of_allocations, &me->lasue );
29
30   return;
31 }
32
33
34
35
36
37 /****************************************************************************/
38 void libshared_memory_add_memory( struct libshared_memory_state *ms, void *memory, lfds710_pal_uint_t memory_size_in_bytes )
39 {
40   struct libshared_memory_element
41     *me;
42
43   LFDS710_PAL_ASSERT( ms != NULL );
44   LFDS710_PAL_ASSERT( memory != NULL );
45   // TRD : memory_size_in_bytes can be any value in its range
46
47   alloc_and_init_memory_element( &me, memory, memory_size_in_bytes );
48
49   me->known_numa_node_flag = LOWERED;
50
51   LFDS710_LIST_ASU_SET_KEY_IN_ELEMENT( me->lasue, me );
52   LFDS710_LIST_ASU_SET_VALUE_IN_ELEMENT( me->lasue, me );
53   lfds710_list_asu_insert_at_start( &ms->list_of_allocations, &me->lasue );
54
55   return;
56 }
57
58
59
60
61
62 /****************************************************************************/
63 static void alloc_and_init_memory_element( struct libshared_memory_element **me, void *memory, lfds710_pal_uint_t memory_size_in_bytes )
64 {
65   lfds710_pal_uint_t
66     alignment_bump,
67     size_in_bytes,
68     total_size_in_bytes;
69
70   LFDS710_PAL_ASSERT( me != NULL );
71   LFDS710_PAL_ASSERT( memory != NULL );
72   // TRD : memory_size_in_bytes can be any value in its range
73
74   alignment_bump = (lfds710_pal_uint_t) memory % LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES;
75
76   if( alignment_bump != 0 )
77     alignment_bump = LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES - alignment_bump;
78
79   size_in_bytes = sizeof( struct libshared_memory_element );
80
81   total_size_in_bytes = size_in_bytes + alignment_bump;
82
83   *me = (struct libshared_memory_element *) ( (char unsigned *) memory + alignment_bump );
84
85   (*me)->original = memory;
86   (*me)->original_memory_size_in_bytes = memory_size_in_bytes;
87
88   (*me)->original_after_me_alloc = (*me)->current_pointer = (char unsigned *) memory + total_size_in_bytes;
89   (*me)->original_after_me_alloc_memory_size_in_bytes = (*me)->current_memory_size_in_bytes = memory_size_in_bytes - total_size_in_bytes;
90
91   return;
92 }
93