constexpr const char RESOURCED_PROC_INTERFACE[] = "org.tizen.resourced.process";
constexpr const char RESOURCED_PROC_METHOD[] = "ProcExclude";
-// This should be removed when the client server structure is complete
-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);
-}
-
-void __check_db_lock(const char *dbpath) {
- FILE *fp;
- FILE *fp_cmdline;
- struct stat sb;
- char type[BUFSIZE];
- int pid;
- unsigned int maj;
- unsigned int min;
- unsigned long long ino;
- char cmdline[BUFSIZE];
- char name[BUFSIZE];
- size_t len;
-
- if (stat(dbpath, &sb) == -1) {
- _LOGE("get db file(%s) status failed: %d", dbpath, errno);
- return;
- }
-
- fp = fopen("/proc/locks", "r");
- if (fp == NULL) {
- _LOGE("Failed to open lock info: %d", errno);
- return;
- }
-
- while (fscanf(fp, "%*s %*s %*s %5s %d %x:%x:%llu %*s %*s",
- type, &pid, &maj, &min, &ino) != EOF) {
- if (maj != major(sb.st_dev) || min != minor(sb.st_dev) ||
- ino != sb.st_ino || pid == getpid() ||
- strcasecmp(type, "WRITE"))
- continue;
-
- snprintf(cmdline, sizeof(cmdline), "/proc/%d/cmdline", pid);
- fp_cmdline = fopen(cmdline, "r");
- name[0] = '\0';
- if (fp_cmdline != NULL) {
- len = fread(name, sizeof(char), sizeof(name) - 1,
- fp_cmdline);
- if (len > 0) {
- if (name[len - 1] == '\n')
- name[len - 1] = '\0';
- else
- name[len] = '\0';
- }
- fclose(fp_cmdline);
- }
-
- _LOGE("%s (%d) has lock on pkgmgr db(%s)!", name, pid, dbpath);
- __send_wakeup_signal_to_resourced(pid);
- }
-
- fclose(fp);
-}
-
int __writedb_busy_handler(void *data, int count) {
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;