diff options
author | jiaguo <jiaguo@marvell.com> | 2014-03-13 17:39:58 +0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-03-13 12:42:52 -0700 |
commit | 879d33049946fa2293a61dbdb20addace953922b (patch) | |
tree | 6711f84820764224551d9dfec174251c5c94ff0a /libc/bionic/system_properties.cpp | |
parent | 01cd78854afe5707f0d5b2b8418de07a55f8fde4 (diff) | |
download | android_bionic-879d33049946fa2293a61dbdb20addace953922b.tar.gz android_bionic-879d33049946fa2293a61dbdb20addace953922b.tar.bz2 android_bionic-879d33049946fa2293a61dbdb20addace953922b.zip |
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>
Diffstat (limited to 'libc/bionic/system_properties.cpp')
-rw-r--r-- | libc/bionic/system_properties.cpp | 28 |
1 files 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<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 @@ 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; } |