> On 21 Mar 2017, at 11:51, Frediano Ziglio <fzig...@redhat.com 
> <mailto:fzig...@redhat.com>> wrote:
> So does Emacs, but it shows additional ^M within the file if CR/LF is 
> inconsistent throughout the file, as it the case here, presumably because the 
> .gitattributes was added in the middle of the life of the project without 
> first making the files consistent.
> There's no mix in single files, I have a script to test this issue. 
> gitattributes was added after making each file consistent but all files are 
> not consistent (as stated above).
> Probably you applied from the mail which tend to strip CRs at the end so you 
> got the inconsistency.

Not just at the end, it strips all CR. But you are right, only the patched file 
was inconsistent.

Christophe

> 
> Thanks,
> Christophe
> 
> Frediano
> 
> On 20 Mar 2017, at 13:08, Frediano Ziglio <fzig...@redhat.com 
> <mailto:fzig...@redhat.com>> wrote:
> 
> 
> Instead of sending drawable commands down from presentation
> callback, collect drawables objects and pass them to dedicated
> thread for processing. This reduce peak load of presentation
> callback.
> 
> Signed-off-by: Javier Celaya <javier.cel...@flexvdi.com 
> <mailto:javier.cel...@flexvdi.com>>
> Signed-off-by: Yuri Benditovich <yuri.benditov...@daynix.com 
> <mailto:yuri.benditov...@daynix.com>>
> ---
> qxldod/QxlDod.cpp | 43 +++++++++++++++++++++++++++++++++----------
> qxldod/QxlDod.h   |  4 ++--
> 2 files changed, 35 insertions(+), 12 deletions(-)
> 
> diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
> index b952bf9..01de9b3 100755
> --- a/qxldod/QxlDod.cpp
> +++ b/qxldod/QxlDod.cpp
> @@ -3794,11 +3794,20 @@ QxlDevice::ExecutePresentDisplayOnly(
>     SIZE_T sizeRects = NumDirtyRects*sizeof(RECT);
>     SIZE_T size = sizeof(DoPresentMemory) + sizeMoves + sizeRects;
> 
> +    QXLDrawable **pDrawables = reinterpret_cast<QXLDrawable **>(new
> (NonPagedPoolNx) BYTE[sizeof(QXLDrawable *)*(NumDirtyRects + NumMoves +
> 1)]);
> 
> here would be
> 
>  QXLDrawable **pDrawables = new (NonPagedPoolNx) QXLDrawable *[NumDirtyRects 
> + NumMoves + 1];
> 
> is non paged memory needed? Both functions (producer and consumer) are in 
> paged areas.
> 
> +    UINT nIndex = 0;
> +
> +    if (!pDrawables)
> +    {
> +        return STATUS_NO_MEMORY;
> +    }
> +
>     DoPresentMemory* ctx = reinterpret_cast<DoPresentMemory*>
>                                 (new (NonPagedPoolNx) BYTE[size]);
> 
> 
>   DoPresentMemory* ctx = new (NonPagedPoolNx) DoPresentMemory;
> 
> That would be nicer, but apparently, there is extra stuff padded to it:
> 
>     SIZE_T size = sizeof(DoPresentMemory) + sizeMoves + sizeRects;
> 
> 
> Also, this part of the code was not changed. It was like this before. But is 
> it necessary ? It’s really borderline with respect to alignment. In one case, 
> we have BYTE-aligned memory, in the other it’s at least sizeof(void *).
> 
> You could use placement new. Assuming non-paged pool:
> 
>  BYTE *storage = new(NonPagedPoolNx) BYTE[size];
>  DoPresentMemory *ctx = new(storage) DoPresentMemory;
> 
> There’s no constructor, apparently. So it does not make much of a difference.
> Looking at the code it looks quite weird, a ctx is allocated in the function, 
> then at the end freed,
> I found these comments:
> 
>     // Alternate between synch and asynch execution, for demonstrating 
>     // that a real hardware implementation can do either
> ...
> 
>     // Save Mdl to unmap and unlock the pages in worker thread
> ...
> 
>     // copy moves and update pointer
> ...
> 
>     // copy dirty rects and update pointer
> 
> 
> apparently this is all due to the initial code (from a Microsoft example) 
> that was marshalling this
> call to a worker thread.
> However now that we are going to introduce a worker thread this looks 
> misleading.
> I would remove comments and code. For instance there's no need to copy Moves 
> & DirtyRect
> and DoPresentMemory can be allocated just in the stack (or even better 
> removed).
> 
> same comments as above
> 
>     if (!ctx)
>     {
> +        delete[] reinterpret_cast<BYTE*>(pDrawables);
> 
> delete[] pDrawables;
> 
>         return STATUS_NO_MEMORY;
>     }
> 
> @@ -3828,6 +3837,8 @@ QxlDevice::ExecutePresentDisplayOnly(
>         PMDL mdl = IoAllocateMdl((PVOID)SrcAddr, sizeToMap,  FALSE, FALSE,
>         NULL);
>         if(!mdl)
>         {
> +            delete[] reinterpret_cast<BYTE*>(ctx);
> 
> There were several leaks of ctx in case of failure before. I suggest a 
> separate patch to fix that. There are many other places where the current 
> patch does not fix them, for instance VgaDevice::GetModeList can leak 
> m_ModeInfo if m_ModeNumbers can’t be allocated.
> Can you write some patches about these? These specifically seem not really 
> related.
> 
> +            delete[] reinterpret_cast<BYTE*>(pDrawables);
> 
> similar to above, in this case "delete ctx;”
> 
> There is a risk if, indeed, we store more than an object in it. delete[] and 
> delete are implemented differently by some runtimes (I don’t recall about the 
> Win driver runtime). It is not guaranteed that delete ctx would work reliably 
> if we allocated more than sizeof(DoPresentMemory) bytes. Being able to deal 
> with variable size is the very reason for delete[].
> 
> 
> 
>             return STATUS_INSUFFICIENT_RESOURCES;
>         }
> 
> @@ -3844,6 +3855,8 @@ QxlDevice::ExecutePresentDisplayOnly(
>         {
>             Status = GetExceptionCode();
>             IoFreeMdl(mdl);
> +            delete[] reinterpret_cast<BYTE*>(ctx);
> +            delete[] reinterpret_cast<BYTE*>(pDrawables);
> 
> 
> ditto
> 
>             return Status;
>         }
> 
> @@ -3857,6 +3870,8 @@ QxlDevice::ExecutePresentDisplayOnly(
>             Status = STATUS_INSUFFICIENT_RESOURCES;
>             MmUnlockPages(mdl);
>             IoFreeMdl(mdl);
> +            delete[] reinterpret_cast<BYTE*>(ctx);
> +            delete[] reinterpret_cast<BYTE*>(pDrawables);
> 
> ditto
> 
> 
> 
>             return Status;
>         }
> 
> @@ -3922,7 +3937,9 @@ QxlDevice::ExecutePresentDisplayOnly(
>         DbgPrint(TRACE_LEVEL_INFORMATION, ("--- %d SourcePoint.x = %ld,
>         SourcePoint.y = %ld, DestRect.bottom = %ld, DestRect.left = %ld,
>         DestRect.right = %ld, DestRect.top = %ld\n",
>             i , pSourcePoint->x, pSourcePoint->y, pDestRect->bottom,
>             pDestRect->left, pDestRect->right, pDestRect->top));
> 
> -        CopyBits(*pDestRect, *pSourcePoint);
> +        pDrawables[nIndex] = CopyBits(*pDestRect, *pSourcePoint);
> +
> +        if (pDrawables[nIndex]) nIndex++;
>     }
> 
>     // Copy all the dirty rects from source image to video frame buffer.
> @@ -3936,11 +3953,13 @@ QxlDevice::ExecutePresentDisplayOnly(
>         DbgPrint(TRACE_LEVEL_INFORMATION, ("--- %d pDirtyRect->bottom = %ld,
>         pDirtyRect->left = %ld, pDirtyRect->right = %ld, pDirtyRect->top =
>         %ld\n",
>             i, pDirtyRect->bottom, pDirtyRect->left, pDirtyRect->right,
>             pDirtyRect->top));
> 
> -        BltBits(&DstBltInfo,
> +        pDrawables[nIndex] = BltBits(&DstBltInfo,
>         &SrcBltInfo,
>         1,
>         pDirtyRect,
>         &sourcePoint);
> +
> +        if (pDrawables[nIndex]) nIndex++;
>     }
> 
>     // Unmap unmap and unlock the pages.
> @@ -3951,6 +3970,10 @@ QxlDevice::ExecutePresentDisplayOnly(
>     }
>     delete [] reinterpret_cast<BYTE*>(ctx);
> 
> +    pDrawables[nIndex] = NULL;
> +
> +    PostToWorkerThread(pDrawables);
> +
>     return STATUS_SUCCESS;
> }
> 
> @@ -4364,7 +4387,7 @@ VOID QxlDevice::SetImageId(InternalImage *internal,
>     }
> }
> 
> -void QxlDevice::CopyBits(const RECT& rect, const POINT& sourcePoint)
> +QXLDrawable *QxlDevice::CopyBits(const RECT& rect, const POINT& sourcePoint)
> {
> 
> This CopyBits and BltBits are not doing anymore the operation, should
> be renamed to something like PrepareCopyBits (better names welcome)
> 
> But we still need the driver entry points, right?
> These are method, not really related to entry points.
> 
> 
>     PAGED_CODE();
>     QXLDrawable *drawable;
> @@ -4373,18 +4396,18 @@ void QxlDevice::CopyBits(const RECT& rect, const
> POINT& sourcePoint)
> 
>     if (!(drawable = Drawable(QXL_COPY_BITS, &rect, NULL, 0))) {
>         DbgPrint(TRACE_LEVEL_ERROR, ("Cannot get Drawable.\n"));
> -        return;
> +        return NULL;
>     }
> 
>     drawable->u.copy_bits.src_pos.x = sourcePoint.x;
>     drawable->u.copy_bits.src_pos.y = sourcePoint.y;
> 
> -    PushDrawable(drawable);
> -
>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
> +
> +    return drawable;
> }
> 
> -VOID QxlDevice::BltBits (
> +QXLDrawable *QxlDevice::BltBits (
>     BLT_INFO* pDst,
>     CONST BLT_INFO* pSrc,
>     UINT  NumRects,
> @@ -4407,7 +4430,7 @@ VOID QxlDevice::BltBits (
> 
>     if (!(drawable = Drawable(QXL_DRAW_COPY, pRects, NULL, 0))) {
>         DbgPrint(TRACE_LEVEL_ERROR, ("Cannot get Drawable.\n"));
> -        return;
> +        return NULL;
>     }
> 
>     CONST RECT* pRect = &pRects[0];
> @@ -4480,9 +4503,9 @@ VOID QxlDevice::BltBits (
>          drawable->surfaces_rects[0].top,
>          drawable->surfaces_rects[0].bottom,
>          drawable->u.copy.src_bitmap));
> 
> -    PushDrawable(drawable);
> -
>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
> +
> +    return drawable;
> }
> 
> VOID QxlDevice::PutBytesAlign(QXLDataChunk **chunk_ptr, UINT8 **now_ptr,
> diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
> index 4a62680..f441f4b 100755
> --- a/qxldod/QxlDod.h
> +++ b/qxldod/QxlDod.h
> @@ -495,12 +495,12 @@ public:
>     BOOLEAN IsBIOSCompatible() { return FALSE; }
> protected:
>     NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo);
> -    VOID BltBits (BLT_INFO* pDst,
> +    QXLDrawable *BltBits (BLT_INFO* pDst,
>                     CONST BLT_INFO* pSrc,
>                     UINT  NumRects,
>                     _In_reads_(NumRects) CONST RECT *pRects,
>                     POINT*   pSourcePoint);
> -    void CopyBits(const RECT& rect, const POINT& sourcePoint);
> +    QXLDrawable *CopyBits(const RECT& rect, const POINT& sourcePoint);
>     QXLDrawable *Drawable(UINT8 type,
>                     CONST RECT *area,
>                     CONST RECT *clip,
> 
> Frediano
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel@lists.freedesktop.org <mailto:Spice-devel@lists.freedesktop.org>
> https://lists.freedesktop.org/mailman/listinfo/spice-devel 
> <https://lists.freedesktop.org/mailman/listinfo/spice-devel>
_______________________________________________
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to