X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fappfw%2Fpkgmgr-info.git;a=blobdiff_plain;f=parser%2Fsrc%2Fpkgmgr_parser_db.c;h=8745594d457045f00a031ccdb233d0244098f473;hp=93d2e1a22a8e36ed112e3a497c864bdeebc752c9;hb=8469c3d17db64d11bfbb01e366a95dbb7ac4128a;hpb=9a5b648ce367d93407bed4890c27c94eff88f2b4 diff --git a/parser/src/pkgmgr_parser_db.c b/parser/src/pkgmgr_parser_db.c index 93d2e1a..8745594 100644 --- a/parser/src/pkgmgr_parser_db.c +++ b/parser/src/pkgmgr_parser_db.c @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -460,6 +461,50 @@ API int pkgmgr_parser_create_and_initialize_db(uid_t uid) return PM_PARSER_R_OK; } +#define RESOURCED_BUS_NAME "org.tizen.resourced" +#define RESOURCED_PROC_PATH "/Org/Tizen/ResourceD/Process" +#define RESOURCED_PROC_INTERFACE "org.tizen.resourced.process" +#define RESOURCED_PROC_METHOD "ProcExclude" +static void __send_wakeup_signal_to_resourced(pid_t pid) +{ + GError *error = NULL; + GDBusConnection *conn; + GDBusProxy *proxy; + GVariant *reply; + + conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + if (conn == NULL) { + _LOGE("Failed to connect to dbus: %s", error->message); + g_error_free(error); + return; + } + + proxy = g_dbus_proxy_new_sync(conn, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, RESOURCED_BUS_NAME, + RESOURCED_PROC_PATH, RESOURCED_PROC_INTERFACE, + NULL, &error); + if (proxy == NULL) { + _LOGE("failed to get proxy object: %s", error->message); + g_error_free(error); + g_object_unref(conn); + return; + } + + reply = g_dbus_proxy_call_sync(proxy, RESOURCED_PROC_METHOD, + g_variant_new("(si)", "wakeup", pid), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); + if (reply == NULL) + _LOGE("failed to get reply from resourced"); + if (error) { + _LOGE("failed to send request: %s", error->message); + g_error_free(error); + } + + g_object_unref(proxy); + g_object_unref(conn); +} + static void __check_db_lock(const char *dbpath) { FILE *fp; @@ -506,21 +551,28 @@ static void __check_db_lock(const char *dbpath) } _LOGE("%s (%d) has lock on pkgmgr db(%s)!", name, pid, dbpath); + __send_wakeup_signal_to_resourced(pid); } fclose(fp); } #define BUSY_WAITING_USEC (1000000 / 10 / 2) /* 0.05 sec */ -#define BUSY_WAITING_MAX 20 /* wait for max 1 sec */ +#define BUSY_WAITING_MAX 40 /* wait for max 2 sec */ static int __db_busy_handler(void *data, int count) { - if (count < BUSY_WAITING_MAX) { + if (count < (BUSY_WAITING_MAX / 2)) { + usleep(BUSY_WAITING_USEC); + return 1; + } else if (count == (BUSY_WAITING_MAX / 2)) { + __check_db_lock((const char *)data); + usleep(BUSY_WAITING_USEC); + return 1; + } else if (count < BUSY_WAITING_MAX) { usleep(BUSY_WAITING_USEC); return 1; } else { /* sqlite3_prepare_v2 will return SQLITE_BUSY */ - __check_db_lock((const char *)data); return 0; } }