Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Always inline 'inline' functions
authorGabriel Corona <gabriel.corona@loria.fr>
Fri, 20 Jun 2014 12:02:05 +0000 (14:02 +0200)
committerGabriel Corona <gabriel.corona@loria.fr>
Fri, 20 Jun 2014 12:02:05 +0000 (14:02 +0200)
The MC is usually compiled without optimisation as they tend to
confuse the state comparison. But we *really* want to inline functions
declared 'inline'.

src/mc/mc_mmu.h
src/mc/mc_page_snapshot.cpp
src/mc/mc_page_store.cpp
src/mc/mc_private.h

index 0fe1715..7f601c1 100644 (file)
@@ -17,7 +17,8 @@
  *  @param size Byte size
  *  @return Number of memory pages
  */
-static inline size_t mc_page_count(size_t size)
+static inline __attribute__ ((always_inline))
+size_t mc_page_count(size_t size)
 {
   size_t page_count = size >> xbt_pagebits;
   if (size & (xbt_pagesize-1)) {
@@ -31,7 +32,8 @@ static inline size_t mc_page_count(size_t size)
  *  @param address Address
  *  @return Virtual memory page number of the given address
  */
-static inline size_t mc_page_number(void* base, void* address)
+static inline __attribute__ ((always_inline))
+size_t mc_page_number(void* base, void* address)
 {
   xbt_assert(address>=base, "The address is not in the range");
   return ((uintptr_t) address - (uintptr_t) base) >> xbt_pagebits;
@@ -42,7 +44,8 @@ static inline size_t mc_page_number(void* base, void* address)
  *  @param address Address
  *  @return Offset within the memory page
  */
-static inline size_t mc_page_offset(void* address)
+static inline __attribute__ ((always_inline))
+size_t mc_page_offset(void* address)
 {
   return ((uintptr_t) address) & (xbt_pagesize-1);
 }
@@ -52,14 +55,16 @@ static inline size_t mc_page_offset(void* address)
  *  @param base Address of the first page
  *  @param page Index of the page
  */
-static inline void* mc_page_from_number(void* base, size_t page)
+static inline __attribute__ ((always_inline))
+void* mc_page_from_number(void* base, size_t page)
 {
   return (void*) ((char*)base + (page << xbt_pagebits));
 }
 
-static inline bool mc_same_page(void* a, void* b)
+static inline __attribute__ ((always_inline))
+bool mc_same_page(void* a, void* b)
 {
-  return mc_page_number(NULL, a) == mc_page_number(NULL, b);
+  return ((uintptr_t) a >> xbt_pagebits) == ((uintptr_t) b >> xbt_pagebits);
 }
 
 #endif
index 2b905c0..58ea9e7 100644 (file)
@@ -105,7 +105,8 @@ static size_t pread_whole(int fd, void* buf, size_t count, off_t offset) {
   return res;
 }
 
-static inline void mc_ensure_fd(int* fd, const char* path, int flags) {
+static inline  __attribute__ ((always_inline))
+void mc_ensure_fd(int* fd, const char* path, int flags) {
   if (*fd != -1)
     return;
   *fd = open(path, flags);
index 467ade6..85ef6a7 100644 (file)
@@ -34,7 +34,8 @@ static void mc_read_pagemap(uint64_t* pagemap, size_t page_start, size_t page_co
  *  @param data Memory page
  *  @return hash off the page
  */
-static inline uint64_t mc_hash_page(const void* data)
+static inline  __attribute__ ((always_inline))
+uint64_t mc_hash_page(const void* data)
 {
   const uint64_t* values = (const uint64_t*) data;
   size_t n = xbt_pagesize / sizeof(uint64_t);
index cdf0571..0a3883c 100644 (file)
@@ -49,7 +49,8 @@ typedef struct s_mc_mem_region{
   size_t* page_numbers;
 } s_mc_mem_region_t, *mc_mem_region_t;
 
-static inline bool mc_region_contain(mc_mem_region_t region, void* p)
+static inline  __attribute__ ((always_inline))
+bool mc_region_contain(mc_mem_region_t region, void* p)
 {
   return p >= region->start_addr &&
     p < (void*)((char*) region->start_addr + region->size);
@@ -81,7 +82,8 @@ typedef struct s_mc_snapshot{
 
 mc_mem_region_t mc_get_snapshot_region(void* addr, mc_snapshot_t snapshot);
 
-static inline mc_mem_region_t mc_get_region_hinted(void* addr, mc_snapshot_t snapshot, mc_mem_region_t region)
+static inline __attribute__ ((always_inline))
+mc_mem_region_t mc_get_region_hinted(void* addr, mc_snapshot_t snapshot, mc_mem_region_t region)
 {
   if (mc_region_contain(region, addr))
     return region;
@@ -672,14 +674,16 @@ uint64_t mc_hash_processes_state(int num_state, xbt_dynar_t stacks);
 
 //
 
-inline static void* mc_snapshot_get_heap_end(mc_snapshot_t snapshot) {
+static inline __attribute__ ((always_inline))
+  void* mc_snapshot_get_heap_end(mc_snapshot_t snapshot) {
   if(snapshot==NULL)
       xbt_die("snapshot is NULL");
   void** addr = &((xbt_mheap_t)std_heap)->breakval;
   return mc_snapshot_read_pointer(addr, snapshot);
 }
 
-static inline void* mc_snapshot_read_pointer(void* addr, mc_snapshot_t snapshot)
+static inline __attribute__ ((always_inline))
+void* mc_snapshot_read_pointer(void* addr, mc_snapshot_t snapshot)
 {
   void* res;
   return *(void**) mc_snapshot_read(addr, snapshot, &res, sizeof(void*));