diff options
Diffstat (limited to 'Source/Library/Userland')
-rw-r--r-- | Source/Library/Userland/App/Application.proto.h | 41 | ||||
-rw-r--r-- | Source/Library/Userland/App/ShellApp.proto.h | 18 | ||||
-rw-r--r-- | Source/Library/Userland/Binding/VirtualTerminal.class.h | 2 | ||||
-rw-r--r-- | Source/Library/Userland/Start.cpp | 37 |
4 files changed, 73 insertions, 25 deletions
diff --git a/Source/Library/Userland/App/Application.proto.h b/Source/Library/Userland/App/Application.proto.h new file mode 100644 index 0000000..1f3a963 --- /dev/null +++ b/Source/Library/Userland/App/Application.proto.h @@ -0,0 +1,41 @@ +#ifndef DEF_APPLICATION_PROTO_H +#define DEF_APPLICATION_PROTO_H + +#include <Binding/Process.class.h> +#include <String.class.h> + +extern u32int start_dtors, end_dtors; + +#define APP(t) static t the_app; \ + Application *app = &the_app; + +class Application { + public: + Process pr; + Vector<String> args; + + Application() : pr(Process::get()), args(pr.argc()) { + for (u32int i = 0; i < args.size(); i++) args[i] = pr.argv(i); + //TODO : add default signal handlers + } + virtual ~Application() {} + + virtual int run() = 0; //Application's main loop + + virtual void doEvents() { + //TODO : handle signals (IPC featurs to come) + } + + void exit(u32int ret) { + //Call static destructors + for(u32int * call = &start_dtors; call < &end_dtors; call++) { + ((void (*)(void))*call)(); + } + threadFinishedSyscall(ret); + } +}; + +extern Application *app; + +#endif + diff --git a/Source/Library/Userland/App/ShellApp.proto.h b/Source/Library/Userland/App/ShellApp.proto.h new file mode 100644 index 0000000..846f2b1 --- /dev/null +++ b/Source/Library/Userland/App/ShellApp.proto.h @@ -0,0 +1,18 @@ +#ifndef DEF_SHELLAPP_CLASS_H +#define DEF_SHELLAPP_CLASS_H + +#include <App/Application.proto.h> +#include <Binding/VirtualTerminal.class.h> + +class ShellApp : public Application { + public: + VirtualTerminal invt, outvt; + + ShellApp() : Application(), invt(VirtualTerminal::getIn()), outvt(VirtualTerminal::getOut()) { + if (!invt.valid()) exit(1); + if (!outvt.valid()) exit(2); + } +}; + +#endif + diff --git a/Source/Library/Userland/Binding/VirtualTerminal.class.h b/Source/Library/Userland/Binding/VirtualTerminal.class.h index c8a4123..70c6b23 100644 --- a/Source/Library/Userland/Binding/VirtualTerminal.class.h +++ b/Source/Library/Userland/Binding/VirtualTerminal.class.h @@ -71,6 +71,4 @@ class VirtualTerminal : public RessourceCaller { inline VirtualTerminal& operator<<(u32int i) { writeHex(i); return *this; } }; -extern VirtualTerminal invt, outvt; - #endif diff --git a/Source/Library/Userland/Start.cpp b/Source/Library/Userland/Start.cpp index f1d1771..cb9faf9 100644 --- a/Source/Library/Userland/Start.cpp +++ b/Source/Library/Userland/Start.cpp @@ -1,46 +1,37 @@ #include <types.h> #include <Syscall/Syscall.wtf.h> -#include <Binding/VirtualTerminal.class.h> + +#include <App/Application.proto.h> #include <Heap.class.h> -extern u32int start_ctors, end_ctors, start_dtors, end_dtors; +extern u32int start_ctors, end_ctors; -Heap heap; +Heap *heap; VirtualTerminal invt(0), outvt(0); int main(const Vector<String>& args); extern "C" void start() { - heap.create(0x40000000, 0x00040000, 0x00004000); //Initially create a 256ko heap with 16ko index + Heap h; + h.create(0x40000000, 0x00040000, 0x00004000); //Initially create a 256ko heap with 16ko index + heap = &h; - //Call static constructors + //Call static constructors (this will construct the Application object and get some stuff (arguments, ...)) u32int i = 0; for(u32int * call = &start_ctors; call < &end_ctors; call++) { ((void (*)(void))*call)(); } - invt = VirtualTerminal::getIn(); outvt = VirtualTerminal::getOut(); - if (!invt.valid()) threadFinishedSyscall(1); - if (!outvt.valid()) threadFinishedSyscall(2); - - u32int argc = Process::get().argc(); - Vector<String> args(argc); - for (u32int i = 0; i < argc; i++) args[i] = Process::get().argv(i); - - u32int r = main(args); - - //Call static destructors - for(u32int * call = &start_dtors; call < &end_dtors; call++) { - ((void (*)(void))*call)(); - } - - threadFinishedSyscall(r); + app->doEvents(); + u32int r = app->run(); + app->doEvents(); + app->exit(r); //Will call static destructors } namespace Mem { - void* alloc (size_t sz) { return heap.alloc(sz); } - void free(void* ptr) { heap.free(ptr); } + void* alloc (size_t sz) { return heap->alloc(sz); } + void free(void* ptr) { heap->free(ptr); } void* mkXchgSpace (size_t sz) { return alloc(sz); } } |