aboutsummaryrefslogtreecommitdiffstats
path: root/libc/bionic/system_properties.cpp
diff options
context:
space:
mode:
authorjiaguo <jiaguo@marvell.com>2014-03-13 17:39:58 +0800
committerElliott Hughes <enh@google.com>2014-03-13 12:42:52 -0700
commit879d33049946fa2293a61dbdb20addace953922b (patch)
tree6711f84820764224551d9dfec174251c5c94ff0a /libc/bionic/system_properties.cpp
parent01cd78854afe5707f0d5b2b8418de07a55f8fde4 (diff)
downloadandroid_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.cpp28
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;
}