VirtualBox

Changeset 51461 in vbox for trunk/src/VBox/Devices/Graphics


Ignore:
Timestamp:
May 29, 2014 1:20:06 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
94031
Message:

Graphics: never change connector to avoid racing; Graphics/Main: fix deadlocks

Location:
trunk/src/VBox/Devices/Graphics
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA.cpp

    r51365 r51461  
    16991699 * - flashing
    17001700 */
    1701 static int vga_draw_text(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty)
     1701static int vga_draw_text(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty,
     1702        PDMIDISPLAYCONNECTOR *pDrv, bool fRenderVRAM)
    17021703{
    17031704    int cx, cy, cheight, cw, ch, cattr, height, width, ch_attr;
     
    17521753    if (pThis->sr[1] & 0x08)
    17531754        cw = 16; /* NOTE: no 18 pixel wide */
    1754     x_incr = cw * ((pThis->pDrv->cBits + 7) >> 3);
     1755    x_incr = cw * ((pDrv->cBits + 7) >> 3);
    17551756    width = (pThis->cr[0x01] + 1);
    17561757    if (pThis->cr[0x06] == 100) {
     
    17781779        pThis->last_scr_height = height * cheight;
    17791780        /* For text modes the direct use of guest VRAM is not implemented, so bpp and cbLine are 0 here. */
    1780         int rc = pThis->pDrv->pfnResize(pThis->pDrv, 0, NULL, 0, pThis->last_scr_width, pThis->last_scr_height);
     1781        int rc = pDrv->pfnResize(pDrv, 0, NULL, 0, pThis->last_scr_width, pThis->last_scr_height);
    17811782        pThis->last_width = width;
    17821783        pThis->last_height = height;
     
    18031804    }
    18041805    cursor_ptr = pThis->CTX_SUFF(vram_ptr) + (pThis->start_addr + cursor_offset) * 8;
    1805     depth_index = get_depth_index(pThis->pDrv->cBits);
     1806    depth_index = get_depth_index(pDrv->cBits);
    18061807    if (cw == 16)
    18071808        vga_draw_glyph8 = vga_draw_glyph16_table[depth_index];
     
    18101811    vga_draw_glyph9 = vga_draw_glyph9_table[depth_index];
    18111812
    1812     dest = pThis->pDrv->pu8Data;
    1813     linesize = pThis->pDrv->cbScanline;
     1813    dest = pDrv->pu8Data;
     1814    linesize = pDrv->cbScanline;
    18141815    ch_attr_ptr = pThis->last_ch_attr;
    18151816    cy_start = -1;
     
    18431844                fgcol = palette[cattr & 0x0f];
    18441845                if (cw != 9) {
    1845                     if (pThis->fRenderVRAM)
     1846                    if (fRenderVRAM)
    18461847                        vga_draw_glyph8(d1, linesize,
    18471848                                        font_ptr, cheight, fgcol, bgcol, dscan);
     
    18501851                    if (ch >= 0xb0 && ch <= 0xdf && (pThis->ar[0x10] & 0x04))
    18511852                        dup9 = 1;
    1852                     if (pThis->fRenderVRAM)
     1853                    if (fRenderVRAM)
    18531854                        vga_draw_glyph9(d1, linesize,
    18541855                                        font_ptr, cheight, fgcol, bgcol, dup9);
     
    18671868                        d = d1 + (linesize * line_start << dscan);
    18681869                        if (cw != 9) {
    1869                             if (pThis->fRenderVRAM)
     1870                            if (fRenderVRAM)
    18701871                                vga_draw_glyph8(d, linesize,
    18711872                                                cursor_glyph, h, fgcol, bgcol, dscan);
    18721873                        } else {
    1873                             if (pThis->fRenderVRAM)
     1874                            if (fRenderVRAM)
    18741875                                vga_draw_glyph9(d, linesize,
    18751876                                                cursor_glyph, h, fgcol, bgcol, 1);
     
    18921893        } else if (cy_start >= 0) {
    18931894            /* Flush updates to display. */
    1894             pThis->pDrv->pfnUpdateRect(pThis->pDrv, cx_min_upd * cw, cy_start * cheight,
     1895            pDrv->pfnUpdateRect(pDrv, cx_min_upd * cw, cy_start * cheight,
    18951896                                       (cx_max_upd - cx_min_upd + 1) * cw, (cy - cy_start) * cheight);
    18961897            cy_start = -1;
     
    19031904    if (cy_start >= 0)
    19041905        /* Flush any remaining changes to display. */
    1905         pThis->pDrv->pfnUpdateRect(pThis->pDrv, cx_min_upd * cw, cy_start * cheight,
     1906        pDrv->pfnUpdateRect(pDrv, cx_min_upd * cw, cy_start * cheight,
    19061907                                   (cx_max_upd - cx_min_upd + 1) * cw, (cy - cy_start) * cheight);
    19071908        return VINF_SUCCESS;
     
    20212022 * @param   cy      The height.
    20222023 */
    2023 static int vga_resize_graphic(PVGASTATE pThis, int cx, int cy)
     2024static int vga_resize_graphic(PVGASTATE pThis, int cx, int cy,
     2025                PDMIDISPLAYCONNECTOR *pDrv)
    20242026{
    20252027    const unsigned cBits = pThis->get_bpp(pThis);
     
    20482050        if (pThis->start_addr * 4 + pThis->line_offset * cy < pThis->vram_size)
    20492051            /* Take into account the programmed start address (in DWORDs) of the visible screen. */
    2050             rc = pThis->pDrv->pfnResize(pThis->pDrv, cBits, pThis->CTX_SUFF(vram_ptr) + pThis->start_addr * 4, pThis->line_offset, cx, cy);
     2052            rc = pDrv->pfnResize(pDrv, cBits, pThis->CTX_SUFF(vram_ptr) + pThis->start_addr * 4, pThis->line_offset, cx, cy);
    20512053        else
    20522054        {
     
    20682070
    20692071    /* update palette */
    2070     switch (pThis->pDrv->cBits)
     2072    switch (pDrv->cBits)
    20712073    {
    20722074        case 32:    pThis->rgb_to_pixel = rgb_to_pixel32_dup; break;
     
    21522154 * graphic modes
    21532155 */
    2154 static int vmsvga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty)
     2156static int vmsvga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty,
     2157                PDMIDISPLAYCONNECTOR *pDrv, bool fRenderVRAM)
    21552158{
    21562159    int y, page_min, page_max, linesize, y_start;
     
    21972200        break;
    21982201    }
    2199     vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(pThis->pDrv->cBits)];
     2202    vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(pDrv->cBits)];
    22002203
    22012204    if (pThis->cursor_invalidate)
     
    22072210    page_min = 0x7fffffff;
    22082211    page_max = -1;
    2209     d = pThis->pDrv->pu8Data;
    2210     linesize = pThis->pDrv->cbScanline;
     2212    d = pDrv->pu8Data;
     2213    linesize = pDrv->cbScanline;
    22112214
    22122215    for(y = 0; y < height; y++)
     
    22302233            if (page1 > page_max)
    22312234                page_max = page1;
    2232             if (pThis->fRenderVRAM)
     2235            if (fRenderVRAM)
    22332236                vga_draw_line(pThis, d, pThis->CTX_SUFF(vram_ptr) + addr, width);
    22342237            if (pThis->cursor_draw_line)
     
    22402243                /* flush to display */
    22412244                Log(("Flush to display (%d,%d)(%d,%d)\n", 0, y_start, disp_width, y - y_start));
    2242                 pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start);
     2245                pDrv->pfnUpdateRect(pDrv, 0, y_start, disp_width, y - y_start);
    22432246                y_start = -1;
    22442247            }
     
    22502253        /* flush to display */
    22512254        Log(("Flush to display (%d,%d)(%d,%d)\n", 0, y_start, disp_width, y - y_start));
    2252         pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start);
     2255        pDrv->pfnUpdateRect(pDrv, 0, y_start, disp_width, y - y_start);
    22532256    }
    22542257    /* reset modified pages */
     
    22632266 * graphic modes
    22642267 */
    2265 static int vga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty)
     2268static int vga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty,
     2269                PDMIDISPLAYCONNECTOR *pDrv, bool fRenderVRAM)
    22662270{
    22672271    int y1, y2, y, page_min, page_max, linesize, y_start, double_scan;
     
    23412345        ||  height         != (int)pThis->last_height
    23422346        ||  pThis->get_bpp(pThis)  != (int)pThis->last_bpp
    2343         || (offsets_changed && !pThis->fRenderVRAM))
     2347        || (offsets_changed && !fRenderVRAM))
    23442348    {
    23452349        if (fFailOnResize)
     
    23482352            return VERR_TRY_AGAIN;
    23492353        }
    2350         int rc = vga_resize_graphic(pThis, disp_width, height);
     2354        int rc = vga_resize_graphic(pThis, disp_width, height, pDrv);
    23512355        if (rc != VINF_SUCCESS)  /* Return any rc, particularly VINF_VGA_RESIZE_IN_PROGRESS, to the caller. */
    23522356            return rc;
     
    23542358    }
    23552359
    2356     if (pThis->fRenderVRAM)
     2360    if (fRenderVRAM)
    23572361    {
    23582362        /* Do not update the destination buffer if it is not big enough.
    23592363         * Can happen if the resize request was ignored by the driver.
    23602364         */
    2361         if (   pThis->pDrv->cx != (uint32_t)width
    2362             || pThis->pDrv->cy != (uint32_t)height)
     2365        if (   pDrv->cx != (uint32_t)width
     2366            || pDrv->cy != (uint32_t)height)
    23632367        {
    23642368            LogRel(("Framebuffer mismatch: vga %dx%d, drv %dx%d!!!\n",
    23652369                    width, height,
    2366                     pThis->pDrv->cx, pThis->pDrv->cy));
     2370                    pDrv->cx, pDrv->cy));
    23672371            return VINF_SUCCESS;
    23682372        }
    23692373    }
    23702374
    2371     vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(pThis->pDrv->cBits)];
     2375    vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(pDrv->cBits)];
    23722376
    23732377    if (pThis->cursor_invalidate)
     
    23842388    page_min = 0x7fffffff;
    23852389    page_max = -1;
    2386     d = pThis->pDrv->pu8Data;
    2387     linesize = pThis->pDrv->cbScanline;
     2390    d = pDrv->pu8Data;
     2391    linesize = pDrv->cbScanline;
    23882392
    23892393    y1 = 0;
     
    24162420            if (page1 > page_max)
    24172421                page_max = page1;
    2418             if (pThis->fRenderVRAM)
     2422            if (fRenderVRAM)
    24192423                vga_draw_line(pThis, d, pThis->CTX_SUFF(vram_ptr) + addr, width);
    24202424            if (pThis->cursor_draw_line)
     
    24232427            if (y_start >= 0) {
    24242428                /* flush to display */
    2425                 pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start);
     2429                pDrv->pfnUpdateRect(pDrv, 0, y_start, disp_width, y - y_start);
    24262430                y_start = -1;
    24272431            }
     
    24472451    if (y_start >= 0) {
    24482452        /* flush to display */
    2449         pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start);
     2453        pDrv->pfnUpdateRect(pDrv, 0, y_start, disp_width, y - y_start);
    24502454    }
    24512455    /* reset modified pages */
     
    24572461}
    24582462
    2459 static void vga_draw_blank(PVGASTATE pThis, int full_update)
     2463static void vga_draw_blank(PVGASTATE pThis, int full_update, PDMIDISPLAYCONNECTOR *pDrv, bool fRenderVRAM)
    24602464{
    24612465    int i, w, val;
    24622466    uint8_t *d;
    2463     uint32_t cbScanline = pThis->pDrv->cbScanline;
    2464 
    2465     if (pThis->pDrv->pu8Data == pThis->vram_ptrR3) /* Do not clear the VRAM itself. */
     2467    uint32_t cbScanline = pDrv->cbScanline;
     2468
     2469    if (pDrv->pu8Data == pThis->vram_ptrR3) /* Do not clear the VRAM itself. */
    24662470        return;
    24672471    if (!full_update)
     
    24692473    if (pThis->last_scr_width <= 0 || pThis->last_scr_height <= 0)
    24702474        return;
    2471     if (pThis->pDrv->cBits == 8)
     2475    if (pDrv->cBits == 8)
    24722476        val = pThis->rgb_to_pixel(0, 0, 0);
    24732477    else
    24742478        val = 0;
    2475     w = pThis->last_scr_width * ((pThis->pDrv->cBits + 7) >> 3);
    2476     d = pThis->pDrv->pu8Data;
    2477     if (pThis->fRenderVRAM)
     2479    w = pThis->last_scr_width * ((pDrv->cBits + 7) >> 3);
     2480    d = pDrv->pu8Data;
     2481    if (fRenderVRAM)
    24782482    {
    24792483        for(i = 0; i < (int)pThis->last_scr_height; i++) {
     
    24822486        }
    24832487    }
    2484     pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, 0, pThis->last_scr_width, pThis->last_scr_height);
     2488    pDrv->pfnUpdateRect(pDrv, 0, 0, pThis->last_scr_width, pThis->last_scr_height);
    24852489}
    24862490
     
    24982502#endif
    24992503
    2500 static int vga_update_display(PVGASTATE pThis, bool fUpdateAll, bool fFailOnResize, bool reset_dirty)
     2504static int vga_update_display(PVGASTATE pThis, bool fUpdateAll, bool fFailOnResize, bool reset_dirty,
     2505        PDMIDISPLAYCONNECTOR *pDrv, int32_t *pcur_graphic_mode, bool fRenderVRAM)
    25012506{
    25022507    int rc = VINF_SUCCESS;
    25032508    int graphic_mode;
    25042509
    2505     if (pThis->pDrv->cBits == 0) {
     2510    if (pDrv->cBits == 0) {
    25062511        /* nothing to do */
    25072512    } else {
    2508         switch(pThis->pDrv->cBits) {
     2513        switch(pDrv->cBits) {
    25092514        case 8:
    25102515            pThis->rgb_to_pixel = rgb_to_pixel8_dup;
     
    25432548            if (fBlank) {
    25442549                /* Provide a void pfnUpdateRect callback. */
    2545                 if (pThis->pDrv) {
    2546                     pfnUpdateRect = pThis->pDrv->pfnUpdateRect;
    2547                     pThis->pDrv->pfnUpdateRect = voidUpdateRect;
     2550                if (pDrv) {
     2551                    pfnUpdateRect = pDrv->pfnUpdateRect;
     2552                    pDrv->pfnUpdateRect = voidUpdateRect;
    25482553                }
    25492554            }
     
    25522557#ifdef VBOX_WITH_VMSVGA
    25532558            if (pThis->svga.fEnabled) {
    2554                 pThis->graphic_mode = GMODE_SVGA;
    2555                 rc = vmsvga_draw_graphic(pThis, 1, false, reset_dirty);
     2559                *pcur_graphic_mode = GMODE_SVGA;
     2560                rc = vmsvga_draw_graphic(pThis, 1, false, reset_dirty, pDrv, fRenderVRAM);
    25562561            }
    25572562            else
    25582563#endif
    25592564            if (pThis->gr[6] & 1) {
    2560                 pThis->graphic_mode = GMODE_GRAPH;
    2561                 rc = vga_draw_graphic(pThis, 1, false, reset_dirty);
     2565                *pcur_graphic_mode = GMODE_GRAPH;
     2566                rc = vga_draw_graphic(pThis, 1, false, reset_dirty, pDrv, fRenderVRAM);
    25622567            } else {
    2563                 pThis->graphic_mode = GMODE_TEXT;
    2564                 rc = vga_draw_text(pThis, 1, false, reset_dirty);
     2568                *pcur_graphic_mode = GMODE_TEXT;
     2569                rc = vga_draw_text(pThis, 1, false, reset_dirty, pDrv, fRenderVRAM);
    25652570            }
    25662571
    25672572            if (fBlank) {
    25682573                /* Set the current mode and restore the callback. */
    2569                 pThis->graphic_mode = GMODE_BLANK;
    2570                 if (pThis->pDrv) {
    2571                     pThis->pDrv->pfnUpdateRect = pfnUpdateRect;
     2574                *pcur_graphic_mode = GMODE_BLANK;
     2575                if (pDrv) {
     2576                    pDrv->pfnUpdateRect = pfnUpdateRect;
    25722577                }
    25732578            }
     
    25862591            graphic_mode = pThis->gr[6] & 1;
    25872592        }
    2588         bool full_update = graphic_mode != pThis->graphic_mode;
     2593        bool full_update = graphic_mode != *pcur_graphic_mode;
    25892594        if (full_update) {
    2590             pThis->graphic_mode = graphic_mode;
     2595            *pcur_graphic_mode = graphic_mode;
    25912596        }
    25922597        switch(graphic_mode) {
    25932598        case GMODE_TEXT:
    2594             rc = vga_draw_text(pThis, full_update, fFailOnResize, reset_dirty);
     2599            rc = vga_draw_text(pThis, full_update, fFailOnResize, reset_dirty, pDrv, fRenderVRAM);
    25952600            break;
    25962601        case GMODE_GRAPH:
    2597             rc = vga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty);
     2602            rc = vga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty, pDrv, fRenderVRAM);
    25982603            break;
    25992604#ifdef VBOX_WITH_VMSVGA
    26002605        case GMODE_SVGA:
    2601             rc = vmsvga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty);
     2606            rc = vmsvga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty, pDrv, fRenderVRAM);
    26022607            break;
    26032608#endif
    26042609        case GMODE_BLANK:
    26052610        default:
    2606             vga_draw_blank(pThis, full_update);
     2611            vga_draw_blank(pThis, full_update, pDrv, fRenderVRAM);
    26072612            break;
    26082613        }
     
    46054610    }
    46064611
    4607     rc = vga_update_display(pThis, false, false, true);
     4612    rc = vga_update_display(pThis, false, false, true,
     4613            pThis->pDrv, &pThis->graphic_mode, pThis->fRenderVRAM);
    46084614    PDMCritSectLeave(&pThis->CritSect);
    46094615    return rc;
     
    46374643    pThis->graphic_mode = -1; /* force full update */
    46384644
    4639     return vga_update_display(pThis, true, false, true);
    4640 }
    4641 
     4645    return vga_update_display(pThis, true, false, true,
     4646            pThis->pDrv, &pThis->graphic_mode, pThis->fRenderVRAM);
     4647}
     4648
     4649
     4650int vgaUpdateDisplayAll(PVGASTATE pThis)
     4651{
     4652#ifdef DEBUG_sunlover
     4653    LogFlow(("vgaPortUpdateDisplayAll\n"));
     4654#endif /* DEBUG_sunlover */
     4655
     4656    int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
     4657    AssertRC(rc);
     4658
     4659    rc = updateDisplayAll(pThis);
     4660
     4661    PDMCritSectLeave(&pThis->CritSect);
     4662    return rc;
     4663}
    46424664
    46434665/**
     
    46504672{
    46514673    PVGASTATE pThis = IDISPLAYPORT_2_VGASTATE(pInterface);
    4652     /* this can be called from CmdVbva thread as a result of VBVA disable,
    4653      * there should be no problem with calling it from there afaics */
    4654 //    PDMDEV_ASSERT_EMT(VGASTATE2DEVINS(pThis));
     4674    PDMDEV_ASSERT_EMT(VGASTATE2DEVINS(pThis));
    46554675
    46564676    /* This is called both in VBVA mode and normal modes. */
    46574677
    4658 #ifdef DEBUG_sunlover
    4659     LogFlow(("vgaPortUpdateDisplayAll\n"));
    4660 #endif /* DEBUG_sunlover */
    4661 
    4662     int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
    4663     AssertRC(rc);
    4664 
    4665     rc = updateDisplayAll(pThis);
    4666 
    4667     PDMCritSectLeave(&pThis->CritSect);
    4668     return rc;
     4678    return vgaUpdateDisplayAll(pThis);
    46694679}
    46704680
     
    47594769            Connector.pfnResize     = vgaDummyResize;
    47604770            Connector.pfnUpdateRect = vgaDummyUpdateRect;
    4761             /* keep the CtlSubmit unchanged */
    4762             Connector.pfnCrHgcmCtlSubmit = pThis->pDrv ? pThis->pDrv->pfnCrHgcmCtlSubmit : NULL;
    4763 
    4764             /* Save & replace state data. */
    4765             PPDMIDISPLAYCONNECTOR pConnectorSaved = pThis->pDrv;
    4766             int32_t graphic_mode_saved = pThis->graphic_mode;
    4767             bool fRenderVRAMSaved = pThis->fRenderVRAM;
    4768 
    4769             pThis->pDrv = &Connector;
    4770             pThis->graphic_mode = -1;           /* force a full refresh. */
    4771             pThis->fRenderVRAM = 1;             /* force the guest VRAM rendering to the given buffer. */
     4771
     4772            int32_t cur_graphic_mode = -1;
    47724773
    47734774            /*
     
    47794780             * If there is a pending resize, the function will fail.
    47804781             */
    4781             rc = vga_update_display(pThis, false, true, false);
    4782 
    4783             /* Restore. */
    4784             pThis->pDrv = pConnectorSaved;
    4785             pThis->graphic_mode = graphic_mode_saved;
    4786             pThis->fRenderVRAM = fRenderVRAMSaved;
     4782            rc = vga_update_display(pThis, false, true, false,
     4783                    &Connector, &cur_graphic_mode, 1);
    47874784
    47884785            if (rc == VINF_SUCCESS)
  • trunk/src/VBox/Devices/Graphics/DevVGA.h

    r51349 r51461  
    651651int vboxVBVALoadStateDone (PPDMDEVINS pDevIns, PSSMHANDLE pSSM);
    652652
     653int vgaUpdateDisplayAll(PVGASTATE pThis);
     654
    653655# ifdef VBOX_WITH_VDMA
    654656typedef struct VBOXVDMAHOST *PVBOXVDMAHOST;
  • trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp

    r51364 r51461  
    11361136    VBVAEXHOSTCTL HCtl;
    11371137    HCtl.enmType = VBVAEXHOSTCTL_TYPE_GHH_DISABLE;
    1138     return vdmaVBVACtlSubmitSync(pVdma, &HCtl, VBVAEXHOSTCTL_SOURCE_HOST);
     1138    int rc = vdmaVBVACtlSubmitSync(pVdma, &HCtl, VBVAEXHOSTCTL_SOURCE_HOST);
     1139    if (RT_FAILURE(rc))
     1140    {
     1141        WARN(("vdmaVBVACtlSubmitSync failed %d\n", rc));
     1142        return rc;
     1143    }
     1144
     1145    vgaUpdateDisplayAll(pVdma->pVGAState);
     1146
     1147    return VINF_SUCCESS;
    11391148}
    11401149
     
    15951604                return rc;
    15961605            }
     1606
     1607            /* do vgaUpdateDisplayAll right away */
     1608            vgaUpdateDisplayAll(pVdma->pVGAState);
    15971609
    15981610            return VBoxVDMAThreadTerm(&pVdma->Thread, NULL, NULL, false);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette