#include "file-helper.h"
#include "config-parser.h"
+#ifndef gettid
+#include <sys/syscall.h>
+
+#ifdef SYS_gettid
+#define gettid() (pid_t) syscall(SYS_gettid)
+#else
+#error "SYS_gettid unavailable on this system"
+#endif
+#endif
+
static GHashTable *proc_exclude_list;
static Ecore_File_Monitor *exclude_list_monitor;
static const unsigned int exclude_list_limit = 1024;
#define LOG_PREFIX "resourced"
#define TIZEN_SYSTEM_APPID "org.tizen.system"
-GSList *proc_app_list;
+struct proc_app_list app_list = { .lock = PTHREAD_MUTEX_INITIALIZER };
static GSList *proc_program_list;
+GSList *proc_app_list_open(void)
+{
+ if (app_list.tid != gettid()) {
+ pthread_mutex_lock(&app_list.lock);
+ app_list.tid = gettid();
+ }
+
+ app_list.ref++;
+
+ return app_list.list;
+}
+
+void proc_app_list_close(void)
+{
+ int err;
+
+ app_list.ref--;
+
+ if (app_list.ref)
+ return;
+
+ app_list.tid = 0;
+
+ err = pthread_mutex_unlock(&app_list.lock);
+ if (err)
+ _E("Failed to unlock app list mutex: %s",
+ strerror(err));
+}
+
static bool is_ui_app(enum application_type type)
{
if (type == PROC_TYPE_GUI || type == PROC_TYPE_WIDGET ||
*/
struct proc_app_info *find_app_info_by_appid(const char *appid)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
GSList *iter = NULL;
struct proc_app_info *pai;
if (!appid)
return NULL;
+ proc_app_list = proc_app_list_open();
gslist_for_each_item(iter, proc_app_list) {
pai = (struct proc_app_info *)iter->data;
if (equal_name_info(pai->appid, appid))
struct proc_app_info *find_app_info(const pid_t pid)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
GSList *iter = NULL;
struct proc_app_info *pai = NULL;
+ proc_app_list = proc_app_list_open();
gslist_for_each_item(iter, proc_app_list) {
pai = (struct proc_app_info *)iter->data;
- if ((pai->main_pid == pid) ||
- (pai->childs && g_slist_find(pai->childs, PID_TO_GPOINTER(pid))))
+ if (pai->main_pid == pid)
return pai;
+ if (pai->childs) {
+ if (g_slist_find(pai->childs, PID_TO_GPOINTER(pid)))
+ return pai;
+ }
}
return NULL;
}
return -ENOMEM;
ret = mkdir(runtime_app_info_path, S_IRWXU | S_IRGRP | S_IXGRP);
- if (ret < 0)
+ if (ret && errno != EEXIST)
return ret;
ret = proc_runtime_app_info_write_appid(runtime_app_info_path, pai->appid);
struct proc_app_info *proc_add_app_list(const int type, const pid_t pid,
const char *appid, const char *pkgname)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
struct proc_app_info *pai;
int ret;
/*
* check lastet item firstly because app list has already created in prelaunch
*/
+ proc_app_list = proc_app_list_open();
pai = (struct proc_app_info *)g_slist_nth_data(proc_app_list, 0);
if (!pai || pai->type != PROC_TYPE_READY) {
_E("not found previous pai : %s", appid);
int proc_remove_app_list(const pid_t pid)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
GSList *iter;
struct proc_app_info *pai = NULL;
struct proc_program_info *ppi;
+ proc_app_list = proc_app_list_open();
gslist_for_each_item(iter, proc_app_list) {
pai = (struct proc_app_info *)iter->data;
int ret;
struct proc_app_info *proc_create_app_list(const char *appid, const char *pkgid)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
struct proc_app_info *pai;
if (!appid)
return NULL;
}
pai->proc_exclude = resourced_proc_excluded(appid);
+ proc_app_list = proc_app_list_open();
proc_app_list = g_slist_prepend(proc_app_list, pai);
+ app_list.list = proc_app_list;
return pai;
}
int proc_delete_all_lists(void)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
GSList *iter, *next;
struct proc_app_info *pai = NULL;
struct proc_program_info *ppi = NULL;
+ proc_app_list = proc_app_list_open();
gslist_for_each_safe(proc_app_list, iter, next, pai) {
_remove_child_pids(pai, 0);
ppi = pai->program;
static void proc_dump_process_list(FILE *fp)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
GSList *iter, *iter_child;
struct proc_app_info *pai = NULL;
int index = 0, ret, oom_score_adj;
LOG_DUMP(fp, "[APPLICATION LISTS]\n");
+ proc_app_list = proc_app_list_open();
gslist_for_each_item(iter, proc_app_list) {
char *typestr;
unsigned int size;
static int proc_restore_runtime_app_info(const char *path)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
_cleanup_free_ char *appid = NULL, *pkgname = NULL;
struct proc_app_info *pai;
int oom_score_adj = 0, ret;
ret = proc_get_oom_score_adj(pai->main_pid, &oom_score_adj);
if (ret < 0) {
_I("pid %d is already terminated. remove it", pai->main_pid);
+ proc_app_list = proc_app_list_open();
proc_app_list = g_slist_remove(proc_app_list, pai);
resourced_appinfo_put(pai->ai);
free(pai);
void proc_set_group(pid_t ownerpid, pid_t childpid, char *pkgname)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
int owner_oom = 0, child_oom = 0, ret;
int child_type = 0, child_state = 0;
struct proc_program_info *ppi;
owner->categories += pai->categories;
if (pai->runtime_exclude)
owner->runtime_exclude += pai->runtime_exclude;
+ proc_app_list = proc_app_list_open();
proc_app_list = g_slist_remove(proc_app_list, pai);
free(pai);
} else {
static DBusMessage *edbus_get_memory_list(E_DBus_Object *obj, DBusMessage *msg)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
DBusMessageIter iter;
DBusMessageIter arr;
DBusMessage *reply;
unsigned int total = 0, usage = 0;
reply = dbus_message_new_method_return(msg);
+ proc_app_list = proc_app_list_open();
gslist_for_each_item(giter, proc_app_list) {
pai = (struct proc_app_info *)giter->data;
if (!pai->main_pid)
static DBusMessage *edbus_get_cpu_list(E_DBus_Object *obj, DBusMessage *msg)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
DBusMessageIter iter;
DBusMessageIter arr;
DBusMessage *reply;
dbus_message_iter_init_append(reply, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(su)", &arr);
+ proc_app_list = proc_app_list_open();
gslist_for_each_item(giter, proc_app_list) {
DBusMessageIter sub;
unsigned long percent;
static DBusMessage *edbus_get_memory_lists(E_DBus_Object *obj, DBusMessage *msg)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
DBusMessageIter iter;
DBusMessageIter arr;
DBusMessage *reply;
reply = dbus_message_new_method_return(msg);
dbus_message_iter_init_append(reply, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(su)", &arr);
+ proc_app_list = proc_app_list_open();
gslist_for_each_item(giter, proc_app_list) {
DBusMessageIter sub;
pai = (struct proc_app_info *)giter->data;
static DBusMessage *edbus_get_cpu_lists(E_DBus_Object *obj, DBusMessage *msg)
{
+ _cleanup_app_list_close_ GSList *proc_app_list = NULL;
DBusMessageIter iter;
DBusMessageIter arr;
DBusMessage *reply;
dbus_message_iter_init_append(reply, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(su)", &arr);
+ proc_app_list = proc_app_list_open();
gslist_for_each_item(giter, proc_app_list) {
DBusMessageIter sub;
unsigned long percent;