2 #include "libshared_memory_internal.h"
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 );
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 )
13 struct libshared_memory_element
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
21 alloc_and_init_memory_element( &me, memory, memory_size_in_bytes );
23 me->known_numa_node_flag = RAISED;
24 me->numa_node_id = numa_node_id;
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 );
37 /****************************************************************************/
38 void libshared_memory_add_memory( struct libshared_memory_state *ms, void *memory, lfds710_pal_uint_t memory_size_in_bytes )
40 struct libshared_memory_element
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
47 alloc_and_init_memory_element( &me, memory, memory_size_in_bytes );
49 me->known_numa_node_flag = LOWERED;
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 );
62 /****************************************************************************/
63 static void alloc_and_init_memory_element( struct libshared_memory_element **me, void *memory, lfds710_pal_uint_t memory_size_in_bytes )
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
74 alignment_bump = (lfds710_pal_uint_t) memory % LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES;
76 if( alignment_bump != 0 )
77 alignment_bump = LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES - alignment_bump;
79 size_in_bytes = sizeof( struct libshared_memory_element );
81 total_size_in_bytes = size_in_bytes + alignment_bump;
83 *me = (struct libshared_memory_element *) ( (char unsigned *) memory + alignment_bump );
85 (*me)->original = memory;
86 (*me)->original_memory_size_in_bytes = memory_size_in_bytes;
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;