property: fix getting dirty serial value

__system_property_serial just returned serial value without
checking if it is dirty, so check and wait until serial
value is not dirty before return

Change-Id: If485b6251b5555b004912c66c7c2cb455a7fdbdc
Signed-off-by: jiaguo <jiaguo@marvell.com>
diff --git a/libc/bionic/system_properties.cpp b/libc/bionic/system_properties.cpp
index 56f3724..4e4684a 100644
--- a/libc/bionic/system_properties.cpp
+++ b/libc/bionic/system_properties.cpp
@@ -609,23 +609,17 @@
 
 int __system_property_read(const prop_info *pi, char *name, char *value)
 {
-    unsigned serial, len;
-
     if (__predict_false(compat_mode)) {
         return __system_property_read_compat(pi, name, value);
     }
 
-    for(;;) {
-        serial = pi->serial;
-        while(SERIAL_DIRTY(serial)) {
-            __futex_wait((volatile void *)&pi->serial, serial, NULL);
-            serial = pi->serial;
-        }
-        len = SERIAL_VALUE_LEN(serial);
+    while (true) {
+        uint32_t serial = __system_property_serial(pi);
+        size_t len = SERIAL_VALUE_LEN(serial);
         memcpy(value, pi->value, len + 1);
         ANDROID_MEMBAR_FULL();
-        if(serial == pi->serial) {
-            if(name != 0) {
+        if (serial == pi->serial) {
+            if (name != 0) {
                 strcpy(name, pi->name);
             }
             return len;
@@ -678,7 +672,7 @@
         const uint32_t n = pi->serial;
         do {
             __futex_wait((volatile void *)&pi->serial, n, NULL);
-        } while(n == pi->serial);
+        } while (n == pi->serial);
     }
     return 0;
 }
@@ -702,6 +696,7 @@
 
     return 0;
 }
+
 int __system_property_add(const char *name, unsigned int namelen,
             const char *value, unsigned int valuelen)
 {
@@ -726,7 +721,12 @@
 
 unsigned int __system_property_serial(const prop_info *pi)
 {
-    return pi->serial;
+    uint32_t serial = pi->serial;
+    while (SERIAL_DIRTY(serial)) {
+        __futex_wait(const_cast<volatile uint32_t*>(&pi->serial), serial, NULL);
+        serial = pi->serial;
+    }
+    return serial;
 }
 
 unsigned int __system_property_wait_any(unsigned int serial)
@@ -735,7 +735,7 @@
 
     do {
         __futex_wait(&pa->serial, serial, NULL);
-    } while(pa->serial == serial);
+    } while (pa->serial == serial);
 
     return pa->serial;
 }