improvement1:
Current code makes more readable messages to vanish as pull_len = len

                        |------- pull_len = len ----------|
|----------< len >-----------------|                        ^ new r_off
^old w_off         ^r_off      ^new w_off

New version reduces the total skipped readable messages

                        |- pull_len = (len - (r_off - old_w_off)) + 1 --|
|----------< len >-----------------|                                        
      ^ new r_off
^old w_off         ^r_off      ^new w_off

improvement2:
If we have fixed one r_off the same fix can be applied to all other
offsets

Signed-off-by: Arun chandran <[email protected]>
---
 drivers/staging/android/logger.c |   37 
+++++++++++++++++++++++++++++++++----
 1 file changed, 33 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/android/logger.c 
b/drivers/staging/android/logger.c
index eb3d4ca..2c5d882 100644
--- a/drivers/staging/android/logger.c
+++ b/drivers/staging/android/logger.c
@@ -366,6 +366,24 @@ static inline int is_between(size_t a, size_t b, 
size_t c)
 }
 
 /*
+ * find_pull_len - calculate how much we need to pull lapped readers
+ *
+ * Caller must hold log->mutex.
+ */
+static size_t find_pull_len(struct logger_log *log, size_t from, size_t 
len)
+{
+    size_t skip_len;
+
+    if (from > log->w_off)
+        skip_len = from - log->w_off;
+    else
+        skip_len = log->size - (log->w_off - from);
+
+    /* +1 so that w_off and r_off don't collide */
+    return (len - skip_len) + 1;
+}
+
+/*
  * fix_up_readers - walk the list of all readers and "fix up" any who were
  * lapped by the writer; also do the same for the default "start head".
  * We do this by "pulling forward" the readers and start head to the first
@@ -377,14 +395,25 @@ static void fix_up_readers(struct logger_log *log, 
size_t len)
 {
     size_t old = log->w_off;
     size_t new = logger_offset(log, old + len);
+    size_t pull, fix = 0;
     struct logger_reader *reader;
 
-    if (is_between(old, new, log->head))
-        log->head = get_next_entry(log, log->head, len);
+    if (is_between(old, new, log->head)) {
+        pull = find_pull_len(log, log->head, len);
+        fix = get_next_entry(log, log->head, pull);
+        log->head = fix;
+    }
 
     list_for_each_entry(reader, &log->readers, list)
-        if (is_between(old, new, reader->r_off))
-            reader->r_off = get_next_entry(log, reader->r_off, len);
+        if (is_between(old, new, reader->r_off)) {
+            if (fix) {
+                reader->r_off = fix;
+            } else {
+                pull = find_pull_len(log, reader->r_off, len);
+                fix = get_next_entry(log, reader->r_off, pull);
+                reader->r_off = fix;
+            }
+        }
 }
 
 /*
-- 
1.7.9.5

-- 
-- 
unsubscribe: [email protected]
website: http://groups.google.com/group/android-kernel
--- 
You received this message because you are subscribed to the Google Groups 
"Android Linux Kernel Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


>From 5abbb49c981fd928c7ae8b4b2d4fdd685c9868fb Mon Sep 17 00:00:00 2001
From: Arun chandran <[email protected]>
Date: Sun, 7 Apr 2013 15:08:00 +0530
Subject: [PATCH] Android logger:improve fix_up_readers()

improvement1:
Current code makes more readable messages to vanish as pull_len = len

                   |------- pull_len = len ----------|
|----------< len >-----------------|                 ^ new r_off
^old w_off         ^r_off          ^new w_off

New version reduces the total skipped readable messages

                   |- pull_len = (len - (r_off - old_w_off)) + 1 --|
|----------< len >-----------------|                               ^ new r_off
^old w_off         ^r_off          ^new w_off

improvement2:
If we have fixed one r_off the same fix can be applied to all other
offsets

Signed-off-by: Arun chandran <[email protected]>
---
 drivers/staging/android/logger.c |   37 +++++++++++++++++++++++++++++++++----
 1 file changed, 33 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c
index eb3d4ca..2c5d882 100644
--- a/drivers/staging/android/logger.c
+++ b/drivers/staging/android/logger.c
@@ -366,6 +366,24 @@ static inline int is_between(size_t a, size_t b, size_t c)
 }
 
 /*
+ * find_pull_len - calculate how much we need to pull lapped readers
+ *
+ * Caller must hold log->mutex.
+ */
+static size_t find_pull_len(struct logger_log *log, size_t from, size_t len)
+{
+	size_t skip_len;
+
+	if (from > log->w_off)
+		skip_len = from - log->w_off;
+	else
+		skip_len = log->size - (log->w_off - from);
+
+	/* +1 so that w_off and r_off don't collide */
+	return (len - skip_len) + 1;
+}
+
+/*
  * fix_up_readers - walk the list of all readers and "fix up" any who were
  * lapped by the writer; also do the same for the default "start head".
  * We do this by "pulling forward" the readers and start head to the first
@@ -377,14 +395,25 @@ static void fix_up_readers(struct logger_log *log, size_t len)
 {
 	size_t old = log->w_off;
 	size_t new = logger_offset(log, old + len);
+	size_t pull, fix = 0;
 	struct logger_reader *reader;
 
-	if (is_between(old, new, log->head))
-		log->head = get_next_entry(log, log->head, len);
+	if (is_between(old, new, log->head)) {
+		pull = find_pull_len(log, log->head, len);
+		fix = get_next_entry(log, log->head, pull);
+		log->head = fix;
+	}
 
 	list_for_each_entry(reader, &log->readers, list)
-		if (is_between(old, new, reader->r_off))
-			reader->r_off = get_next_entry(log, reader->r_off, len);
+		if (is_between(old, new, reader->r_off)) {
+			if (fix) {
+				reader->r_off = fix;
+			} else {
+				pull = find_pull_len(log, reader->r_off, len);
+				fix = get_next_entry(log, reader->r_off, pull);
+				reader->r_off = fix;
+			}
+		}
 }
 
 /*
-- 
1.7.9.5

Reply via email to