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