diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-27 15:30:35 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-27 15:30:35 -0700 |
commit | 90ec5f2a3f581927ffef55733e8d531890fdc90e (patch) | |
tree | 8ffe33d3f9b0726a680d664d86660096ab115b24 | |
parent | 0b251a1b9c1fdf009d06879c739dcf1217e42969 (diff) | |
parent | 6ed739e1d3b5088bf1cd56f09ba3afba792b969d (diff) | |
download | bionic-90ec5f2a3f581927ffef55733e8d531890fdc90e.zip bionic-90ec5f2a3f581927ffef55733e8d531890fdc90e.tar.gz bionic-90ec5f2a3f581927ffef55733e8d531890fdc90e.tar.bz2 |
Merge commit 'korg/cupcake'
-rw-r--r-- | libc/kernel/common/linux/msm_mdp.h | 1 | ||||
-rw-r--r-- | libc/kernel/common/linux/mt9t013.h | 1 | ||||
-rw-r--r-- | linker/linker.c | 53 |
3 files changed, 40 insertions, 15 deletions
diff --git a/libc/kernel/common/linux/msm_mdp.h b/libc/kernel/common/linux/msm_mdp.h index d10ed43..43fdac3 100644 --- a/libc/kernel/common/linux/msm_mdp.h +++ b/libc/kernel/common/linux/msm_mdp.h @@ -45,6 +45,7 @@ enum { #define MDP_ROT_180 (MDP_FLIP_UD|MDP_FLIP_LR) #define MDP_ROT_270 (MDP_ROT_90|MDP_FLIP_UD|MDP_FLIP_LR) #define MDP_DITHER 0x8 +#define MDP_BLUR 0x10 #define MDP_TRANSP_NOP 0xffffffff #define MDP_ALPHA_NOP 0xff diff --git a/libc/kernel/common/linux/mt9t013.h b/libc/kernel/common/linux/mt9t013.h index 11dc4b3..821ef21 100644 --- a/libc/kernel/common/linux/mt9t013.h +++ b/libc/kernel/common/linux/mt9t013.h @@ -89,6 +89,7 @@ struct mt9t013_reg_pat { struct mt9t013_exposure_gain { uint16_t gain; uint16_t line; + uint32_t mode; }; #define MT9T013_I2C_IOCTL_EXPOSURE_GAIN _IOW(MT9T013_I2C_IOCTL_MAGIC, 18, struct exposure_gain *) diff --git a/linker/linker.c b/linker/linker.c index 91435de..300a95c 100644 --- a/linker/linker.c +++ b/linker/linker.c @@ -37,7 +37,7 @@ #include <dlfcn.h> #include <sys/stat.h> -//#include <pthread.h> +#include <pthread.h> #include <sys/mman.h> @@ -110,15 +110,11 @@ unsigned bitmask[4096]; */ extern void __attribute__((noinline)) rtld_db_dlactivity(void); -extern void sched_yield(void); - static struct r_debug _r_debug = {1, NULL, &rtld_db_dlactivity, RT_CONSISTENT, 0}; static struct link_map *r_debug_tail = 0; -//static pthread_mutex_t _r_debug_lock = PTHREAD_MUTEX_INITIALIZER; - -static volatile int loader_lock = 0; +static pthread_mutex_t _r_debug_lock = PTHREAD_MUTEX_INITIALIZER; static void insert_soinfo_into_debug_map(soinfo * info) { @@ -147,6 +143,17 @@ static void insert_soinfo_into_debug_map(soinfo * info) r_debug_tail = map; } +static void remove_soinfo_from_debug_map(soinfo * info) +{ + struct link_map * map = &(info->linkmap); + + if (r_debug_tail == map) + r_debug_tail = map->l_prev; + + if (map->l_prev) map->l_prev->l_next = map->l_next; + if (map->l_next) map->l_next->l_prev = map->l_prev; +} + void notify_gdb_of_load(soinfo * info) { if (info->flags & FLAG_EXE) { @@ -154,14 +161,7 @@ void notify_gdb_of_load(soinfo * info) return; } - /* yes, this is a little gross, but it does avoid - ** pulling in pthread_*() and at the moment we don't - ** dlopen() anything anyway - */ - while(__atomic_swap(1, &loader_lock) != 0) { - sched_yield(); - usleep(5000); - } + pthread_mutex_lock(&_r_debug_lock); _r_debug.r_state = RT_ADD; rtld_db_dlactivity(); @@ -171,7 +171,27 @@ void notify_gdb_of_load(soinfo * info) _r_debug.r_state = RT_CONSISTENT; rtld_db_dlactivity(); - __atomic_swap(0, &loader_lock); + pthread_mutex_unlock(&_r_debug_lock); +} + +void notify_gdb_of_unload(soinfo * info) +{ + if (info->flags & FLAG_EXE) { + // GDB already knows about the main executable + return; + } + + pthread_mutex_lock(&_r_debug_lock); + + _r_debug.r_state = RT_DELETE; + rtld_db_dlactivity(); + + remove_soinfo_from_debug_map(info); + + _r_debug.r_state = RT_CONSISTENT; + rtld_db_dlactivity(); + + pthread_mutex_unlock(&_r_debug_lock); } void notify_gdb_of_libraries() @@ -1066,6 +1086,7 @@ unsigned unload_library(soinfo *si) pid, si->name, si->base); ba_free(si->ba_index); } + notify_gdb_of_unload(si); free_info(si); si->refcount = 0; } @@ -1213,6 +1234,8 @@ static int reloc_library(soinfo *si, Elf32_Rel *rel, unsigned count) reloc, s->st_size, sym_addr, sym_name); memcpy((void*)reloc, (void*)sym_addr, s->st_size); break; + case R_ARM_NONE: + break; #endif /* ANDROID_ARM_LINKER */ default: |