#include "input_events.h"
#include "smack.h"
#include "us_interaction_msg.h"
+#include "freezing.h"
#include "debug.h"
#define DA_WORK_DIR "/home/developer/sdk_tools/da/"
*/
static int targetServerHandler(void)
{
- msg_target_t log;
+ msg_target_t log, pid_msg;
+ ssize_t recvlen;
int index = getEmptyTargetSlot();
if (index == MAX_TARGET_COUNT) {
}
manager.target[index].socket =
- accept(manager.target_server_socket, NULL, NULL);
+ accept(manager.target_server_socket, NULL, NULL);
if (manager.target[index].socket >= 0) {
/* accept succeed */
goto free_and_end;
}
+ switch(*(enum us_interaction_k2u_msg_t *) msg->data) {
+ case US_INT_PAUSE_APPS:
+ freeze_subgroup();
+ break;
+ case US_INT_CONT_APPS:
+ thaw_subgroup();
+ break;
+ default:
+ LOGE("Unknown command\n");
+ }
+
/* Insert your message handler here */
ret = 0;
--- /dev/null
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "freezing.h"
+#include "debug.h"
+
+#define FREEZER_SUBGROUP "/sys/fs/cgroup/freezer/swap"
+#define FREEZER_TASKS FREEZER_SUBGROUP "/tasks"
+#define FREEZER_STATE FREEZER_SUBGROUP "/freezer.state"
+
+#define US_MANAGER_TASKS "/sys/kernel/debug/swap/us_manager/tasks"
+
+static FILE *f_tasks_fd = NULL, *f_state_fd = NULL, *f_us_man_fd = NULL;
+static const char *freezer_frozen = "FROZEN";
+static const char *freezer_thawed = "THAWED";
+
+static int open_freezer_files(void)
+{
+ f_tasks_fd = fopen(FREEZER_TASKS, "w+");
+ if (f_tasks_fd == NULL)
+ return -1;
+
+ f_state_fd = fopen(FREEZER_STATE, "w");
+ if (f_state_fd == NULL)
+ return -1;
+
+ f_us_man_fd = fopen(US_MANAGER_TASKS, "r");
+ if (f_us_man_fd == NULL)
+ return -1;
+
+ return 0;
+}
+
+static int close_freezer_files(void)
+{
+ int res = 0;
+
+ if (f_tasks_fd != NULL)
+ res = fclose(f_tasks_fd);
+
+ if (f_state_fd != NULL)
+ res |= fclose(f_state_fd);
+
+ if (f_us_man_fd != NULL)
+ res |= fclose(f_us_man_fd);
+
+ return res;
+}
+
+int create_freezer_subgroup(void)
+{
+ struct stat st;
+ int res = 0;
+
+ if (stat(FREEZER_SUBGROUP, &st) == -1) {
+ res = mkdir(FREEZER_SUBGROUP, 0700);
+ if (res)
+ return res;
+ }
+
+ res = open_freezer_files();
+
+ return res;
+}
+
+int destroy_freezer_subgroup(void)
+{
+ struct stat st;
+ int res = 0;
+
+ res = thaw_subgroup();
+ if (res)
+ return res;
+
+ res = close_freezer_files();
+ if (res)
+ return res;
+
+ if (stat(FREEZER_SUBGROUP, &st) != -1)
+ res = rmdir(FREEZER_SUBGROUP);
+
+ return res;
+}
+
+static int add_tasks_to_freezer(void)
+{
+ ssize_t res;
+ pid_t pid;
+
+ if (f_tasks_fd == NULL) {
+ LOGE("Tasks freezer subgroup file is closed\n");
+ return -1;
+ }
+
+ if (f_us_man_fd == NULL) {
+ LOGE("Us_manager tasks file is closed\n");
+ return -1;
+ }
+
+ while(fscanf(f_us_man_fd, "%u", &pid) == 1) {
+ res = fprintf(f_tasks_fd, "%u", pid);
+ if (res < 0) {
+ LOGE("Cannot add task %u to freezer group\n", pid);
+ return -1;
+ }
+ }
+ fflush(f_tasks_fd);
+
+ return 0;
+}
+
+int freeze_subgroup(void)
+{
+ size_t len = strlen(freezer_frozen) + 1;
+ ssize_t res;
+
+ if (f_state_fd == NULL) {
+ LOGE("Freezer.state subgroup file is closed\n");
+ return -1;
+ }
+
+ res = add_tasks_to_freezer();
+ if (res) {
+ LOGE("Cannot add tasks to freezer\n");
+ return -1;
+ }
+
+ res = fwrite(freezer_frozen, len, 1, f_state_fd);
+ if (res < 0) {
+ LOGE("Cannot set FROZEN state\n");
+ return -1;
+ }
+ fflush(f_state_fd);
+
+ return 0;
+}
+
+int thaw_subgroup(void)
+{
+ size_t len = strlen(freezer_thawed) + 1;
+ ssize_t res;
+
+ if (f_state_fd == NULL) {
+ LOGE("Freezer.state subgroup file is closed\n");
+ return -1;
+ }
+
+ res = fwrite(freezer_thawed, len, 1, f_state_fd);
+ if (res < 0) {
+ LOGE("Cannot set THAWED state\n");
+ return -1;
+ }
+ fflush(f_state_fd);
+
+ return 0;
+}