BuildRequires: cmake
BuildRequires: pkgconfig(capi-base-common)
BuildRequires: pkgconfig(dlog)
+BuildRequires: pkgconfig(glib-2.0)
%description
API library for system resource management and optimization
%manifest %{name}.manifest
%license LICENSE.MIT
%{_bindir}/capi-system-resource-test
+%{_bindir}/system-resource-test-service
+%{_unitdir}/system-resource-test-service.service
+%{_unitdir}/multi-user.target.wants/system-resource-test-service.service
goto retry_header;
}
- char error_buf[1024];
- strerror_r(errno, error_buf, sizeof(error_buf));
- _E("[CPU-BOOSTING-PLUGIN] error is based on %s", error_buf);
+ _E("[CPU-BOOSTING-PLUGIN] error is based on %m");
}
else
_E("[CPU-BOOSTING-PLUGIN] client output size is %u, but received size is %d",
goto retry_body;
}
- char error_buf[1024];
- strerror_r(errno, error_buf, sizeof(error_buf));
- _E("[CPU-BOOSTING-PLUGIN] error is based on %s", error_buf);
+ _E("[CPU-BOOSTING-PLUGIN] error is based on %m");
}
else
_E("[CPU-BOOSTING-PLUGIN] client output size is %u, but received size is %d",
SET(test "capi-system-resource-test")
SET(SOURCES
- main.c
-)
+ main.c)
SET(PKG_MODULES
dlog
)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
+MACRO(INSTALL_SYMLINK _filepath _sympath)
+ GET_FILENAME_COMPONENT(_symname ${_sympath} NAME)
+ GET_FILENAME_COMPONENT(_installdir ${_sympath} PATH)
+ EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -E create_symlink
+ ${_filepath}
+ ${CMAKE_CURRENT_BINARY_DIR}/${_symname})
+ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_symname}
+ DESTINATION ${_installdir})
+ENDMACRO(INSTALL_SYMLINK)
+
INCLUDE(FindPkgConfig)
pkg_check_modules(${test} REQUIRED ${PKG_MODULES})
FOREACH(flag ${${test}_CFLAGS})
SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie")
ADD_EXECUTABLE(${test} ${SOURCES})
-TARGET_LINK_LIBRARIES(${test} ${PROJECT_NAME} ${test_LDFLAGS} "-ldl")
+TARGET_LINK_LIBRARIES(${test} ${PROJECT_NAME} ${test_LDFLAGS})
INSTALL(TARGETS ${test} DESTINATION bin)
+
+ADD_SUBDIRECTORY(service)
pthread_exit(NULL);
}
-static void test_register_cpu_inheritance(const char *dest_process, resource_pid_t pid)
+static void test_set_cpu_inheritance(pid_t source_tid, const char *dest_process,
+ int timeout_msec)
+{
+ int ret = resource_set_cpu_inheritance(source_tid, dest_process, timeout_msec);
+ if (ret)
+ _E("[CPU-BOOSTING-TEST] error = %d", ret);
+}
+
+static void test_clear_cpu_inheritance(pid_t source_tid, const char *dest_process)
+{
+ int ret = resource_clear_cpu_inheritance(source_tid, dest_process);
+ if (ret)
+ _E("[CPU-BOOSTING-TEST] error = %d", ret);
+}
+
+/*static void test_register_cpu_inheritance(const char *dest_process, resource_pid_t pid)
{
int ret;
if (ret) {
_E("[CPU-BOOSTING-TEST] error = %d", ret);
}
-}
+}*/
static void test_set_cpu_boosting(resource_pid_t pid, cpu_boosting_level_e level, cpu_boosting_flag_e flags, int timeout_msec)
{
{
cpu_boosting_level_info_t cur_level;
- for (int level = CPU_BOOSTING_LEVEL_WEAK; level > CPU_BOOSTING_LEVEL_NONE; level--)
+ for (int level = CPU_BOOSTING_LEVEL_WEAK; level > CPU_BOOSTING_LEVEL_NONE; level--) {
+ test_set_cpu_boosting(pid, level, flags, -1);
test_set_cpu_boosting(pid, level, flags, 3000);
+ }
if (flags & CPU_BOOSTING_RESET_ON_FORK) {
pthread_t thread;
_E("[CPU-BOOSTING-TEST] Failed to create a new thread");
}
+ test_set_cpu_inheritance(gettid(), "system-resource-test-service", -1);
test_get_cpu_boosting(pid, &cur_level, false); /* Expect CPU_BOOSTING_LEVEL_STRONG */
test_clear_cpu_boosting(pid);
test_get_cpu_boosting(pid, &cur_level, false); /* Expect CPU_BOOSTING_LEVEL_NONE */
-
- test_register_cpu_inheritance("test-service", pid);
- test_unregister_cpu_inheritance("test-service");
+ test_clear_cpu_inheritance(gettid(), "system-resource-test-service");
+// test_register_cpu_inheritance("system-resource-test-service", pid);
+// test_unregister_cpu_inheritance("system-resource-test-service");
}
static void one_process_one_thread_test(cpu_boosting_flag_e flags)
--- /dev/null
+SET(test-service "system-resource-test-service")
+SET(SERVICE_SOURCE_DIR ${CMAKE_SOURCE_DIR}/tests/service)
+
+SET(SERVICE_SOURCES
+ main.c)
+
+SET(PKG_MODULES
+ dlog
+ capi-base-common
+ glib-2.0
+)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
+
+MACRO(INSTALL_SYMLINK _filepath _sympath)
+ GET_FILENAME_COMPONENT(_symname ${_sympath} NAME)
+ GET_FILENAME_COMPONENT(_installdir ${_sympath} PATH)
+ EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -E create_symlink
+ ${_filepath}
+ ${CMAKE_CURRENT_BINARY_DIR}/${_symname})
+ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_symname}
+ DESTINATION ${_installdir})
+ENDMACRO(INSTALL_SYMLINK)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(${test-service} REQUIRED ${PKG_MODULES})
+FOREACH(flag ${${test-service}_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Werror -Wall -pthread")
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie")
+
+ADD_EXECUTABLE(${test-service} ${SERVICE_SOURCES})
+TARGET_LINK_LIBRARIES(${test-service} ${PROJECT_NAME} ${${test-service}_LDFLAGS})
+INSTALL(TARGETS ${test-service} DESTINATION bin)
+
+INSTALL(FILES
+ ${SERVICE_SOURCE_DIR}/${test-service}.service
+ DESTINATION lib/systemd/system)
+INSTALL_SYMLINK(../${test-service}.service lib/systemd/system/multi-user.target.wants/${test-service}.service)
--- /dev/null
+#include <glib.h>
+#include <dlog.h>
+#include <assert.h>
+#include <signal.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include "common.h"
+#include "cpu-boosting.h"
+
+GMainLoop *mainloop;
+resource_pid_t pid;
+
+static void sig_int_handler(int sig)
+{
+ _E("[CPU-BOOSTING-SERVICE-TEST] signal = %d is received", sig);
+ cpu_boosting_level_info_t level;
+ int ret = resource_get_cpu_boosting_level(pid, &level);
+ if (ret < 0) {
+ _E("[CPU-BOOSTING-SERVICE-TEST] error = %d", ret);
+ }
+ else {
+ for(int i = 0; i < level.tid_count; i++)
+ _I("[CPU-BOOSTING-SERVICE-TEST] boosting level is %s",
+ level.tid_level[i] == CPU_BOOSTING_LEVEL_STRONG ? "strong" :
+ level.tid_level[i] == CPU_BOOSTING_LEVEL_MEDIUM ? "medium" :
+ level.tid_level[i] == CPU_BOOSTING_LEVEL_WEAK ? "weak" : "none");
+
+ if (level.tid_level)
+ free(level.tid_level);
+ }
+
+ resource_unregister_cpu_inheritance_destination("system-resource-test-service");
+ g_main_loop_quit(mainloop);
+}
+
+static void sig_term_handler(int sig, siginfo_t *siginfo, void *context)
+{
+ _E("[CPU-BOOSTING-SERVICE-TEST] signal = %d is received", sig);
+ cpu_boosting_level_info_t level;
+ int ret = resource_get_cpu_boosting_level(pid, &level);
+ if (ret < 0) {
+ _E("[CPU-BOOSTING-SERVICE-TEST] error = %d", ret);
+ }
+ else {
+ for(int i = 0; i < level.tid_count; i++)
+ _I("[CPU-BOOSTING-SERVICE-TEST] boosting level is %s",
+ level.tid_level[i] == CPU_BOOSTING_LEVEL_STRONG ? "strong" :
+ level.tid_level[i] == CPU_BOOSTING_LEVEL_MEDIUM ? "medium" :
+ level.tid_level[i] == CPU_BOOSTING_LEVEL_WEAK ? "weak" : "none");
+
+ if (level.tid_level)
+ free(level.tid_level);
+ }
+
+ resource_unregister_cpu_inheritance_destination("system-resource-test-service");
+ g_main_loop_quit(mainloop);
+}
+
+static void add_signal_handler(void)
+{
+ struct sigaction sig_act;
+
+ sig_act.sa_sigaction = sig_term_handler;
+ sig_act.sa_flags = 0;
+ sig_act.sa_flags |= SA_SIGINFO;
+ sigaction(SIGTERM, &sig_act, NULL);
+ signal(SIGINT, sig_int_handler);
+}
+
+int main(int argc, char *argv[])
+{
+ mainloop = g_main_loop_new(NULL, false);
+ assert(mainloop);
+
+ add_signal_handler();
+
+ pid.pid = getpid();
+ resource_register_cpu_inheritance_destination("system-resource-test-service", pid);
+
+ g_main_loop_run(mainloop);
+ g_main_loop_unref(mainloop);
+
+ return 0;
+}
--- /dev/null
+[Unit]
+Description=test cpu inheritance (un)register
+DefaultDependencies=no
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/system-resource-test-service
+
+[Install]
+WantedBy=multi-user.target