From 879d33049946fa2293a61dbdb20addace953922b Mon Sep 17 00:00:00 2001 From: jiaguo Date: Thu, 13 Mar 2014 17:39:58 +0800 Subject: [PATCH] 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 --- libc/bionic/system_properties.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/libc/bionic/system_properties.cpp b/libc/bionic/system_properties.cpp index 56f3724c4..4e4684afd 100644 --- a/libc/bionic/system_properties.cpp +++ b/libc/bionic/system_properties.cpp @@ -609,23 +609,17 @@ const prop_info *__system_property_find(const char *name) 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 @@ int __system_property_wait(const prop_info *pi) 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 @@ int __system_property_update(prop_info *pi, const char *value, unsigned int len) return 0; } + int __system_property_add(const char *name, unsigned int namelen, const char *value, unsigned int valuelen) { @@ -726,7 +721,12 @@ int __system_property_add(const char *name, unsigned int namelen, 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(&pi->serial), serial, NULL); + serial = pi->serial; + } + return serial; } unsigned int __system_property_wait_any(unsigned int serial) @@ -735,7 +735,7 @@ unsigned int __system_property_wait_any(unsigned int serial) do { __futex_wait(&pa->serial, serial, NULL); - } while(pa->serial == serial); + } while (pa->serial == serial); return pa->serial; }