nub_thread_t MachThreadList::CurrentThreadID() { MachThreadSP thread_sp; CurrentThread(thread_sp); if (thread_sp.get()) return thread_sp->ThreadID(); return INVALID_NUB_THREAD; }
void KernelCrashHandler(struct interrupt_context* intctx) { Scheduler::SaveInterruptedContext(intctx, &CurrentThread()->registers); // Panic the kernel with a diagnostic message. PanicF("Unhandled CPU Exception id %zu `%s' at ip=0x%zx (cr2=0x%zx, " "err_code=0x%zx)", intctx->int_no, ExceptionName(intctx), ExceptionLocation(intctx), intctx->cr2, intctx->err_code); }
void *thread_main(void *data) { uint32_t id = CurrentThread(); printf("[%d] starting\n", id); Delay(50); printf("[%d] exiting\n", id); return (void *) id; }
void RenderThread::getCube(Key<Vertices> &v, Key<Painter> &p) { static const std::vector<glm::vec3> positions = { glm::vec3(-1.0f, 1.0f, 1.0f), glm::vec3(-1.0f, -1.0f, 1.0f), glm::vec3(1.0f, -1.0f, 1.0f), glm::vec3(1.0f, 1.0f, 1.0f), glm::vec3(-1.0f, 1.0f, -1.0f), glm::vec3(-1.0f, -1.0f, -1.0f), glm::vec3(1.0f, -1.0f, -1.0f), glm::vec3(1.0f, 1.0f, -1.0f) }; static const std::vector<unsigned int> indices = { 0, 1, 2, 3, 0, 3, 7, 4, 4, 7, 6, 5, 6, 5, 1, 2, 2, 3, 7, 6, 4, 0, 1, 5 }; // to be sure that this function is only called in render thread AGE_ASSERT(CurrentThread() == (AGE::Thread*)GetRenderThread()); if (SimpleGeometry::cubeMesh.verticesKey.isValid() && SimpleGeometry::cubeMesh.painterKey.isValid()) { v = SimpleGeometry::cubeMesh.verticesKey; p = SimpleGeometry::cubeMesh.painterKey; return; } auto type = std::make_pair<GLenum, StringID>(GL_FLOAT_VEC3, StringID("position", 0x4cbf3a26fca1d74a)); std::vector<std::pair < GLenum, StringID > > types; types.push_back(type); if (!paintingManager->has_painter(types)) { SimpleGeometry::cubeMesh.painterKey = paintingManager->add_painter(std::move(types)); } else { SimpleGeometry::cubeMesh.painterKey = paintingManager->get_painter(types); } auto &painterPtr = paintingManager->get_painter(SimpleGeometry::cubeMesh.painterKey); SimpleGeometry::cubeMesh.verticesKey = painterPtr->add_vertices(positions.size(), indices.size()); auto vertices = painterPtr->get_vertices(SimpleGeometry::cubeMesh.verticesKey); vertices->set_data<glm::vec3>(positions, StringID("position", 0x4cbf3a26fca1d74a)); vertices->set_indices(indices); v = SimpleGeometry::cubeMesh.verticesKey; p = SimpleGeometry::cubeMesh.painterKey; }
void UserCrashHandler(struct interrupt_context* intctx) { Scheduler::SaveInterruptedContext(intctx, &CurrentThread()->registers); // Execute this crash handler with preemption on. Interrupt::Enable(); // TODO: Also send signals for other types of user-space crashes. if ( intctx->int_no == 14 /* Page fault */ ) { struct sigaction* act = &CurrentProcess()->signal_actions[SIGSEGV]; kthread_mutex_lock(&CurrentProcess()->signal_lock); bool handled = act->sa_handler != SIG_DFL && act->sa_handler != SIG_IGN; if ( handled ) CurrentThread()->DeliverSignalUnlocked(SIGSEGV); kthread_mutex_unlock(&CurrentProcess()->signal_lock); if ( handled ) { assert(Interrupt::IsEnabled()); return Signal::DispatchHandler(intctx, NULL); } } // Issue a diagnostic message to the kernel log concerning the crash. Log::PrintF("The current process (pid %ji `%s') crashed and was terminated:\n", (intmax_t) CurrentProcess()->pid, CurrentProcess()->program_image_path); Log::PrintF("%s exception at ip=0x%zx (cr2=0x%zx, err_code=0x%zx)\n", ExceptionName(intctx), ExceptionLocation(intctx), intctx->cr2, intctx->err_code); // Exit the process with the right error code. // TODO: Send a SIGINT, SIGBUS, or whatever instead. CurrentProcess()->ExitThroughSignal(SIGSEGV); // Deliver signals to this thread so it can exit correctly. assert(Interrupt::IsEnabled()); Signal::DispatchHandler(intctx, NULL); }
void RenderThread::_initPipelines() { // to be sure that this function is only called in render thread AGE_ASSERT(CurrentThread() == (AGE::Thread*)GetRenderThread()); for (auto &e : pipelines) { if (!e) { continue; } e->init(); } }
void RenderThread::getIcoSphereGeometry(Key<Vertices> &v, Key<Painter> &p, uint32_t recursion) { std::vector<glm::vec3> positions; std::vector<unsigned int> indices; // to be sure that this function is only called in render thread AGE_ASSERT(CurrentThread() == (AGE::Thread*)GetRenderThread()); if (SimpleGeometry::icosphereMeshes[recursion].verticesKey.isValid() && SimpleGeometry::icosphereMeshes[recursion].painterKey.isValid()) { v = SimpleGeometry::icosphereMeshes[recursion].verticesKey; p = SimpleGeometry::icosphereMeshes[recursion].painterKey; return; } SimpleGeometry::generateIcoSphere(recursion, positions, indices); auto type = std::make_pair<GLenum, StringID>(GL_FLOAT_VEC3, StringID("position", 0x4cbf3a26fca1d74a)); std::vector<std::pair < GLenum, StringID > > types; types.push_back(type); if (!paintingManager->has_painter(types)) { SimpleGeometry::icosphereMeshes[recursion].painterKey = paintingManager->add_painter(std::move(types)); } else { SimpleGeometry::icosphereMeshes[recursion].painterKey = paintingManager->get_painter(types); } auto &painterPtr = paintingManager->get_painter(SimpleGeometry::icosphereMeshes[recursion].painterKey); SimpleGeometry::icosphereMeshes[recursion].verticesKey = painterPtr->add_vertices(positions.size(), indices.size()); auto vertices = painterPtr->get_vertices(SimpleGeometry::icosphereMeshes[recursion].verticesKey); vertices->set_data<glm::vec3>(positions, StringID("position", 0x4cbf3a26fca1d74a)); vertices->set_indices(indices); v = SimpleGeometry::icosphereMeshes[recursion].verticesKey; p = SimpleGeometry::icosphereMeshes[recursion].painterKey; }
extern "C" void kthread_exit() { Worker::Schedule(kthread_do_kill_thread, CurrentThread()); Scheduler::ExitThread(); __builtin_unreachable(); }