raster pushed a commit to branch master.
commit d15d86e26fadb1c27afde01544b2b3e07d2e4c33
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date: Sat Jul 6 22:01:23 2013 +0900
eina: add eina_file_map_populate()
---
ChangeLog | 4 ++++
NEWS | 1 +
src/lib/eina/eina_file.c | 17 +++++++++++++++++
src/lib/eina/eina_file.h | 22 +++++++++++++++++++++-
4 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/ChangeLog b/ChangeLog
index bf1c398..dc773b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-07-06 Carsten Haitzler (The Rasterman)
+
+ * Add direct eina file map populate controls
+
2013-07-04 Cedric Bail
* Eina: add eina_tiler_area_size_set and eina_tiler_strict_set to make
Eina_Tiler in par with Evas_Tilebuf.
diff --git a/NEWS b/NEWS
index 8539047..3ffbb8c 100644
--- a/NEWS
+++ b/NEWS
@@ -32,6 +32,7 @@ Additions:
- Add eina_str_convert_len() to work around broken eina_str_convert()
- Add eina_file_dup()
- Add eina_tiler_area_size_set(), eina_tiler_strict_set()
+ - Add eina_file_map_populate()
* Eet:
- Add eet_mmap()
- Add eet_data_descriptor_name_get()
diff --git a/src/lib/eina/eina_file.c b/src/lib/eina/eina_file.c
index 4cc44eb..6cc1e38 100644
--- a/src/lib/eina/eina_file.c
+++ b/src/lib/eina/eina_file.c
@@ -376,6 +376,9 @@ _eina_file_map_rule_apply(Eina_File_Populate rule, void
*addr, unsigned long int
case EINA_FILE_SEQUENTIAL: flag = MADV_SEQUENTIAL; break;
case EINA_FILE_POPULATE: flag = MADV_WILLNEED; break;
case EINA_FILE_WILLNEED: flag = MADV_WILLNEED; break;
+ case EINA_FILE_DONTNEED: flag = MADV_DONTNEED; break;
+ case EINA_FILE_REMOVE: flag = MADV_REMOVE; break;
+ default: return tmp; break;
}
madvise(addr, size, flag);
@@ -1079,6 +1082,20 @@ eina_file_map_free(Eina_File *file, void *map)
eina_lock_release(&file->lock);
}
+EAPI void
+eina_file_map_populate(Eina_File *file, Eina_File_Populate rule, void *map,
+ unsigned long int offset, unsigned long int length)
+{
+ Eina_File_Map *em;
+
+ EINA_SAFETY_ON_NULL_RETURN(file);
+ eina_lock_take(&file->lock);
+ em = eina_hash_find(file->rmap, &map);
+ if (em) _eina_file_map_rule_apply(rule, ((char *)em->map) + offset,
+ length, em->hugetlb);
+ eina_lock_release(&file->lock);
+}
+
EAPI Eina_Bool
eina_file_map_faulted(Eina_File *file, void *map)
{
diff --git a/src/lib/eina/eina_file.h b/src/lib/eina/eina_file.h
index 0f77c69..265f4bd 100644
--- a/src/lib/eina/eina_file.h
+++ b/src/lib/eina/eina_file.h
@@ -139,7 +139,9 @@ typedef enum {
EINA_FILE_RANDOM, /**< Advise random memory access to the mapped memory.
*/
EINA_FILE_SEQUENTIAL, /**< Advise sequential memory access to the mapped
memory. */
EINA_FILE_WILLNEED, /**< Advise need for all the mapped memory. */
- EINA_FILE_POPULATE /**< Request all the mapped memory. */
+ EINA_FILE_POPULATE, /**< Request all the mapped memory. */
+ EINA_FILE_DONTNEED, /**< Indicate that the memory is no longer needed.
This may result in the memory being removed from any caches if applicable.
@since 1.8 */
+ EINA_FILE_REMOVE /**< This memory is to be released and any content
will be lost. Subsequent accesses will succeed but return fresh memory as if
accessed for the first time. This may not suceed if the filesystem does not
support it. @since 1.8 */
} Eina_File_Populate;
/* Why do this? Well PATH_MAX may vary from when eina itself is compiled
@@ -577,6 +579,24 @@ EAPI void *eina_file_map_new(Eina_File *file,
Eina_File_Populate rule,
EAPI void eina_file_map_free(Eina_File *file, void *map);
/**
+ * @brief Ask the OS to populate or otherwise pages of memory in file mapping
+ *
+ * @param file The file handle from whih the map comes
+ * @param map Memory that was mapped inside of which the memory range is
+ * @param offset The offset in bytes from the start of the map address
+ * @param length The length in bytes of the memory region to populate
+ *
+ * This advises the operating system as to what to do with the memory mapped
+ * to the given @p file. This affects a specific range of memory and may not
+ * be honored if the system chooses to ignore the request.
+ *
+ * @sine 1.8
+ */
+EAPI void
+eina_file_map_populate(Eina_File *file, Eina_File_Populate rule, void *map,
+ unsigned long int offset, unsigned long int length);
+
+/**
* @brief Map line by line in memory efficiently with an Eina_Iterator
* @param file The file to run over
* @return an Eina_Iterator that will produce @typedef Eina_File_Lines.
--
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev