VirtualBox

source: vbox/trunk/src/VBox/Main/src-all/ThreadTask.cpp@ 59318

Last change on this file since 59318 was 59318, checked in by vboxsync, 9 years ago

ThreadTask: Review/@todo

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.3 KB
Line 
1/** @file
2 * Implementation of ThreadTask
3 */
4
5/*
6 * Copyright (C) 2015 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 */
16
17#include <iprt/thread.h>
18
19#include "VirtualBoxBase.h"
20#include "ThreadTask.h"
21
22/** @todo r=bird: DOCUMENTATION!! 'ING DOCUMENTATION!! THIS 'ING FUNCTION
23 * CONSUMES THE this OBJECTED AND YOU AREN'T EXACTLY 'ING TELLING
24 * ANYBODY. THAT IS REALLY NICE OF YOU. */
25HRESULT ThreadTask::createThread(PRTTHREAD pThread, RTTHREADTYPE enmType)
26{
27 HRESULT rc = S_OK;
28 try
29 {
30 m_pThread = pThread;
31 int vrc = RTThreadCreate(m_pThread,
32 taskHandler,
33 (void *)this,
34 0,
35 enmType,
36 0,
37 this->getTaskName().c_str());
38 if (RT_FAILURE(vrc))
39 {
40 throw E_FAIL;
41 }
42 }
43 catch(HRESULT eRC)
44 {
45 /** @todo r=bird: only happens in your above throw call.
46 * Makes you wonder why you don't just do if (RT_SUCCESS(vrc)) return S_OK;
47 * else {delete pTask; return E_FAIL;} */
48 rc = eRC;
49 delete this;
50 }
51 catch(std::exception& )
52 {
53 /** @todo r=bird: can't happen, RTThreadCreate+Utf8Str doesn't do this. */
54 rc = E_FAIL;
55 delete this;
56 }
57 catch(...)
58 {
59 /** @todo r=bird: can't happen, RTThreadCreate+Utf8Str doesn't do this. */
60 rc = E_FAIL;
61 delete this;
62 }
63
64 return rc;
65}
66
67/**
68 * Static method that can get passed to RTThreadCreate to have a
69 * thread started for a Task.
70 */
71/* static */ DECLCALLBACK(int) ThreadTask::taskHandler(RTTHREAD /* thread */, void *pvUser)
72{
73 HRESULT rc = S_OK;
74 if (pvUser == NULL)
75 return VERR_INVALID_POINTER;
76
77 ThreadTask *pTask = static_cast<ThreadTask *>(pvUser);
78 try
79 {
80 pTask->handler();
81 }
82 /** @todo r=bird: This next stuff here is utterly and totally pointless, as
83 * the handler() method _must_ and _shall_ do this, otherwise there is
84 * no 'ing way we can know about it, since you (a) you always return
85 * VINF_SUCCESS (aka '0'), and (b) the thread isn't waitable even if
86 * you wanted to return anything. It is much preferred to _crash_ and
87 * _burn_ if we fail to catch stuff than quietly ignore it, most
88 * likely the state of the objects involved is butchered by this. At
89 * least AssertLogRel()! Gee. */
90 catch(HRESULT eRC)
91 {
92 rc = eRC;
93 }
94 catch(std::exception& )
95 {
96 rc = E_FAIL;
97 }
98 catch(...)
99 {
100 rc = E_FAIL;
101 }
102
103 delete pTask;
104
105 return 0;
106}
107
108/*static*/ HRESULT ThreadTask::setErrorStatic(HRESULT aResultCode,
109 const Utf8Str &aText)
110{
111 NOREF(aText);
112 return aResultCode;
113}
114
Note: See TracBrowser for help on using the repository browser.

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