VirtualBox

Changeset 100538 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jul 12, 2023 8:53:20 AM (20 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158349
Message:

Shared Clipboard: Use a dedicated worker thread wrapper for transfer threads, so that we have more control for the thread creation / destruction. bugref:9437

Location:
trunk/src/VBox/GuestHost/SharedClipboard
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp

    r100512 r100538  
    465465 */
    466466/* static */
    467 DECLCALLBACK(int) SharedClipboardWinDataObject::readThread(RTTHREAD ThreadSelf, void *pvUser)
    468 {
    469     RT_NOREF(ThreadSelf);
     467DECLCALLBACK(int) SharedClipboardWinDataObject::readThread(PSHCLTRANSFER pTransfer, void *pvUser)
     468{
     469    RT_NOREF(pTransfer);
    470470
    471471    LogFlowFuncEnter();
    472472
    473473    SharedClipboardWinDataObject *pThis = (SharedClipboardWinDataObject *)pvUser;
    474 
    475     PSHCLTRANSFER pTransfer = pThis->m_pTransfer;
    476     AssertPtr(pTransfer);
    477 
    478     pTransfer->Thread.fStarted = true;
    479     pTransfer->Thread.fStop    = false;
    480 
    481     RTThreadUserSignal(RTThreadSelf());
    482474
    483475    LogRel2(("Shared Clipboard: Calculating transfer ...\n"));
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp

    r100522 r100538  
    5454static void shClTransferSetCallbacks(PSHCLTRANSFER pTransfer, PSHCLTRANSFERCALLBACKS pCallbacks);
    5555static int shClTransferSetStatus(PSHCLTRANSFER pTransfer, SHCLTRANSFERSTATUS enmStatus);
    56 static int shClTransferThreadCreate(PSHCLTRANSFER pTransfer, PFNRTTHREAD pfnThreadFunc, void *pvUser);
     56static int shClTransferThreadCreate(PSHCLTRANSFER pTransfer, PFNSHCLTRANSFERTHREAD pfnThreadFunc, void *pvUser);
    5757static int shClTransferThreadDestroy(PSHCLTRANSFER pTransfer, RTMSINTERVAL uTimeoutMs);
    5858
     
    21112111 * @param   pvUser              Pointer to user-provided data. Optional.
    21122112 */
    2113 int ShClTransferRun(PSHCLTRANSFER pTransfer, PFNRTTHREAD pfnThreadFunc, void *pvUser)
     2113int ShClTransferRun(PSHCLTRANSFER pTransfer, PFNSHCLTRANSFERTHREAD pfnThreadFunc, void *pvUser)
    21142114{
    21152115    AssertPtrReturn(pTransfer,     VERR_INVALID_POINTER);
     
    21612161
    21622162/**
     2163 * Internal struct for keeping a transfer thread context.
     2164 */
     2165typedef struct _SHCLTRANSFERTHREADCTX
     2166{
     2167    /** Pointer to transfer. */
     2168    PSHCLTRANSFER         pTransfer;
     2169    /** User-supplied context data. Can be NULL if not being used. */
     2170    void                 *pvUser;
     2171    /** Pointer to thread function to use. */
     2172    PFNSHCLTRANSFERTHREAD pfnThread;
     2173} SHCLTRANSFERTHREADCTX;
     2174/** Pointer to internal struct for keeping a transfer thread context. */
     2175typedef SHCLTRANSFERTHREADCTX *PSHCLTRANSFERTHREADCTX;
     2176
     2177/**
     2178 * Worker thread for a transfer.
     2179 *
     2180 * @returns VBox status code.
     2181 * @param   ThreadSelf          Thread self handle. Not being used.
     2182 * @param   pvUser              Context data of type PSHCLTRANSFERTHREADCTX.
     2183 */
     2184static DECLCALLBACK(int) shClTransferThreadWorker(RTTHREAD ThreadSelf, void *pvUser)
     2185{
     2186    RT_NOREF(ThreadSelf);
     2187
     2188    LogFlowFuncEnter();
     2189
     2190    PSHCLTRANSFERTHREADCTX pCtx      = (PSHCLTRANSFERTHREADCTX)pvUser;
     2191    PSHCLTRANSFER          pTransfer = pCtx->pTransfer;
     2192
     2193    shClTransferLock(pTransfer);
     2194
     2195    pTransfer->Thread.fStarted = true;
     2196    pTransfer->Thread.fStop    = false;
     2197
     2198    shClTransferUnlock(pTransfer);
     2199
     2200    RTThreadUserSignal(RTThreadSelf());
     2201
     2202    int rc = pCtx->pfnThread(pTransfer, pCtx->pvUser);
     2203
     2204    if (pTransfer->Callbacks.pfnOnCompleted)
     2205        pTransfer->Callbacks.pfnOnCompleted(&pTransfer->CallbackCtx, rc);
     2206
     2207    LogFlowFuncLeaveRC(rc);
     2208    return rc;
     2209}
     2210
     2211/**
    21632212 * Creates a thread for a clipboard transfer.
    21642213 *
     
    21682217 * @param   pvUser              Pointer to user-provided data.
    21692218 */
    2170 static int shClTransferThreadCreate(PSHCLTRANSFER pTransfer, PFNRTTHREAD pfnThreadFunc, void *pvUser)
     2219static int shClTransferThreadCreate(PSHCLTRANSFER pTransfer, PFNSHCLTRANSFERTHREAD pfnThreadFunc, void *pvUser)
    21712220
    21722221{
     
    21822231                    ("Transfer thread already started"), VERR_WRONG_ORDER);
    21832232
     2233    SHCLTRANSFERTHREADCTX Ctx = { pTransfer, pvUser, pfnThreadFunc };
     2234
    21842235    /* Spawn a worker thread, so that we don't block the window thread for too long. */
    2185     int rc = RTThreadCreate(&pTransfer->Thread.hThread, pfnThreadFunc,
    2186                             pvUser, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE,
     2236    int rc = RTThreadCreate(&pTransfer->Thread.hThread, shClTransferThreadWorker,
     2237                            &Ctx, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE,
    21872238                            "shclptx");
    21882239    if (RT_SUCCESS(rc))
     
    22142265 * @returns VBox status code.
    22152266 * @param   pTransfer           Clipboard transfer to destroy thread for.
    2216  * @param   uTimeoutMs          Timeout (in ms) to wait for thread creation.
     2267 * @param   uTimeoutMs          Timeout (in ms) to wait for thread destruction.
    22172268 */
    22182269static int shClTransferThreadDestroy(PSHCLTRANSFER pTransfer, RTMSINTERVAL uTimeoutMs)
     
    22352286    shClTransferUnlock(pTransfer); /* Leave lock while waiting. */
    22362287
    2237     int rcThread = VERR_WRONG_ORDER;
     2288    int rcThread = VERR_IPE_UNINITIALIZED_STATUS;
    22382289    int rc = RTThreadWait(pTransfer->Thread.hThread, uTimeoutMs, &rcThread);
    22392290
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