deadlock.diff
b/code/nel/include/nel/misc/mutex.h Sun May 09 16:08:46 2010 -0700 | ||
---|---|---|
611 | 611 |
CAccessor(CUnfairSynchronized<T> *cs) |
612 | 612 |
{ |
613 | 613 |
Synchronized = cs; |
614 |
const_cast<CMutex&>(Synchronized->_Mutex).enter(); |
|
614 |
const_cast<CUnfairMutex&>(Synchronized->_Mutex).enter();
|
|
615 | 615 |
} |
616 | 616 |
|
617 | 617 |
/// release the mutex |
618 | 618 |
~CAccessor() |
619 | 619 |
{ |
620 |
const_cast<CMutex&>(Synchronized->_Mutex).leave(); |
|
620 |
const_cast<CUnfairMutex&>(Synchronized->_Mutex).leave();
|
|
621 | 621 |
} |
622 | 622 |
|
623 | 623 |
/// access to the Value |
b/code/nel/include/nel/misc/task_manager.h Sun May 09 16:08:46 2010 -0700 | ||
---|---|---|
140 | 140 |
|
141 | 141 |
/// queue of tasks, using list container instead of queue for DeleteTask methode |
142 | 142 |
CSynchronized<std::string> _RunningTask; |
143 |
CSynchronized<std::list<CWaitingTask> > _TaskQueue; |
|
143 |
CUnfairSynchronized<std::list<CWaitingTask> > _TaskQueue;
|
|
144 | 144 |
CSynchronized<std::deque<std::string> > _DoneTaskQueue; |
145 | 145 |
|
146 | 146 |
/// thread pointer |
b/code/nel/src/misc/async_file_manager.cpp Sun May 09 16:08:46 2010 -0700 | ||
---|---|---|
67 | 67 |
|
68 | 68 |
bool CAsyncFileManager::cancelLoadTask(const CAsyncFileManager::ICancelCallback &callback) |
69 | 69 |
{ |
70 |
CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue); |
|
70 |
CUnfairSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
|
|
71 | 71 |
list<CWaitingTask> &rTaskQueue = acces.value (); |
72 | 72 |
list<CWaitingTask>::iterator it = rTaskQueue.begin(); |
73 | 73 |
|
... | ... | |
87 | 87 |
} |
88 | 88 |
|
89 | 89 |
// If not found, the current running task may be the one we want to cancel. Must wait it. |
90 |
// Beware that this code works because of the CSynchronized access we made above (ensure that the |
|
90 |
// Beware that this code works because of the CUnfairSynchronized access we made above (ensure that the
|
|
91 | 91 |
// taskmanager will end just the current task async (if any) and won't start an other one. |
92 | 92 |
waitCurrentTaskToComplete (); |
93 | 93 |
|
... | ... | |
105 | 105 |
/* |
106 | 106 |
bool CAsyncFileManager::cancelLoadMesh(const std::string& sMeshName) |
107 | 107 |
{ |
108 |
CSynchronized<list<IRunnable *> >::CAccessor acces(&_TaskQueue); |
|
108 |
CUnfairSynchronized<list<IRunnable *> >::CAccessor acces(&_TaskQueue);
|
|
109 | 109 |
list<IRunnable*> &rTaskQueue = acces.value (); |
110 | 110 |
list<IRunnable*>::iterator it = rTaskQueue.begin(); |
111 | 111 |
|
... | ... | |
167 | 167 |
|
168 | 168 |
void CAsyncFileManager::cancelSignal (bool *pSgn) |
169 | 169 |
{ |
170 |
CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue); |
|
170 |
CUnfairSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
|
|
171 | 171 |
list<CWaitingTask> &rTaskQueue = acces.value (); |
172 | 172 |
list<CWaitingTask>::iterator it = rTaskQueue.begin(); |
173 | 173 |
|
b/code/nel/src/misc/task_manager.cpp Sun May 09 16:08:46 2010 -0700 | ||
---|---|---|
49 | 49 |
nlSleep(10); |
50 | 50 |
|
51 | 51 |
// There should be no remaining Tasks |
52 |
CSynchronized<std::list<CWaitingTask> >::CAccessor acces(&_TaskQueue); |
|
52 |
CUnfairSynchronized<std::list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
|
|
53 | 53 |
nlassert(acces.value().empty()); |
54 | 54 |
_Thread->wait(); |
55 | 55 |
delete _Thread; |
... | ... | |
65 | 65 |
while(_ThreadRunning) |
66 | 66 |
{ |
67 | 67 |
{ |
68 |
CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue); |
|
68 |
CUnfairSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
|
|
69 | 69 |
if(acces.value().empty()) |
70 | 70 |
{ |
71 | 71 |
runnableTask = NULL; |
... | ... | |
126 | 126 |
// Add a task to TaskManager |
127 | 127 |
void CTaskManager::addTask(IRunnable *r, float priority) |
128 | 128 |
{ |
129 |
CSynchronized<std::list<CWaitingTask> >::CAccessor acces(&_TaskQueue); |
|
129 |
CUnfairSynchronized<std::list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
|
|
130 | 130 |
acces.value().push_back(CWaitingTask(r, priority)); |
131 | 131 |
} |
132 | 132 |
|
133 | 133 |
/// Delete a task, only if task is not running, return true if found and deleted |
134 | 134 |
bool CTaskManager::deleteTask(IRunnable *r) |
135 | 135 |
{ |
136 |
CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue); |
|
136 |
CUnfairSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
|
|
137 | 137 |
for(list<CWaitingTask>::iterator it = acces.value().begin(); it != acces.value().end(); it++) |
138 | 138 |
{ |
139 | 139 |
if(it->Task == r) |
... | ... | |
148 | 148 |
/// Task list size |
149 | 149 |
uint CTaskManager::taskListSize(void) |
150 | 150 |
{ |
151 |
CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue); |
|
151 |
CUnfairSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
|
|
152 | 152 |
return acces.value().size(); |
153 | 153 |
} |
154 | 154 |
|
... | ... | |
164 | 164 |
void CTaskManager::dump (std::vector<std::string> &result) |
165 | 165 |
{ |
166 | 166 |
CSynchronized<string>::CAccessor accesCurrent(&_RunningTask); |
167 |
CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue); |
|
167 |
CUnfairSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
|
|
168 | 168 |
CSynchronized<deque<string> >::CAccessor accesDone(&_DoneTaskQueue); |
169 | 169 |
|
170 | 170 |
const list<CWaitingTask> &taskList = acces.value(); |
... | ... | |
215 | 215 |
|
216 | 216 |
uint CTaskManager::getNumWaitingTasks() |
217 | 217 |
{ |
218 |
CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue); |
|
218 |
CUnfairSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
|
|
219 | 219 |
return acces.value().size(); |
220 | 220 |
} |
221 | 221 |
|
... | ... | |
225 | 225 |
{ |
226 | 226 |
if (_ChangePriorityCallback) |
227 | 227 |
{ |
228 |
CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue); |
|
228 |
CUnfairSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
|
|
229 | 229 |
list<CWaitingTask> &taskList = acces.value(); |
230 | 230 |
|
231 | 231 |
list<CWaitingTask>::iterator ite = taskList.begin(); |