aboutsummaryrefslogtreecommitdiff
path: root/Src/nu/threadpool/ThreadFunctions.h
blob: bbc5e6c6b4da1b02781549256953cbc55f2bd74e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#pragma once
#include "api_threadpool.h"
#include <map>
#include <deque>
#include "../AutoLock.h"

class ThreadFunctions
{
public:
	struct Data
	{
		api_threadpool::ThreadPoolFunc func;
		void *user_data;
		intptr_t id;
	};
	ThreadFunctions(int create_function_list=1);
	~ThreadFunctions();
	void Add(HANDLE handle, api_threadpool::ThreadPoolFunc func, void *user_data, intptr_t id);
	bool Get(HANDLE handle, api_threadpool::ThreadPoolFunc *func, void **user_data, intptr_t *id);
	void QueueFunction(api_threadpool::ThreadPoolFunc func, void *user_data, intptr_t id);
	bool PopFunction(api_threadpool::ThreadPoolFunc *func, void **user_data, intptr_t *id);

	typedef std::map<HANDLE, const ThreadFunctions::Data*> DataMap;
	DataMap data;
	Nullsoft::Utility::LockGuard guard;

	typedef std::deque<ThreadFunctions::Data*> FuncList;
	FuncList functions_list;
	CRITICAL_SECTION functions_guard;
	HANDLE functions_semaphore;
};