/* * Destroy given thread. * This function should perform all cleanup needed to * reclaim the resources used by a thread. * Called with interrupts enabled. */ static void Destroy_Thread(struct Kernel_Thread* kthread) { /* Dispose of the thread's memory. */ Disable_Interrupts(); Free_Page(kthread->stackPage); Free_Page(kthread); /* Remove from list of all threads */ Remove_From_All_Thread_List(&s_allThreadList, kthread); Enable_Interrupts(); }
/* * Create a new raw thread object. * Returns a null pointer if there isn't enough memory. */ static struct Kernel_Thread* Create_Thread(int priority, bool detached) { struct Kernel_Thread* kthread; void* stackPage = 0; /* * For now, just allocate one page each for the thread context * object and the thread's stack. */ kthread = Alloc_Page(); if (kthread != 0) stackPage = Alloc_Page(); /* Make sure that the memory allocations succeeded. */ if (kthread == 0) return 0; if (stackPage == 0) { Free_Page(kthread); return 0; } /*Print("New thread @ %x, stack @ %x\n", kthread, stackPage); */ /* * Initialize the stack pointer of the new thread * and accounting info */ Init_Thread(kthread, stackPage, priority, detached); /* Add to the list of all threads in the system. */ Add_To_Back_Of_All_Thread_List(&s_allThreadList, kthread); return kthread; }
/* * Free the memory used by a filesystem buffer. */ static void Free_Buffer(struct FS_Buffer *buf) { KASSERT(!(buf->flags & (FS_BUFFER_DIRTY | FS_BUFFER_INUSE))); Free_Page(buf->data); Free(buf); }