Merge "bionic: add missing memory barriers to system properties"
This commit is contained in:
commit
a823883548
@ -49,6 +49,7 @@
|
|||||||
#include <sys/_system_properties.h>
|
#include <sys/_system_properties.h>
|
||||||
|
|
||||||
#include <sys/atomics.h>
|
#include <sys/atomics.h>
|
||||||
|
#include <bionic_atomic_inline.h>
|
||||||
|
|
||||||
struct prop_area {
|
struct prop_area {
|
||||||
unsigned volatile count;
|
unsigned volatile count;
|
||||||
@ -315,6 +316,7 @@ int __system_property_read(const prop_info *pi, char *name, char *value)
|
|||||||
}
|
}
|
||||||
len = SERIAL_VALUE_LEN(serial);
|
len = SERIAL_VALUE_LEN(serial);
|
||||||
memcpy(value, pi->value, len + 1);
|
memcpy(value, pi->value, len + 1);
|
||||||
|
ANDROID_MEMBAR_FULL();
|
||||||
if(serial == pi->serial) {
|
if(serial == pi->serial) {
|
||||||
if(name != 0) {
|
if(name != 0) {
|
||||||
strcpy(name, pi->name);
|
strcpy(name, pi->name);
|
||||||
@ -446,7 +448,9 @@ int __system_property_update(prop_info *pi, const char *value, unsigned int len)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pi->serial = pi->serial | 1;
|
pi->serial = pi->serial | 1;
|
||||||
|
ANDROID_MEMBAR_FULL();
|
||||||
memcpy(pi->value, value, len + 1);
|
memcpy(pi->value, value, len + 1);
|
||||||
|
ANDROID_MEMBAR_FULL();
|
||||||
pi->serial = (len << 24) | ((pi->serial + 1) & 0xffffff);
|
pi->serial = (len << 24) | ((pi->serial + 1) & 0xffffff);
|
||||||
__futex_wake(&pi->serial, INT32_MAX);
|
__futex_wake(&pi->serial, INT32_MAX);
|
||||||
|
|
||||||
@ -493,6 +497,7 @@ int __system_property_add(const char *name, unsigned int namelen,
|
|||||||
memcpy(pi->value, value, valuelen + 1);
|
memcpy(pi->value, value, valuelen + 1);
|
||||||
|
|
||||||
pa->toc[pa->count] = (namelen << 24) | (((unsigned) pi) - ((unsigned) pa));
|
pa->toc[pa->count] = (namelen << 24) | (((unsigned) pi) - ((unsigned) pa));
|
||||||
|
ANDROID_MEMBAR_FULL();
|
||||||
|
|
||||||
pa->count++;
|
pa->count++;
|
||||||
pa->serial++;
|
pa->serial++;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user