#ifndef DEF_PROCESS_CLASS_H #define DEF_PROCESS_CLASS_H #include #include #include #include #include #include #include #include #define P_ZOMBIE 0 #define P_RUNNING 1 #define P_STARTING 2 #define P_FINISHED 3 #define E_PAGEFAULT 0x0FFFFF00 #define E_EXIT 0x0FFFFF01 #define E_UNHANDLED_EXCEPTION 0x0FFFFF02 #define STACKSIZE 4096 //Could change #define USERHEAPINITSIZE 0x00010000 //Heap initially is 64k, but can grow #define USERHEAPSTART 0xB7000000 //Heap is at 0xB7000000, 128Mo before kernel space. class Thread; class File; class Process : public Ressource { friend class Thread; private: Process(); //Creates an empty process, used by creatKernel() u32int m_pid; String m_cmdline; s32int m_retval; //Can be either a standard return value or an E_* (see #defines above) u8int m_state; //Is one of P_* defined above PageDirectory* m_pagedir; u32int m_uid; //User ID VirtualTerminal *m_inVT, *m_outVT; Heap *m_userHeap; Vector m_threads; SimpleList *m_fileDescriptors; //System calls static call_t m_callTable[]; u32int exitSC(); u32int allocPageSC(u32int); public: static u32int scall(u8int, u32int, u32int, u32int, u32int); static Process* createKernel(String cmdline, VirtualTerminal *vt); //Also creates a Thread for what's curently happening static Process* run(String filename, FSNode* cwd, u32int uid); Process(String cmdline, u32int uid); ~Process(); Heap& heap() { return *m_userHeap; } void start(); //Starts thread execution - sets m_state to P_RUNNING if == P_STARTING void exit(); //Exits properly process by killing all threads and deleting file descriptors void registerThread(Thread* t); //Called when a thread starts void threadFinishes(Thread* thread, u32int retval); //Called when a thread finishes void registerFileDescriptor(File* fd); void unregisterFileDescriptor(File* fd); PageDirectory* getPagedir(); VirtualTerminal* getInVT(); VirtualTerminal* getOutVT(); void setInVT(VirtualTerminal* vt); void setOutVT(VirtualTerminal* vt); u32int getState() { return m_state; } u32int freePageSC(u32int); }; #endif