diff options
author | Colin Cross <ccross@android.com> | 2013-06-19 17:32:06 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-06-19 17:32:06 +0000 |
commit | e755dfd43812ebd9a0d0d6a2106316f343ffb5a2 (patch) | |
tree | f9ec16b11301b6103847e01211e44c3866bbba9b | |
parent | d92e35eb7b97f349054390cfee1d40154dba6d66 (diff) | |
parent | 68e9b6bc947eaca4135085615860ba90a8656ca4 (diff) | |
download | system_core-e755dfd43812ebd9a0d0d6a2106316f343ffb5a2.zip system_core-e755dfd43812ebd9a0d0d6a2106316f343ffb5a2.tar.gz system_core-e755dfd43812ebd9a0d0d6a2106316f343ffb5a2.tar.bz2 |
Merge changes I1db3137b,I0f66144e
* changes:
toolbox: reimplement watchprops using __system_property_foreach()
libcutils: reimplement property_list() using __system_property_foreach()
-rw-r--r-- | libcutils/properties.c | 29 | ||||
-rw-r--r-- | toolbox/watchprops.c | 98 |
2 files changed, 78 insertions, 49 deletions
diff --git a/libcutils/properties.c b/libcutils/properties.c index f732ec0..28d8b2f 100644 --- a/libcutils/properties.c +++ b/libcutils/properties.c @@ -52,19 +52,28 @@ int property_get(const char *key, char *value, const char *default_value) return len; } -int property_list(void (*propfn)(const char *key, const char *value, void *cookie), - void *cookie) +struct property_list_callback_data +{ + void (*propfn)(const char *key, const char *value, void *cookie); + void *cookie; +}; + +static void property_list_callback(const prop_info *pi, void *cookie) { char name[PROP_NAME_MAX]; char value[PROP_VALUE_MAX]; - const prop_info *pi; - unsigned n; - - for(n = 0; (pi = __system_property_find_nth(n)); n++) { - __system_property_read(pi, name, value); - propfn(name, value, cookie); - } - return 0; + struct property_list_callback_data *data = cookie; + + __system_property_read(pi, name, value); + data->propfn(name, value, data->cookie); +} + +int property_list( + void (*propfn)(const char *key, const char *value, void *cookie), + void *cookie) +{ + struct property_list_callback_data data = { propfn, cookie }; + return __system_property_foreach(property_list_callback, &data); } #elif defined(HAVE_SYSTEM_PROPERTY_SERVER) diff --git a/toolbox/watchprops.c b/toolbox/watchprops.c index 3418d62..bf82882 100644 --- a/toolbox/watchprops.c +++ b/toolbox/watchprops.c @@ -1,32 +1,30 @@ #include <stdio.h> #include <stdlib.h> #include <time.h> +#include <errno.h> #include <cutils/properties.h> +#include <cutils/hashmap.h> #include <sys/atomics.h> #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ #include <sys/_system_properties.h> -typedef struct pwatch pwatch; - -struct pwatch +static int str_hash(void *key) { - const prop_info *pi; - unsigned serial; -}; + return hashmapHash(key, strlen(key)); +} -static pwatch watchlist[1024]; +static bool str_equals(void *keyA, void *keyB) +{ + return strcmp(keyA, keyB) == 0; +} -static void announce(const prop_info *pi) +static void announce(char *name, char *value) { - char name[PROP_NAME_MAX]; - char value[PROP_VALUE_MAX]; char *x; - __system_property_read(pi, name, value); - for(x = value; *x; x++) { if((*x < 32) || (*x > 127)) *x = '.'; } @@ -34,42 +32,64 @@ static void announce(const prop_info *pi) fprintf(stderr,"%10d %s = '%s'\n", (int) time(0), name, value); } +static void add_to_watchlist(Hashmap *watchlist, const char *name, + const prop_info *pi) +{ + char *key = strdup(name); + unsigned *value = malloc(sizeof(unsigned)); + if (!key || !value) + exit(1); + + *value = __system_property_serial(pi); + hashmapPut(watchlist, key, value); +} + +static void populate_watchlist(const prop_info *pi, void *cookie) +{ + Hashmap *watchlist = cookie; + char name[PROP_NAME_MAX]; + char value_unused[PROP_VALUE_MAX]; + + __system_property_read(pi, name, value_unused); + add_to_watchlist(watchlist, name, pi); +} + +static void update_watchlist(const prop_info *pi, void *cookie) +{ + Hashmap *watchlist = cookie; + char name[PROP_NAME_MAX]; + char value[PROP_VALUE_MAX]; + unsigned *serial; + + __system_property_read(pi, name, value); + serial = hashmapGet(watchlist, name); + if (!serial) { + add_to_watchlist(watchlist, name, pi); + announce(name, value); + } else { + unsigned tmp = __system_property_serial(pi); + if (*serial != tmp) { + *serial = tmp; + announce(name, value); + } + } +} + int watchprops_main(int argc, char *argv[]) { unsigned serial = 0; - unsigned count; + unsigned count = 0; unsigned n; - for(n = 0; n < 1024; n++) { - watchlist[n].pi = __system_property_find_nth(n); - if (watchlist[n].pi == 0) - break; - watchlist[n].serial = __system_property_serial(watchlist[n].pi); - } - - count = n; - if (count == 1024) + Hashmap *watchlist = hashmapCreate(1024, str_hash, str_equals); + if (!watchlist) exit(1); + __system_property_foreach(populate_watchlist, watchlist); + for(;;) { serial = __system_property_wait_any(serial); - while(count < 1024){ - watchlist[count].pi = __system_property_find_nth(count); - if (watchlist[count].pi == 0) - break; - watchlist[count].serial = __system_property_serial(watchlist[n].pi); - announce(watchlist[count].pi); - count++; - if(count == 1024) exit(1); - } - - for(n = 0; n < count; n++){ - unsigned tmp = __system_property_serial(watchlist[n].pi); - if(watchlist[n].serial != tmp) { - announce(watchlist[n].pi); - watchlist[n].serial = tmp; - } - } + __system_property_foreach(update_watchlist, watchlist); } return 0; } |