libUPnP  1.14.5
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 
51  #ifndef _TIMEZONE_DEFINED
52  struct timezone
53  {
54  int tz_minuteswest; /* minutes W of Greenwich */
55  int tz_dsttime; /* type of dst correction */
56  };
57  int gettimeofday(struct timeval *tv, struct timezone *tz);
58  #endif
59 #else /* _WIN32 */
60  #include <sys/param.h>
61  #include <sys/time.h> /* for gettimeofday() */
62  #if defined(__APPLE__) || defined(__NetBSD__)
63  #include <sys/resource.h> /* for setpriority() */
64  #endif
65 #endif
66 
67 #ifdef __cplusplus
68 extern "C" {
69 #endif
70 
72 #define JOBFREELISTSIZE 100
73 
74 #define INFINITE_THREADS -1
75 
76 #define EMAXTHREADS (-8 & 1<<29)
77 
79 #define INVALID_POLICY (-9 & 1<<29)
80 
82 #define INVALID_JOB_ID (-2 & 1<<29)
83 
84 typedef enum duration {
85  SHORT_TERM,
86  PERSISTENT
87 } Duration;
88 
89 typedef enum priority {
90  LOW_PRIORITY,
91  MED_PRIORITY,
92  HIGH_PRIORITY
93 } ThreadPriority;
94 
96 #define DEFAULT_PRIORITY MED_PRIORITY
97 
99 #define DEFAULT_MIN_THREADS 1
100 
102 #define DEFAULT_MAX_THREADS 10
103 
105 #define DEFAULT_STACK_SIZE 0u
106 
108 #define DEFAULT_JOBS_PER_THREAD 10
109 
111 #define DEFAULT_STARVATION_TIME 500
112 
114 #define DEFAULT_IDLE_TIME 10 * 1000
115 
117 #define DEFAULT_FREE_ROUTINE NULL
118 
120 #define DEFAULT_MAX_JOBS_TOTAL 100
121 
127 #define STATS 1
128 
129 #ifdef _DEBUG
130  #define DEBUG 1
131 #endif
132 
133 typedef int PolicyType;
134 
135 #define DEFAULT_POLICY SCHED_OTHER
136 
138 typedef void (*free_routine)(void *arg);
139 
140 
143 typedef struct THREADPOOLATTR
144 {
150  size_t stackSize;
162  PolicyType schedPolicy;
164 
166 typedef struct THREADPOOLJOB
167 {
168  start_routine func;
169  void *arg;
170  free_routine free_func;
171  struct timeval requestTime;
172  ThreadPriority priority;
173  int jobId;
174 } ThreadPoolJob;
175 
177 typedef struct TPOOLSTATS
178 {
179  double totalTimeHQ;
180  int totalJobsHQ;
181  double avgWaitHQ;
182  double totalTimeMQ;
183  int totalJobsMQ;
184  double avgWaitMQ;
185  double totalTimeLQ;
186  int totalJobsLQ;
187  double avgWaitLQ;
188  double totalWorkTime;
189  double totalIdleTime;
190  int workerThreads;
191  int idleThreads;
192  int persistentThreads;
193  int totalThreads;
194  int maxThreads;
195  int currentJobsHQ;
196  int currentJobsLQ;
197  int currentJobsMQ;
199 
215 typedef struct THREADPOOL
216 {
218  ithread_mutex_t mutex;
220  ithread_cond_t condition;
222  ithread_cond_t start_and_shutdown;
226  int shutdown;
249 } ThreadPool;
250 
261 int ThreadPoolInit(
263  ThreadPool *tp,
279  ThreadPoolAttr *attr);
280 
293  ThreadPool*tp,
295  ThreadPoolJob *job,
297  int *jobId);
298 
307  ThreadPool *tp,
309  ThreadPoolAttr *out);
310 
321  ThreadPool *tp,
323  ThreadPoolAttr *attr);
324 
332 int ThreadPoolAdd(
334  ThreadPool*tp,
336  ThreadPoolJob *job,
338  int *jobId);
339 
348 int ThreadPoolRemove(
350  ThreadPool *tp,
352  int jobId,
354  ThreadPoolJob *out);
355 
364  ThreadPool *tp);
365 
372 int TPJobInit(
374  ThreadPoolJob *job,
376  start_routine func,
378  void *arg);
379 
385 int TPJobSetPriority(
387  ThreadPoolJob *job,
389  ThreadPriority priority);
390 
398  ThreadPoolJob *job,
400  free_routine func);
401 
408 int TPAttrInit(
410  ThreadPoolAttr *attr);
411 
419  ThreadPoolAttr *attr,
421  int maxThreads);
422 
430  ThreadPoolAttr *attr,
432  int minThreads);
433 
441  ThreadPoolAttr *attr,
443  size_t stackSize);
444 
452  ThreadPoolAttr *attr,
454  int idleTime);
455 
463  ThreadPoolAttr *attr,
465  int jobsPerThread);
466 
474  ThreadPoolAttr *attr,
476  int starvationTime);
477 
485  ThreadPoolAttr *attr,
487  PolicyType schedPolicy);
488 
496  ThreadPoolAttr *attr,
498  int maxJobsTotal);
499 
507 #ifdef STATS
510  ThreadPool *tp,
512  ThreadPoolStats *stats);
513 #else
514  static UPNP_INLINE int ThreadPoolGetStats(
516  ThreadPool *tp,
518  ThreadPoolStats *stats) {}
519 #endif
520 
524 #ifdef STATS
527  ThreadPoolStats *stats);
528 #else
529  static UPNP_INLINE void ThreadPoolPrintStats(
531  ThreadPoolStats *stats) {}
532 #endif
533 
534 #ifdef __cplusplus
535 }
536 #endif
537 
538 #endif /* THREADPOOL_H */
539 
int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal)
Sets the maximum number jobs that can be qeued totally.
Definition: ThreadPool.c:1185
int persistentThreads
Definition: ThreadPool.h:234
int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out)
Gets the current set of attributes associated with the thread pool.
Definition: ThreadPool.c:936
int shutdown
Definition: ThreadPool.h:226
int TPJobSetPriority(ThreadPoolJob *job, ThreadPriority priority)
Sets the max threads for the thread pool attributes.
Definition: ThreadPool.c:1098
Definition: ThreadPool.h:143
void(* free_routine)(void *arg)
Definition: ThreadPool.h:138
struct THREADPOOLJOB ThreadPoolJob
int starvationTime
Definition: ThreadPool.h:160
int TPJobInit(ThreadPoolJob *job, start_routine func, void *arg)
Initializes thread pool job. Sets the priority to default defined in ThreadPool.h. Sets the free_routine to default defined in ThreadPool.h.
Definition: ThreadPool.c:1086
PolicyType schedPolicy
Definition: ThreadPool.h:162
int maxIdleTime
Definition: ThreadPool.h:153
ithread_cond_t condition
Definition: ThreadPool.h:220
Definition: ThreadPool.h:177
int ThreadPoolAddPersistent(ThreadPool *tp, ThreadPoolJob *job, int *jobId)
Adds a persistent job to the thread pool.
Definition: ThreadPool.c:778
int lastJobId
Definition: ThreadPool.h:224
LinkedList lowJobQ
Definition: ThreadPool.h:238
int TPAttrSetJobsPerThread(ThreadPoolAttr *attr, int jobsPerThread)
Sets the jobs per thread ratio.
Definition: ThreadPool.c:1158
struct TPOOLSTATS ThreadPoolStats
struct THREADPOOL ThreadPool
A thread pool similar to the thread pool in the UPnP SDK.
int totalThreads
Definition: ThreadPool.h:228
EXPORT_SPEC int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats)
Returns various statistics about the thread pool.
Definition: ThreadPool.c:1231
A thread pool similar to the thread pool in the UPnP SDK.
Definition: ThreadPool.h:215
int ThreadPoolSetAttr(ThreadPool *tp, ThreadPoolAttr *attr)
Sets the attributes for the thread pool. Only affects future calculations.
Definition: ThreadPool.c:949
int TPAttrSetMinThreads(ThreadPoolAttr *attr, int minThreads)
Sets the min threads for the thread pool attributes.
Definition: ThreadPool.c:1131
int maxThreads
Definition: ThreadPool.h:148
ThreadPoolJob * persistentJob
Definition: ThreadPool.h:244
int TPAttrSetIdleTime(ThreadPoolAttr *attr, int idleTime)
Sets the idle time for the thread pool attributes.
Definition: ThreadPool.c:1149
int ThreadPoolInit(ThreadPool *tp, ThreadPoolAttr *attr)
Initializes and starts ThreadPool. Must be called first and only once for ThreadPool.
Definition: ThreadPool.c:710
ithread_mutex_t mutex
Definition: ThreadPool.h:218
Provides a platform independent way to include TCP/IP types and functions.
int TPAttrSetStarvationTime(ThreadPoolAttr *attr, int starvationTime)
Sets the starvation time for the thread pool attributes.
Definition: ThreadPool.c:1167
FreeList jobFreeList
Definition: ThreadPool.h:236
Definition: FreeList.h:61
int maxJobsTotal
Definition: ThreadPool.h:157
ThreadPoolStats stats
Definition: ThreadPool.h:248
LinkedList medJobQ
Definition: ThreadPool.h:240
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:826
int TPAttrSetStackSize(ThreadPoolAttr *attr, size_t stackSize)
Sets the stack size for the thread pool attributes.
Definition: ThreadPool.c:1140
Definition: ThreadPool.h:166
int busyThreads
Definition: ThreadPool.h:232
LinkedList highJobQ
Definition: ThreadPool.h:242
size_t stackSize
Definition: ThreadPool.h:150
int minThreads
Definition: ThreadPool.h:146
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:990
int pendingWorkerThreadStart
Definition: ThreadPool.h:230
ithread_cond_t start_and_shutdown
Definition: ThreadPool.h:222
int TPAttrSetSchedPolicy(ThreadPoolAttr *attr, PolicyType schedPolicy)
Sets the scheduling policy for the thread pool attributes.
Definition: ThreadPool.c:1176
int TPAttrSetMaxThreads(ThreadPoolAttr *attr, int maxThreads)
Sets the max threads for the thread pool attributes.
Definition: ThreadPool.c:1122
ThreadPoolAttr attr
Definition: ThreadPool.h:246
struct THREADPOOLATTR ThreadPoolAttr
int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func)
Sets the max threads for the thread pool attributes.
Definition: ThreadPool.c:1113
#define UPNP_INLINE
Declares an inline function.
Definition: UpnpGlobal.h:103
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:879
#define EXPORT_SPEC
Export functions on WIN32 DLLs.
Definition: UpnpGlobal.h:91
int TPAttrInit(ThreadPoolAttr *attr)
Initializes thread pool attributes. Sets values to defaults defined in ThreadPool.h.
Definition: ThreadPool.c:1070
Definition: LinkedList.h:83
Defines constants that for some reason are not defined on some systems.
EXPORT_SPEC void ThreadPoolPrintStats(ThreadPoolStats *stats)
Definition: ThreadPool.c:1195
int jobsPerThread
Definition: ThreadPool.h:155