libUPnP 1.8.4
ThreadPool.h
Go to the documentation of this file.
1/*******************************************************************************
2 *
3 * Copyright (c) 2000-2003 Intel Corporation
4 * All rights reserved.
5 * Copyright (c) 2012 France Telecom All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * * Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 * * Neither name of Intel Corporation nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
27 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 *
31 ******************************************************************************/
32
33#ifndef THREADPOOL_H
34#define THREADPOOL_H
35
40#include "FreeList.h"
41#include "ithread.h"
42#include "LinkedList.h"
43#include "UpnpInet.h"
44#include "UpnpGlobal.h" /* for UPNP_INLINE, EXPORT_SPEC */
45
46#include <errno.h>
47
48#ifdef _WIN32
49 #include <time.h>
50 struct timezone
51 {
52 int tz_minuteswest; /* minutes W of Greenwich */
53 int tz_dsttime; /* type of dst correction */
54 };
55 int gettimeofday(struct timeval *tv, struct timezone *tz);
56#else /* _WIN32 */
57 #include <sys/param.h>
58 #include <sys/time.h> /* for gettimeofday() */
59 #if defined(__OSX__) || defined(__APPLE__) || defined(__NetBSD__)
60 #include <sys/resource.h> /* for setpriority() */
61 #endif
62#endif
63
64#ifdef __cplusplus
65extern "C" {
66#endif
67
69#define JOBFREELISTSIZE 100
70
71#define INFINITE_THREADS -1
72
73#define EMAXTHREADS (-8 & 1<<29)
74
76#define INVALID_POLICY (-9 & 1<<29)
77
79#define INVALID_JOB_ID (-2 & 1<<29)
80
81typedef enum duration {
82 SHORT_TERM,
83 PERSISTENT
84} Duration;
85
86typedef enum priority {
87 LOW_PRIORITY,
88 MED_PRIORITY,
89 HIGH_PRIORITY
90} ThreadPriority;
91
93#define DEFAULT_PRIORITY MED_PRIORITY
94
96#define DEFAULT_MIN_THREADS 1
97
99#define DEFAULT_MAX_THREADS 10
100
102#define DEFAULT_STACK_SIZE 0u
103
105#define DEFAULT_JOBS_PER_THREAD 10
106
108#define DEFAULT_STARVATION_TIME 500
109
111#define DEFAULT_IDLE_TIME 10 * 1000
112
114#define DEFAULT_FREE_ROUTINE NULL
115
117#define DEFAULT_MAX_JOBS_TOTAL 100
118
124#define STATS 1
125
126#ifdef _DEBUG
127 #define DEBUG 1
128#endif
129
130typedef int PolicyType;
131
132#define DEFAULT_POLICY SCHED_OTHER
133
135typedef void (*free_routine)(void *arg);
136
137
140typedef struct THREADPOOLATTR
141{
147 size_t stackSize;
159 PolicyType schedPolicy;
161
163typedef struct THREADPOOLJOB
164{
165 start_routine func;
166 void *arg;
167 free_routine free_func;
168 struct timeval requestTime;
169 ThreadPriority priority;
170 int jobId;
172
174typedef struct TPOOLSTATS
175{
176 double totalTimeHQ;
177 int totalJobsHQ;
178 double avgWaitHQ;
179 double totalTimeMQ;
180 int totalJobsMQ;
181 double avgWaitMQ;
182 double totalTimeLQ;
183 int totalJobsLQ;
184 double avgWaitLQ;
185 double totalWorkTime;
186 double totalIdleTime;
187 int workerThreads;
188 int idleThreads;
189 int persistentThreads;
190 int totalThreads;
191 int maxThreads;
192 int currentJobsHQ;
193 int currentJobsLQ;
194 int currentJobsMQ;
196
212typedef struct THREADPOOL
213{
215 ithread_mutex_t mutex;
217 ithread_cond_t condition;
219 ithread_cond_t start_and_shutdown;
247
260 ThreadPool *tp,
276 ThreadPoolAttr *attr);
277
290 ThreadPool*tp,
292 ThreadPoolJob *job,
294 int *jobId);
295
304 ThreadPool *tp,
306 ThreadPoolAttr *out);
307
318 ThreadPool *tp,
320 ThreadPoolAttr *attr);
321
329int ThreadPoolAdd(
331 ThreadPool*tp,
333 ThreadPoolJob *job,
335 int *jobId);
336
347 ThreadPool *tp,
349 int jobId,
351 ThreadPoolJob *out);
352
361 ThreadPool *tp);
362
369int TPJobInit(
371 ThreadPoolJob *job,
373 start_routine func,
375 void *arg);
376
384 ThreadPoolJob *job,
386 ThreadPriority priority);
387
395 ThreadPoolJob *job,
397 free_routine func);
398
405int TPAttrInit(
407 ThreadPoolAttr *attr);
408
416 ThreadPoolAttr *attr,
418 int maxThreads);
419
427 ThreadPoolAttr *attr,
429 int minThreads);
430
438 ThreadPoolAttr *attr,
440 size_t stackSize);
441
449 ThreadPoolAttr *attr,
451 int idleTime);
452
460 ThreadPoolAttr *attr,
462 int jobsPerThread);
463
471 ThreadPoolAttr *attr,
473 int starvationTime);
474
482 ThreadPoolAttr *attr,
484 PolicyType schedPolicy);
485
493 ThreadPoolAttr *attr,
495 int maxJobsTotal);
496
504#ifdef STATS
507 ThreadPool *tp,
509 ThreadPoolStats *stats);
510#else
513 ThreadPool *tp,
515 ThreadPoolStats *stats) {}
516#endif
517
521#ifdef STATS
524 ThreadPoolStats *stats);
525#else
528 ThreadPoolStats *stats) {}
529#endif
530
531#ifdef __cplusplus
532}
533#endif
534
535#endif /* THREADPOOL_H */
536
int ThreadPoolInit(ThreadPool *tp, ThreadPoolAttr *attr)
Initializes and starts ThreadPool. Must be called first and only once for ThreadPool.
Definition: ThreadPool.c:700
int ThreadPoolAdd(ThreadPool *tp, ThreadPoolJob *job, int *jobId)
Adds a job to the thread pool. Job will be run as soon as possible.
Definition: ThreadPool.c:816
struct THREADPOOL ThreadPool
A thread pool similar to the thread pool in the UPnP SDK.
int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func)
Sets the max threads for the thread pool attributes.
Definition: ThreadPool.c:1098
int ThreadPoolShutdown(ThreadPool *tp)
Shuts the thread pool down. Waits for all threads to finish. May block indefinitely if jobs do not ex...
Definition: ThreadPool.c:978
int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out)
Gets the current set of attributes associated with the thread pool.
Definition: ThreadPool.c:924
int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal)
Sets the maximum number jobs that can be qeued totally.
Definition: ThreadPool.c:1170
int TPJobInit(ThreadPoolJob *job, start_routine func, void *arg)
Initializes thread pool job. Sets the priority to default defined in ThreadPool.h....
Definition: ThreadPool.c:1071
EXPORT_SPEC void ThreadPoolPrintStats(ThreadPoolStats *stats)
Definition: ThreadPool.c:1180
int TPAttrSetStarvationTime(ThreadPoolAttr *attr, int starvationTime)
Sets the starvation time for the thread pool attributes.
Definition: ThreadPool.c:1152
int TPAttrSetMaxThreads(ThreadPoolAttr *attr, int maxThreads)
Sets the max threads for the thread pool attributes.
Definition: ThreadPool.c:1107
int TPJobSetPriority(ThreadPoolJob *job, ThreadPriority priority)
Sets the max threads for the thread pool attributes.
Definition: ThreadPool.c:1083
struct TPOOLSTATS ThreadPoolStats
int ThreadPoolSetAttr(ThreadPool *tp, ThreadPoolAttr *attr)
Sets the attributes for the thread pool. Only affects future calculations.
Definition: ThreadPool.c:937
int ThreadPoolRemove(ThreadPool *tp, int jobId, ThreadPoolJob *out)
Removes a job from the thread pool. Can only remove jobs which are not currently running.
Definition: ThreadPool.c:867
struct THREADPOOLATTR ThreadPoolAttr
int TPAttrSetJobsPerThread(ThreadPoolAttr *attr, int jobsPerThread)
Sets the jobs per thread ratio.
Definition: ThreadPool.c:1143
struct THREADPOOLJOB ThreadPoolJob
int TPAttrInit(ThreadPoolAttr *attr)
Initializes thread pool attributes. Sets values to defaults defined in ThreadPool....
Definition: ThreadPool.c:1055
int TPAttrSetIdleTime(ThreadPoolAttr *attr, int idleTime)
Sets the idle time for the thread pool attributes.
Definition: ThreadPool.c:1134
int TPAttrSetMinThreads(ThreadPoolAttr *attr, int minThreads)
Sets the min threads for the thread pool attributes.
Definition: ThreadPool.c:1116
int TPAttrSetSchedPolicy(ThreadPoolAttr *attr, PolicyType schedPolicy)
Sets the scheduling policy for the thread pool attributes.
Definition: ThreadPool.c:1161
void(* free_routine)(void *arg)
Definition: ThreadPool.h:135
int TPAttrSetStackSize(ThreadPoolAttr *attr, size_t stackSize)
Sets the stack size for the thread pool attributes.
Definition: ThreadPool.c:1125
int ThreadPoolAddPersistent(ThreadPool *tp, ThreadPoolJob *job, int *jobId)
Adds a persistent job to the thread pool.
Definition: ThreadPool.c:768
EXPORT_SPEC int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats)
Returns various statistics about the thread pool.
Definition: ThreadPool.c:1201
Defines constants that for some reason are not defined on some systems.
#define EXPORT_SPEC
Export functions on WIN32 DLLs.
Definition: UpnpGlobal.h:87
#define UPNP_INLINE
Declares an inline function.
Definition: UpnpGlobal.h:99
Provides a platform independent way to include TCP/IP types and functions.
Definition: FreeList.h:62
Definition: LinkedList.h:84
Definition: ThreadPool.h:141
int maxJobsTotal
Definition: ThreadPool.h:154
PolicyType schedPolicy
Definition: ThreadPool.h:159
int maxThreads
Definition: ThreadPool.h:145
int jobsPerThread
Definition: ThreadPool.h:152
int maxIdleTime
Definition: ThreadPool.h:150
int minThreads
Definition: ThreadPool.h:143
size_t stackSize
Definition: ThreadPool.h:147
int starvationTime
Definition: ThreadPool.h:157
Definition: ThreadPool.h:164
A thread pool similar to the thread pool in the UPnP SDK.
Definition: ThreadPool.h:213
int lastJobId
Definition: ThreadPool.h:221
int pendingWorkerThreadStart
Definition: ThreadPool.h:227
int busyThreads
Definition: ThreadPool.h:229
LinkedList lowJobQ
Definition: ThreadPool.h:235
ithread_mutex_t mutex
Definition: ThreadPool.h:215
ThreadPoolAttr attr
Definition: ThreadPool.h:243
int persistentThreads
Definition: ThreadPool.h:231
int totalThreads
Definition: ThreadPool.h:225
LinkedList medJobQ
Definition: ThreadPool.h:237
int shutdown
Definition: ThreadPool.h:223
LinkedList highJobQ
Definition: ThreadPool.h:239
ThreadPoolStats stats
Definition: ThreadPool.h:245
FreeList jobFreeList
Definition: ThreadPool.h:233
ithread_cond_t condition
Definition: ThreadPool.h:217
ThreadPoolJob * persistentJob
Definition: ThreadPool.h:241
ithread_cond_t start_and_shutdown
Definition: ThreadPool.h:219
Definition: ThreadPool.h:175