Add circular logging

Change-Id: Ide8bf41e24a427643a3a17b1c9089993790c12a6
Signed-off-by: Dave Barach <dave@barachs.net>
diff --git a/src/vppinfra/maplog.h b/src/vppinfra/maplog.h
index 9bc8596..67a83a7 100644
--- a/src/vppinfra/maplog.h
+++ b/src/vppinfra/maplog.h
@@ -45,12 +45,12 @@
   u8 maplog_major_version;	/**< library major version number */
   u8 maplog_minor_version;	/**< library minor version number */
   u8 maplog_patch_version;	/**< library patch version number */
-  u8 pad;
+  u8 maplog_flag_wrapped;	/**< log has wrapped */
   u32 application_id;		/**< application identifier */
   u8 application_major_version;	/**< application major version number */
   u8 application_minor_version;	/**< application minor version number */
   u8 application_patch_version;	/**< application patch version number */
-  u8 pad2;
+  u8 maplog_flag_circular;	/**< log is circular */
   u32 record_size_in_cachelines; /**< record size in cache lines */
   u32 cacheline_size;		 /**< cache line size  */
   u64 file_size_in_records;	 /**< file size in records */
@@ -60,7 +60,7 @@
 } clib_maplog_header_t;
 
 #define MAPLOG_MAJOR_VERSION 1
-#define MAPLOG_MINOR_VERSION 0
+#define MAPLOG_MINOR_VERSION 1
 #define MAPLOG_PATCH_VERSION 0
 
 /** Process-private main data structure */
@@ -90,6 +90,8 @@
 
 /* flag bits */
 #define CLIB_MAPLOG_FLAG_INIT 	(1<<0)
+#define CLIB_MAPLOG_FLAG_CIRCULAR (1<<1)
+#define CLIB_MAPLOG_FLAG_WRAPPED (1<<2)
 
 /** log initialization structure */
 typedef struct
@@ -102,6 +104,7 @@
   u8 application_major_version;	/**< applcation major version number */
   u8 application_minor_version;	/**< applcation minor version number */
   u8 application_patch_version;	/**< applcation patch version number */
+  u8 maplog_is_circular;	/**< single, circular log */
 } clib_maplog_init_args_t;
 
 /* function prototypes */
@@ -139,9 +142,15 @@
   /* Time to unmap and create a new logfile? */
   if (PREDICT_FALSE ((my_record_index & (mm->file_size_in_records - 1)) == 0))
     {
-      /* Yes, but not the very first time... (;-)... */
-      if (my_record_index)
-	return _clib_maplog_get_entry_slowpath (mm, my_record_index);
+      /* Regular log? Switch file... */
+      if (!(mm->flags & CLIB_MAPLOG_FLAG_CIRCULAR))
+	{
+	  /* Yes, but not the very first time... (;-)... */
+	  if (my_record_index)
+	    return _clib_maplog_get_entry_slowpath (mm, my_record_index);
+	}
+      else			/* Circular log: set the wrap bit and move along */
+	mm->flags |= CLIB_MAPLOG_FLAG_WRAPPED;
       /* FALLTHROUGH */
     }