- Timestamp:
- Aug 8, 2016 4:37:26 PM (8 years ago)
- Location:
- trunk/src/VBox/Main
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/include/GuestDnDSourceImpl.h
r62485 r63183 27 27 #include "GuestDnDPrivate.h" 28 28 29 class RecvDataTask; 29 30 struct RECVDATACTX; 30 31 typedef struct RECVDATACTX *PRECVDATACTX; … … 83 84 static Utf8Str i_hostErrorToString(int hostRc); 84 85 85 /** @name Thread callbacks.86 /** @name Thread task . 86 87 * @{ */ 87 static DECLCALLBACK(int) i_receiveDataThread(RTTHREAD Thread, void *pvUser);88 static void i_receiveDataThreadTask(RecvDataTask *pTask); 88 89 /** @} */ 89 90 -
trunk/src/VBox/Main/include/GuestDnDTargetImpl.h
r62485 r63183 27 27 struct SENDDATACTX; 28 28 typedef struct SENDDATACTX *PSENDDATACTX; 29 class SendDataTask; 29 30 30 31 class ATL_NO_VTABLE GuestDnDTarget : … … 71 72 static Utf8Str i_hostErrorToString(int hostRc); 72 73 73 /** @name Thread callbacks.74 /** @name Thread task workers. 74 75 * @{ */ 75 static DECLCALLBACK(int) i_sendDataThread(RTTHREAD Thread, void *pvUser);76 static void i_sendDataThreadTask(SendDataTask *pTask); 76 77 /** @} */ 77 78 -
trunk/src/VBox/Main/include/ThreadTask.h
r63182 r63183 20 20 #include "VBox/com/string.h" 21 21 22 /** 23 * The class ThreadVoidData is used as a base class for any data which we want to pass into a thread 24 */ 22 25 struct ThreadVoidData 23 26 { 24 /*25 * The class ThreadVoidData is used as a base class for any data which we want to pass into a thread26 */27 27 public: 28 ThreadVoidData() {};29 virtual ~ThreadVoidData() {};28 ThreadVoidData() { } 29 virtual ~ThreadVoidData() { } 30 30 }; 31 31 32 32 33 class ThreadTask 33 34 { 34 35 public: 35 ThreadTask(const Utf8Str &t) : m_ pThread(NULL), m_strTaskName(t)36 { } ;36 ThreadTask(const Utf8Str &t) : m_hThread(NIL_RTTHREAD), m_strTaskName(t) 37 { } 37 38 38 39 virtual ~ThreadTask() 39 { } ;40 { } 40 41 41 42 HRESULT createThread(void); … … 44 45 45 46 virtual void handler() = 0; 46 inline Utf8Str getTaskName() const { return m_strTaskName;};47 inline Utf8Str getTaskName() const { return m_strTaskName; } 47 48 48 49 protected: … … 50 51 static DECLCALLBACK(int) taskHandlerThreadProc(RTTHREAD thread, void *pvUser); 51 52 52 ThreadTask():m_pThread(NULL), m_strTaskName("GenericTask"){}; 53 ThreadTask() : m_hThread(NIL_RTTHREAD), m_strTaskName("GenericTask") 54 { } 53 55 54 PRTTHREAD m_pThread; 56 /** The worker thread handle (may be invalid if the thread has shut down). */ 57 RTTHREAD m_hThread; 55 58 Utf8Str m_strTaskName; 56 59 }; -
trunk/src/VBox/Main/src-all/ThreadTask.cpp
r63182 r63183 51 51 HRESULT ThreadTask::createThread(void) 52 52 { 53 return createThreadInternal(RTTHREADTYPE_MAIN_WORKER, NULL /*p Thread*/);53 return createThreadInternal(RTTHREADTYPE_MAIN_WORKER, NULL /*phThread*/); 54 54 } 55 55 … … 62 62 HRESULT ThreadTask::createThreadWithType(RTTHREADTYPE enmType) 63 63 { 64 return createThreadInternal(enmType, NULL /*p Thread*/);64 return createThreadInternal(enmType, NULL /*phThread*/); 65 65 } 66 66 … … 72 72 * completion and termination of the task thread! Use with care! 73 73 * 74 * @param p ThreadHandle of the worker thread.74 * @param phThread Handle of the worker thread. 75 75 */ 76 HRESULT ThreadTask::createThreadWithRaceCondition(PRTTHREAD p Thread)76 HRESULT ThreadTask::createThreadWithRaceCondition(PRTTHREAD phThread) 77 77 { 78 return createThreadInternal(RTTHREADTYPE_MAIN_WORKER, p Thread);78 return createThreadInternal(RTTHREADTYPE_MAIN_WORKER, phThread); 79 79 } 80 80 … … 86 86 * @note Always consumes @a this! 87 87 */ 88 HRESULT ThreadTask::createThreadInternal(RTTHREADTYPE enmType, PRTTHREAD p Thread)88 HRESULT ThreadTask::createThreadInternal(RTTHREADTYPE enmType, PRTTHREAD phThread) 89 89 { 90 m_pThread = pThread; /** @todo this is utter non-sense! */ 91 int vrc = RTThreadCreate(m_pThread, 90 int vrc = RTThreadCreate(&m_hThread, 92 91 taskHandlerThreadProc, 93 92 (void *)this, … … 97 96 this->getTaskName().c_str()); 98 97 if (RT_SUCCESS(vrc)) 98 { 99 if (phThread) 100 *phThread = m_hThread; 99 101 return S_OK; 102 } 100 103 101 104 delete this; … … 116 119 117 120 /* 118 * handler shall catch and process all possible cases as errors and exceptions.119 */121 * handler shall catch and process all possible cases as errors and exceptions. 122 */ 120 123 pTask->handler(); 121 124 125 pTask->m_hThread = NIL_RTTHREAD; /* unnecessary, but whatever. */ 122 126 delete pTask; 123 127 return VINF_SUCCESS; -
trunk/src/VBox/Main/src-client/GuestDnDSourceImpl.cpp
r63182 r63183 86 86 void handler() 87 87 { 88 int vrc = GuestDnDSource::i_receiveDataThread(*m_pThread,this);88 GuestDnDSource::i_receiveDataThreadTask(this); 89 89 } 90 90 … … 962 962 #endif /* VBOX_WITH_DRAG_AND_DROP_GH */ 963 963 964 /** 965 * @returns VBox status code that the caller ignores. Not sure if that's 966 * intentional or not. 967 */ 964 968 int GuestDnDSource::i_receiveData(PRECVDATACTX pCtx, RTMSINTERVAL msTimeout) 965 969 { … … 1062 1066 1063 1067 /* static */ 1064 DECLCALLBACK(int) GuestDnDSource::i_receiveDataThread(RTTHREAD Thread, void *pvUser) 1065 { 1066 LogFlowFunc(("pvUser=%p\n", pvUser)); 1067 1068 RecvDataTask *pTask = (RecvDataTask *)pvUser; 1069 AssertPtrReturn(pTask, VERR_INVALID_POINTER); 1068 DECLCALLBACK(void) GuestDnDSource::i_receiveDataThreadTask(RecvDataTask *pTask) 1069 { 1070 LogFlowFunc(("pTask=%p\n", pTask)); 1071 AssertPtrReturnVoid(pTask); 1070 1072 1071 1073 const ComObjPtr<GuestDnDSource> pThis(pTask->getSource()); … … 1073 1075 1074 1076 AutoCaller autoCaller(pThis); 1075 if (FAILED(autoCaller.rc())) return VERR_COM_INVALID_OBJECT_STATE; 1076 1077 int rc = RTThreadUserSignal(Thread); 1078 AssertRC(rc); 1079 1080 rc = pThis->i_receiveData(pTask->getCtx(), RT_INDEFINITE_WAIT /* msTimeout */); 1077 if (FAILED(autoCaller.rc())) 1078 return; 1079 1080 int vrc = RTThreadUserSignal(RTThreadSelf()); 1081 AssertRC(vrc); 1082 1083 vrc = pThis->i_receiveData(pTask->getCtx(), RT_INDEFINITE_WAIT /* msTimeout */); 1084 /** @todo 1085 * 1086 * r=bird: What happens with @a vrc? 1087 * 1088 */ 1081 1089 1082 1090 AutoWriteLock alock(pThis COMMA_LOCKVAL_SRC_POS); … … 1085 1093 pThis->mDataBase.m_cTransfersPending--; 1086 1094 1087 LogFlowFunc(("pSource=%p returning rc=%Rrc\n", (GuestDnDSource *)pThis, rc)); 1088 return rc; 1095 LogFlowFunc(("pSource=%p vrc=%Rrc (ignored)\n", (GuestDnDSource *)pThis, vrc)); 1089 1096 } 1090 1097 -
trunk/src/VBox/Main/src-client/GuestDnDTargetImpl.cpp
r63182 r63183 90 90 void handler() 91 91 { 92 int vrc = GuestDnDTarget::i_sendDataThread(*m_pThread, this); 93 NOREF(vrc); 92 GuestDnDTarget::i_sendDataThreadTask(this); 94 93 } 95 94 … … 558 557 559 558 /* static */ 560 DECLCALLBACK(int) GuestDnDTarget::i_sendDataThread(RTTHREAD Thread, void *pvUser) 561 { 562 LogFlowFunc(("pvUser=%p\n", pvUser)); 563 564 SendDataTask *pTask = (SendDataTask *)pvUser; 565 AssertPtrReturn(pTask, VERR_INVALID_POINTER); 559 void GuestDnDTarget::i_sendDataThreadTask(SendDataTask *pTask) 560 { 561 LogFlowFunc(("pTask=%p\n", pTask)); 562 563 AssertPtrReturnVoid(pTask); 566 564 567 565 const ComObjPtr<GuestDnDTarget> pThis(pTask->getTarget()); … … 569 567 570 568 AutoCaller autoCaller(pThis); 571 if (FAILED(autoCaller.rc())) return VERR_COM_INVALID_OBJECT_STATE; 572 573 int rc = RTThreadUserSignal(Thread); 574 AssertRC(rc); 575 576 rc = pThis->i_sendData(pTask->getCtx(), RT_INDEFINITE_WAIT /* msTimeout */); 569 if (FAILED(autoCaller.rc())) 570 return; 571 572 int vrc = RTThreadUserSignal(RTThreadSelf()); 573 AssertRC(vrc); 574 575 vrc = pThis->i_sendData(pTask->getCtx(), RT_INDEFINITE_WAIT /* msTimeout */); 576 /** @todo 577 * 578 * r=bird: What happens with @a vrc? 579 * 580 */ 577 581 578 582 AutoWriteLock alock(pThis COMMA_LOCKVAL_SRC_POS); … … 581 585 pThis->mDataBase.m_cTransfersPending--; 582 586 583 LogFlowFunc(("pTarget=%p returning rc=%Rrc\n", (GuestDnDTarget *)pThis, rc)); 584 return rc; 587 LogFlowFunc(("pTarget=%p vrc=%Rrc (ignored)\n", (GuestDnDTarget *)pThis, vrc)); 585 588 } 586 589 … … 779 782 } 780 783 784 /** 785 * @returns VBox status code that the caller ignores. Not sure if that's 786 * intentional or not. 787 */ 781 788 int GuestDnDTarget::i_sendData(PSENDDATACTX pCtx, RTMSINTERVAL msTimeout) 782 789 {
Note:
See TracChangeset
for help on using the changeset viewer.