diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 386ba1ed36..32f7a2c00a 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -26,15 +26,6 @@ #include #include -#define SPAWN_TERMINAL -#define SPAWN_LAUNCHER -//#define SPAWN_GUITEST2 -//#define SPAWN_FILE_MANAGER -//#define SPAWN_PROCESS_MANAGER -//#define SPAWN_TEXT_EDITOR -//#define SPAWN_FONTEDITOR -//#define SPAWN_VISUAL_BUILDER -//#define SPAWN_MULTIPLE_SHELLS //#define STRESS_TEST_SPAWNING VirtualConsole* tty0; @@ -88,52 +79,12 @@ VFS* vfs; int error; - auto* dns_lookup_server_process = Process::create_user_process("/bin/LookupServer", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty0); + auto* system_server_process = Process::create_user_process("/bin/SystemServer", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty0); if (error != 0) { - dbgprintf("error spawning LookupServer: %d\n", error); + dbgprintf("error spawning SystemServer: %d\n", error); hang(); } - - auto* window_server_process = Process::create_user_process("/bin/WindowServer", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty0); - if (error != 0) { - dbgprintf("error spawning WindowServer: %d\n", error); - hang(); - } - window_server_process->set_priority(Process::HighPriority); - Process::create_user_process("/bin/Taskbar", (uid_t)100, (gid_t)100, (pid_t)0, error); - //Process::create_user_process("/bin/sh", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, move(environment), tty0); -#ifdef SPAWN_TERMINAL - Process::create_user_process("/bin/Terminal", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty0); -#endif -#ifdef SPAWN_GUITEST2 - Process::create_user_process("/bin/guitest2", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty0); -#endif -#ifdef SPAWN_LAUNCHER - Process::create_user_process("/bin/Launcher", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty0); -#endif -#ifdef SPAWN_VISUAL_BUILDER - Process::create_user_process("/bin/VisualBuilder", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty0); -#endif -#ifdef SPAWN_FILE_MANAGER - Process::create_user_process("/bin/FileManager", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty0); -#endif -#ifdef SPAWN_PROCESS_MANAGER - Process::create_user_process("/bin/ProcessManager", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty0); -#endif -#ifdef SPAWN_TEXT_EDITOR - Vector text_editor_arguments; - text_editor_arguments.append("/bin/TextEditor"); - text_editor_arguments.append("/home/anon/ReadMe.md"); - Process::create_user_process("/bin/TextEditor", (uid_t)100, (gid_t)100, (pid_t)0, error, move(text_editor_arguments), { }, tty0); -#endif -#ifdef SPAWN_FONTEDITOR - Process::create_user_process("/bin/FontEditor", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, move(environment), tty0); -#endif -#ifdef SPAWN_MULTIPLE_SHELLS - Process::create_user_process("/bin/sh", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty1); - Process::create_user_process("/bin/sh", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty2); - Process::create_user_process("/bin/sh", (uid_t)100, (gid_t)100, (pid_t)0, error, { }, { }, tty3); -#endif + system_server_process->set_priority(Process::HighPriority); #ifdef STRESS_TEST_SPAWNING Process::create_kernel_process("spawn_stress", spawn_stress); diff --git a/Kernel/makeall.sh b/Kernel/makeall.sh index fc2fa28cad..f782a1aa03 100755 --- a/Kernel/makeall.sh +++ b/Kernel/makeall.sh @@ -13,6 +13,7 @@ build_targets="" build_targets="$build_targets ../LibC" build_targets="$build_targets ../LibM" build_targets="$build_targets ../LibCore" +build_targets="$build_targets ../Servers/SystemServer" build_targets="$build_targets ../Servers/LookupServer" build_targets="$build_targets ../Servers/WindowServer" build_targets="$build_targets ../LibGUI" diff --git a/Kernel/sync.sh b/Kernel/sync.sh index f514bce19c..92c15bff4d 100755 --- a/Kernel/sync.sh +++ b/Kernel/sync.sh @@ -63,6 +63,7 @@ cp -v ../Applications/TextEditor/TextEditor mnt/bin/TextEditor cp -v ../Applications/IRCClient/IRCClient mnt/bin/IRCClient ln -s IRCClient mnt/bin/irc ln -s FileManager mnt/bin/fm +cp -v ../Servers/SystemServer/SystemServer mnt/bin/SystemServer cp -v ../Servers/LookupServer/LookupServer mnt/bin/LookupServer cp -v ../Servers/WindowServer/WindowServer mnt/bin/WindowServer cp -v ../Applications/Taskbar/Taskbar mnt/bin/Taskbar diff --git a/Servers/SystemServer/Makefile b/Servers/SystemServer/Makefile new file mode 100644 index 0000000000..c49ea284f1 --- /dev/null +++ b/Servers/SystemServer/Makefile @@ -0,0 +1,23 @@ +include ../../Makefile.common + +SYSTEMSERVER_OBJS = \ + main.o + +APP = SystemServer +OBJS = $(SYSTEMSERVER_OBJS) + +DEFINES += -DUSERLAND + +all: $(APP) + +$(APP): $(OBJS) + $(LD) -o $(APP) $(LDFLAGS) $(OBJS) -lc -lcore + +.cpp.o: + @echo "CXX $<"; $(CXX) $(CXXFLAGS) -o $@ -c $< + +-include $(OBJS:%.o=%.d) + +clean: + @echo "CLEAN"; rm -f $(APP) $(OBJS) *.d + diff --git a/Servers/SystemServer/install.sh b/Servers/SystemServer/install.sh new file mode 100755 index 0000000000..2e3c1d65c4 --- /dev/null +++ b/Servers/SystemServer/install.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +#mkdir -p ../../Root/usr/include/SystemServer/ +#cp *.h ../../Root/usr/include/SystemServer/ diff --git a/Servers/SystemServer/main.cpp b/Servers/SystemServer/main.cpp new file mode 100644 index 0000000000..06e9d70d8b --- /dev/null +++ b/Servers/SystemServer/main.cpp @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include +#include +#include + +void start_process(const char *prog, int prio) +{ + pid_t pid = 0; + + while (true) { + dbgprintf("Forking for %s...\n", prog); + int pid = fork(); + if (pid < 0) { + dbgprintf("Fork %s failed! %s\n", prog, strerror(errno)); + continue; + } else if (pid > 0) { + // parent... + dbgprintf("Process %s hopefully started with priority %d...\n", prog, prio); + return; + } + break; + } + + while (true) { + if (pid == 0) { + dbgprintf("Executing for %s... at prio %d\n", prog, prio); + struct sched_param p; + p.sched_priority = prio; + int ret = sched_setparam(pid, &p); + ASSERT(ret == 0); + + char* progv[256]; + progv[0] = (char*)prog; + progv[1] = nullptr; + ret = execv(prog, progv); + if (ret < 0) { + dbgprintf("Exec %s failed! %s", prog, strerror(errno)); + continue; + } + break; + } else { + break; + } + } +} + +int main(int, char **) +{ + int lowest_prio = sched_get_priority_min(SCHED_OTHER); + int highest_prio = sched_get_priority_max(SCHED_OTHER); + start_process("/bin/LookupServer", lowest_prio); + start_process("/bin/WindowServer", highest_prio); + start_process("/bin/Taskbar", highest_prio); + start_process("/bin/Terminal", highest_prio-1); + start_process("/bin/Launcher", highest_prio); + + while (1) { + sleep(1); + } +}