void get_connection_contexts(struct modemdata *data) { GError *err = NULL; GVariantIter *iter; const char *obj_path; int i; GVariant *contexts = g_dbus_proxy_call_sync(data->connman, "GetContexts", NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err); if (err) { g_warning("GetContexts failed: %s\n", err->message); g_error_free(err); return; } g_print("contexts type: %s\n", g_variant_get_type_string(contexts)); g_variant_get(contexts, "(a(oa{sv}))", &iter); i = 0; while (g_variant_iter_loop(iter, "oa{sv}", &obj_path, NULL)) { g_print("context: %s\n", obj_path); if (i == used_context) activate_context(data, obj_path); i++; } g_variant_iter_free(iter); g_variant_unref(contexts); }
/*==========================================================================* * Name: smp_invalidate_interrupt * * Description: This routine executes on CPU which received * 'INVALIDATE_TLB_IPI'. * 1.Flush local TLB. * 2.Report flush TLB process was finished. * * Born on Date: 2002.02.05 * * Arguments: NONE * * Returns: void (cannot fail) * * Modification log: * Date Who Description * ---------- --- -------------------------------------------------------- * *==========================================================================*/ void smp_invalidate_interrupt(void) { int cpu_id = smp_processor_id(); unsigned long *mmc = &flush_mm->context[cpu_id]; if (!cpumask_test_cpu(cpu_id, &flush_cpumask)) return; if (flush_va == FLUSH_ALL) { *mmc = NO_CONTEXT; if (flush_mm == current->active_mm) activate_context(flush_mm); else cpumask_clear_cpu(cpu_id, mm_cpumask(flush_mm)); } else { unsigned long va = flush_va; if (*mmc != NO_CONTEXT) { va &= PAGE_MASK; va |= (*mmc & MMU_CONTEXT_ASID_MASK); __flush_tlb_page(va); } } cpumask_clear_cpu(cpu_id, (cpumask_t*)&flush_cpumask); }
/*==========================================================================* * Name: smp_flush_tlb_mm * * Description: This routine flushes the specified mm context TLB's. * * Born on Date: 2002.02.05 * * Arguments: *mm - a pointer to the mm struct for flush TLB * * Returns: void (cannot fail) * * Modification log: * Date Who Description * ---------- --- -------------------------------------------------------- * *==========================================================================*/ void smp_flush_tlb_mm(struct mm_struct *mm) { int cpu_id; cpumask_t cpu_mask; unsigned long *mmc; unsigned long flags; preempt_disable(); cpu_id = smp_processor_id(); mmc = &mm->context[cpu_id]; cpumask_copy(&cpu_mask, mm_cpumask(mm)); cpumask_clear_cpu(cpu_id, &cpu_mask); if (*mmc != NO_CONTEXT) { local_irq_save(flags); *mmc = NO_CONTEXT; if (mm == current->mm) activate_context(mm); else cpumask_clear_cpu(cpu_id, mm_cpumask(mm)); local_irq_restore(flags); } if (!cpumask_empty(&cpu_mask)) flush_tlb_others(cpu_mask, mm, NULL, FLUSH_ALL); preempt_enable(); }
void opengl_window::destroying() { activate_context(); if (iFrameBufferSize != size{}) { glCheck(glDeleteRenderbuffers(1, &iDepthStencilBuffer)); glCheck(glDeleteTextures(1, &iFrameBufferTexture)); glCheck(glDeleteFramebuffers(1, &iFrameBuffer)); } deactivate_context(); }
void local_flush_tlb_mm(struct mm_struct *mm) { int cpu = smp_processor_id(); if (mm == current->active_mm) { unsigned long flags; local_irq_save(flags); mm->context.asid[cpu] = NO_CONTEXT; activate_context(mm, cpu); local_irq_restore(flags); } else { mm->context.asid[cpu] = NO_CONTEXT; mm->context.cpu = -1; } }
void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end) { struct mm_struct *mm = vma->vm_mm; unsigned int cpu = smp_processor_id(); if (cpu_context(cpu, mm) != NO_CONTEXT) { unsigned long flags; int size; local_irq_save(flags); size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT; if (size > (MMU_NTLB_ENTRIES/4)) { /* Too many TLB to flush */ cpu_context(cpu, mm) = NO_CONTEXT; if (mm == current->mm) activate_context(mm, cpu); } else { unsigned long asid; unsigned long saved_asid = MMU_NO_ASID; asid = cpu_asid(cpu, mm); start &= PAGE_MASK; end += (PAGE_SIZE - 1); end &= PAGE_MASK; if (mm != current->mm) { saved_asid = get_asid(); set_asid(asid); } while (start < end) { local_flush_tlb_one(asid, start); start += PAGE_SIZE; } if (saved_asid != MMU_NO_ASID) set_asid(saved_asid); } local_irq_restore(flags); }
void opengl_window::render() { if (iRendering || processing_event()) return; uint64_t now = app::instance().program_elapsed_ms(); if (iFrameRate != boost::none && now - iLastFrameTime < 1000 / *iFrameRate) return; if (!iEventHandler.native_window_ready_to_render()) return; rendering_check.trigger(); if (iInvalidatedRects.empty()) return; ++iFrameCounter; iRendering = true; iLastFrameTime = now; rendering.trigger(); rect invalidatedRect = *iInvalidatedRects.begin(); for (const auto& ir : iInvalidatedRects) { invalidatedRect = invalidatedRect.combine(ir); } iInvalidatedRects.clear(); invalidatedRect.cx = std::min(invalidatedRect.cx, surface_size().cx - invalidatedRect.x); invalidatedRect.cy = std::min(invalidatedRect.cy, surface_size().cy - invalidatedRect.y); static bool initialized = false; if (!initialized) { rendering_engine().initialize(); initialized = true; } activate_context(); glCheck(glViewport(0, 0, static_cast<GLsizei>(extents().cx), static_cast<GLsizei>(extents().cy))); glCheck(glMatrixMode(GL_PROJECTION)); glCheck(glLoadIdentity()); glCheck(glScalef(1.0, 1.0, 1.0)); glCheck(glMatrixMode(GL_MODELVIEW)); glCheck(glLoadIdentity()); const auto& logicalCoordinates = logical_coordinates(); glCheck(glOrtho(logicalCoordinates[0], logicalCoordinates[2], logicalCoordinates[1], logicalCoordinates[3], -1.0, 1.0)); glCheck(glEnableClientState(GL_VERTEX_ARRAY)); glCheck(glEnableClientState(GL_COLOR_ARRAY)); glCheck(glEnableClientState(GL_TEXTURE_COORD_ARRAY)); glCheck(glEnable(GL_TEXTURE_2D)); glCheck(glEnable(GL_MULTISAMPLE)); glCheck(glEnable(GL_BLEND)); if (iFrameBufferSize.cx < static_cast<double>(extents().cx) || iFrameBufferSize.cy < static_cast<double>(extents().cy)) { if (iFrameBufferSize != size{}) { glCheck(glDeleteRenderbuffers(1, &iDepthStencilBuffer)); glCheck(glDeleteTextures(1, &iFrameBufferTexture)); glCheck(glDeleteFramebuffers(1, &iFrameBuffer)); } iFrameBufferSize = size( iFrameBufferSize.cx < extents().cx ? extents().cx * 1.5f : iFrameBufferSize.cx, iFrameBufferSize.cy < extents().cy ? extents().cy * 1.5f : iFrameBufferSize.cy); glCheck(glGenFramebuffers(1, &iFrameBuffer)); glCheck(glBindFramebuffer(GL_FRAMEBUFFER, iFrameBuffer)); glCheck(glGenTextures(1, &iFrameBufferTexture)); glCheck(glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, iFrameBufferTexture)); glCheck(glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, static_cast<GLsizei>(iFrameBufferSize.cx), static_cast<GLsizei>(iFrameBufferSize.cy), true)); glCheck(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, iFrameBufferTexture, 0)); glCheck(glGenRenderbuffers(1, &iDepthStencilBuffer)); glCheck(glBindRenderbuffer(GL_RENDERBUFFER, iDepthStencilBuffer)); glCheck(glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, static_cast<GLsizei>(iFrameBufferSize.cx), static_cast<GLsizei>(iFrameBufferSize.cy))); glCheck(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, iDepthStencilBuffer)); glCheck(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, iDepthStencilBuffer)); } else { glCheck(glBindFramebuffer(GL_FRAMEBUFFER, iFrameBuffer)); glCheck(glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, iFrameBufferTexture)); glCheck(glBindRenderbuffer(GL_RENDERBUFFER, iDepthStencilBuffer)); } GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_NO_ERROR && status != GL_FRAMEBUFFER_COMPLETE) throw failed_to_create_framebuffer(status); glCheck(glBindFramebuffer(GL_FRAMEBUFFER, iFrameBuffer)); GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glCheck(glDrawBuffers(sizeof(drawBuffers) / sizeof(drawBuffers[0]), drawBuffers)); glCheck(iEventHandler.native_window_render(invalidatedRect)); glCheck(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0)); glCheck(glBindFramebuffer(GL_READ_FRAMEBUFFER, iFrameBuffer)); glCheck(glBlitFramebuffer(0, 0, static_cast<GLint>(extents().cx), static_cast<GLint>(extents().cy), 0, 0, static_cast<GLint>(extents().cx), static_cast<GLint>(extents().cy), GL_COLOR_BUFFER_BIT, GL_NEAREST)); display(); deactivate_context(); iRendering = false; rendering_finished.trigger(); }