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(); |