libUPnP  1.6.17
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
65 extern "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 
81 typedef enum duration {
82  SHORT_TERM,
83  PERSISTENT
84 } Duration;
85 
86 typedef 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 
130 typedef int PolicyType;
131 
132 #define DEFAULT_POLICY SCHED_OTHER
133 
135 typedef void (*free_routine)(void *arg);
136 
137 
140 typedef struct THREADPOOLATTR
141 {
147  size_t stackSize;
159  PolicyType schedPolicy;
161 
163 typedef 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;
171 } ThreadPoolJob;
172 
174 typedef 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 
212 typedef struct THREADPOOL
213 {
215  ithread_mutex_t mutex;
217  ithread_cond_t condition;
219  ithread_cond_t start_and_shutdown;
223  int shutdown;
246 } ThreadPool;
247 
258 int ThreadPoolInit(
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 
329 int ThreadPoolAdd(
331  ThreadPool*tp,
333  ThreadPoolJob *job,
335  int *jobId);
336 
345 int ThreadPoolRemove(
347  ThreadPool *tp,
349  int jobId,
351  ThreadPoolJob *out);
352 
361  ThreadPool *tp);
362 
369 int TPJobInit(
371  ThreadPoolJob *job,
373  start_routine func,
375  void *arg);
376 
382 int TPJobSetPriority(
384  ThreadPoolJob *job,
386  ThreadPriority priority);
387 
395  ThreadPoolJob *job,
397  free_routine func);
398 
405 int 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
511  static UPNP_INLINE int ThreadPoolGetStats(
513  ThreadPool *tp,
515  ThreadPoolStats *stats) {}
516 #endif
517 
521 #ifdef STATS
524  ThreadPoolStats *stats);
525 #else
526  static UPNP_INLINE void ThreadPoolPrintStats(
528  ThreadPoolStats *stats) {}
529 #endif
530 
531 #ifdef __cplusplus
532 }
533 #endif
534 
535 #endif /* THREADPOOL_H */
536 
int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal)
Sets the maximum number jobs that can be qeued totally.
Definition: ThreadPool.c:1170
int persistentThreads
Definition: ThreadPool.h:231
int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out)
Gets the current set of attributes associated with the thread pool.
Definition: ThreadPool.c:924
int shutdown
Definition: ThreadPool.h:223
int TPJobSetPriority(ThreadPoolJob *job, ThreadPriority priority)
Sets the max threads for the thread pool attributes.
Definition: ThreadPool.c:1083
Definition: ThreadPool.h:140
struct THREADPOOLJOB ThreadPoolJob
int starvationTime
Definition: ThreadPool.h:157
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:1071
PolicyType schedPolicy
Definition: ThreadPool.h:159
int maxIdleTime
Definition: ThreadPool.h:150
ithread_cond_t condition
Definition: ThreadPool.h:217
int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats)
Returns various statistics about the thread pool.
Definition: ThreadPool.h:174
int ThreadPoolAddPersistent(ThreadPool *tp, ThreadPoolJob *job, int *jobId)
Adds a persistent job to the thread pool.
Definition: ThreadPool.c:768
int lastJobId
Definition: ThreadPool.h:221
LinkedList lowJobQ
Definition: ThreadPool.h:235
int TPAttrSetJobsPerThread(ThreadPoolAttr *attr, int jobsPerThread)
Sets the jobs per thread ratio.
Definition: ThreadPool.c:1143
struct TPOOLSTATS ThreadPoolStats
struct THREADPOOL ThreadPool
A thread pool similar to the thread pool in the UPnP SDK.
void(* free_routine)(void *arg)
Definition: ThreadPool.h:135
int totalThreads
Definition: ThreadPool.h:225
A thread pool similar to the thread pool in the UPnP SDK.
Definition: ThreadPool.h:212
int ThreadPoolSetAttr(ThreadPool *tp, ThreadPoolAttr *attr)
Sets the attributes for the thread pool. Only affects future calculations.
Definition: ThreadPool.c:937
int TPAttrSetMinThreads(ThreadPoolAttr *attr, int minThreads)
Sets the min threads for the thread pool attributes.
Definition: ThreadPool.c:1116
int maxThreads
Definition: ThreadPool.h:145
ThreadPoolJob * persistentJob
Definition: ThreadPool.h:241
int TPAttrSetIdleTime(ThreadPoolAttr *attr, int idleTime)
Sets the idle time for the thread pool attributes.
Definition: ThreadPool.c:1134
int ThreadPoolInit(ThreadPool *tp, ThreadPoolAttr *attr)
Initializes and starts ThreadPool. Must be called first and only once for ThreadPool.
Definition: ThreadPool.c:700
ithread_mutex_t mutex
Definition: ThreadPool.h:215
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:1152
FreeList jobFreeList
Definition: ThreadPool.h:233
Definition: FreeList.h:61
int maxJobsTotal
Definition: ThreadPool.h:154
void ThreadPoolPrintStats(ThreadPoolStats *stats)
ThreadPoolStats stats
Definition: ThreadPool.h:245
LinkedList medJobQ
Definition: ThreadPool.h:237
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
int TPAttrSetStackSize(ThreadPoolAttr *attr, size_t stackSize)
Sets the stack size for the thread pool attributes.
Definition: ThreadPool.c:1125
Definition: ThreadPool.h:163
int busyThreads
Definition: ThreadPool.h:229
LinkedList highJobQ
Definition: ThreadPool.h:239
size_t stackSize
Definition: ThreadPool.h:147
int minThreads
Definition: ThreadPool.h:143
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 pendingWorkerThreadStart
Definition: ThreadPool.h:227
ithread_cond_t start_and_shutdown
Definition: ThreadPool.h:219
int TPAttrSetSchedPolicy(ThreadPoolAttr *attr, PolicyType schedPolicy)
Sets the scheduling policy for the thread pool attributes.
Definition: ThreadPool.c:1161
int TPAttrSetMaxThreads(ThreadPoolAttr *attr, int maxThreads)
Sets the max threads for the thread pool attributes.
Definition: ThreadPool.c:1107
ThreadPoolAttr attr
Definition: ThreadPool.h:243
struct THREADPOOLATTR ThreadPoolAttr
int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func)
Sets the max threads for the thread pool attributes.
Definition: ThreadPool.c:1098
#define UPNP_INLINE
Declares an inline function.
Definition: UpnpGlobal.h:93
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
#define EXPORT_SPEC
Export functions on WIN32 DLLs.
Definition: UpnpGlobal.h:81
int TPAttrInit(ThreadPoolAttr *attr)
Initializes thread pool attributes. Sets values to defaults defined in ThreadPool.h.
Definition: ThreadPool.c:1055
Definition: LinkedList.h:83
Defines constants that for some reason are not defined on some systems.
int jobsPerThread
Definition: ThreadPool.h:152