1cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/*
2cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
3cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
4cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * you may not use this file except in compliance with the License.
6cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * You may obtain a copy of the License at
7cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
8cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
10cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * See the License for the specific language governing permissions and
14cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * limitations under the License.
15cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */
16cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
17c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn#define LOG_TAG "misc"
18c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn
19cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project//
20cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// Miscellaneous utility functions.
21cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project//
22cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/misc.h>
23c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn#include <utils/Log.h>
24cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
25cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <sys/stat.h>
26cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <string.h>
27cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <errno.h>
28cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <stdio.h>
29cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
30c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn#if defined(HAVE_PTHREADS)
31c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn# include <pthread.h>
32c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn#endif
33c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn
34c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn#include <utils/Vector.h>
35c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn
36cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectusing namespace android;
37cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
38cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectnamespace android {
39cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
40c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackbornstruct sysprop_change_callback_info {
41c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    sysprop_change_callback callback;
42c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    int priority;
43c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn};
44c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn
45c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn#if defined(HAVE_PTHREADS)
46c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackbornstatic pthread_mutex_t gSyspropMutex = PTHREAD_MUTEX_INITIALIZER;
47c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackbornstatic Vector<sysprop_change_callback_info>* gSyspropList = NULL;
48c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn#endif
49c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn
50c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackbornvoid add_sysprop_change_callback(sysprop_change_callback cb, int priority) {
51c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn#if defined(HAVE_PTHREADS)
52c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    pthread_mutex_lock(&gSyspropMutex);
53c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    if (gSyspropList == NULL) {
54c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn        gSyspropList = new Vector<sysprop_change_callback_info>();
55c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    }
56c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    sysprop_change_callback_info info;
57c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    info.callback = cb;
58c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    info.priority = priority;
59c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    bool added = false;
60c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    for (size_t i=0; i<gSyspropList->size(); i++) {
61c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn        if (priority >= gSyspropList->itemAt(i).priority) {
62c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn            gSyspropList->insertAt(info, i);
63c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn            added = true;
64c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn            break;
65c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn        }
66c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    }
67c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    if (!added) {
68c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn        gSyspropList->add(info);
69c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    }
70c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    pthread_mutex_unlock(&gSyspropMutex);
71c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn#endif
72c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn}
73c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn
74c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackbornvoid report_sysprop_change() {
75c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn#if defined(HAVE_PTHREADS)
76c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    pthread_mutex_lock(&gSyspropMutex);
77c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    Vector<sysprop_change_callback_info> listeners;
78c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    if (gSyspropList != NULL) {
79c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn        listeners = *gSyspropList;
80c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    }
81c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    pthread_mutex_unlock(&gSyspropMutex);
82cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
83c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    //ALOGI("Reporting sysprop change to %d listeners", listeners.size());
84c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    for (size_t i=0; i<listeners.size(); i++) {
85c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn        listeners[i].callback();
86c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn    }
87c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn#endif
88c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn}
89c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn
90c1309d74e8929f73e1b9cdb5dbf70aa8a2b09af3Dianne Hackborn}; // namespace android
91