deadlock.diff

ratmice, 05/10/2010 01:14 am

Download (5.6 kB)

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