• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (C) 2010 The Android Open Source Project
3   *
4   * Licensed under the Apache License, Version 2.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *      http://www.apache.org/licenses/LICENSE-2.0
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  /** \file ThreadPool.h ThreadPool interface */
18  
19  /** Kind of closure */
20  
21  typedef enum {
22      CLOSURE_KIND_PPI,   // void *, void *, int
23      CLOSURE_KIND_PPII,  // void *, void *, int, int
24      CLOSURE_KIND_PIIPP  // void *, int, int, void *, void *
25  } ClosureKind;
26  
27  /** Closure handlers */
28  
29  typedef void (*ClosureHandler_generic)(void *p1, void *p2, void *p3, int i1, int i2);
30  typedef void (*ClosureHandler_ppi)    (void *p1, void *p2, int i1);
31  typedef void (*ClosureHandler_ppii)   (void *p1, void *p2, int i1, int i2);
32  typedef void (*ClosureHandler_piipp)  (void *p1, int i1, int i2, void *p2, void *p3);
33  
34  /** \brief Closure represents a deferred computation */
35  
36  typedef struct {
37      union {
38          ClosureHandler_ppi mHandler_ppi;
39          ClosureHandler_ppii mHandler_ppii;
40          ClosureHandler_piipp mHandler_piipp;
41      } mHandler;
42      ClosureKind mKind;
43      void *mContext1;
44      void *mContext2;
45      void *mContext3;
46      int mParameter1;
47      int mParameter2;
48  } Closure;
49  
50  /** \brief ThreadPool manages a pool of worker threads that execute Closures */
51  
52  typedef struct {
53      unsigned mInitialized; ///< Indicates which of the following 3 fields are initialized
54      pthread_mutex_t mMutex;
55      pthread_cond_t mCondNotFull;    ///< Signalled when a client thread could be unblocked
56      pthread_cond_t mCondNotEmpty;   ///< Signalled when a worker thread could be unblocked
57      SLboolean mShutdown;   ///< Whether shutdown of thread pool has been requested
58      unsigned mWaitingNotFull;   ///< Number of client threads waiting to enqueue
59      unsigned mWaitingNotEmpty;  ///< Number of worker threads waiting to dequeue
60      unsigned mMaxClosures;  ///< Number of slots in circular buffer for closures, not counting spare
61      unsigned mMaxThreads;   ///< Number of worker threads
62      Closure **mClosureArray;    ///< The circular buffer of closures
63      Closure **mClosureFront, **mClosureRear;
64      /// Saves a malloc in the typical case
65  #define CLOSURE_TYPICAL 15
66      Closure *mClosureTypical[CLOSURE_TYPICAL+1];
67      pthread_t *mThreadArray;    ///< The worker threads
68  #ifdef ANDROID
69  // Note: if you set THREAD_TYPICAL to a non-zero value because you
70  // want to use asynchronous callbacks, be aware that any value greater
71  // than 1 can result in out-of-order callbacks on a given player, in the
72  // current implementation.  Thus you should probably configure 1 total or
73  // change the implementation so that it uses at most 1 thread per player.
74  #if defined(USE_ASYNCHRONOUS_PLAY_CALLBACK) || \
75          defined(USE_ASYNCHRONOUS_STREAMCBEVENT_PROPERTYCHANGE_CALLBACK)
76  #define THREAD_TYPICAL 1
77  #else
78  #define THREAD_TYPICAL 0
79  #endif
80  #else // !ANDROID
81  #define THREAD_TYPICAL 4
82  #endif
83      pthread_t mThreadTypical[THREAD_TYPICAL];
84  } ThreadPool;
85  
86  extern SLresult ThreadPool_init(ThreadPool *tp, unsigned maxClosures, unsigned maxThreads);
87  extern void ThreadPool_deinit(ThreadPool *tp);
88  extern SLresult ThreadPool_add(ThreadPool *tp, ClosureKind kind,
89          ClosureHandler_generic,
90          void *cntxt1, void *cntxt2, void *cntxt3, int param1, int param2);
91  extern Closure *ThreadPool_remove(ThreadPool *tp);
92  extern SLresult ThreadPool_add_ppi(ThreadPool *tp, ClosureHandler_ppi handler,
93          void *cntxt1, void *cntxt2, int param1);
94  extern SLresult ThreadPool_add_ppii(ThreadPool *tp, ClosureHandler_ppii handler,
95          void *cntxt1, void *cntxt2, int param1, int param2);
96  extern SLresult ThreadPool_add_piipp(ThreadPool *tp, ClosureHandler_piipp handler,
97          void *cntxt1, int param1, int param2, void *cntxt2, void *cntxt3);
98