locks.c revision fe96fa06360516c60490c7a697e1148017b4c1b2
1a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* 2a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 3a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 4a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * you may not use this file except in compliance with the License. 6a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * You may obtain a copy of the License at 7a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 8a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 10a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * See the License for the specific language governing permissions and 14a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * limitations under the License. 15a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten */ 16a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 17a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h" 18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 190b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 200b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten/* Exclusively lock an object */ 210b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 22fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#ifdef USE_DEBUG 23fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kastenvoid object_lock_exclusive_(IObject *this, const char *file, int line) 24fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten{ 25fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten int ok; 26fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten ok = pthread_mutex_trylock(&this->mMutex); 27fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten if (0 != ok) { 28fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten SL_LOGE("object 0x%p was locked by 0x%p at %s:%d\n", this, *(void **)&this->mOwner, 29fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten this->mFile, this->mLine); 30fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten ok = pthread_mutex_lock(&this->mMutex); 31fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten assert(0 == ok); 32fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten } 33fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten pthread_t zero; 34fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten memset(&zero, 0, sizeof(pthread_t)); 35fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten assert(0 == memcmp(&zero, &this->mOwner, sizeof(pthread_t))); 36fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten assert(NULL == this->mFile); 37fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten assert(0 == this->mLine); 38fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten this->mOwner = pthread_self(); 39fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten this->mFile = file; 40fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten this->mLine = line; 41fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten} 42fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#else 43fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kastenvoid object_lock_exclusive_(IObject *this) 44a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 45a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten int ok; 46a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten ok = pthread_mutex_lock(&this->mMutex); 47a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten assert(0 == ok); 48a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 49fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#endif 50a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 510b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 520b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten/* Exclusively unlock an object and do not report any updates */ 530b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 54a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid object_unlock_exclusive(IObject *this) 55a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 56fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#ifdef USE_DEBUG 57fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten assert(pthread_equal(pthread_self(), this->mOwner)); 58fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten assert(NULL != this->mFile); 59fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten assert(0 != this->mLine); 60fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten memset(&this->mOwner, 0, sizeof(pthread_t)); 61fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten this->mFile = NULL; 62fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten this->mLine = 0; 63fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#endif 64a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten int ok; 65a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten ok = pthread_mutex_unlock(&this->mMutex); 66a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten assert(0 == ok); 67a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 68a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 690b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 700b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten/* Exclusively unlock an object and report updates to the specified bit-mask of attributes */ 710b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 72e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenvoid object_unlock_exclusive_attributes(IObject *this, unsigned attributes) 73e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten{ 74fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten 75fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#ifdef USE_DEBUG 76fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten assert(pthread_equal(pthread_self(), this->mOwner)); 77fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten assert(NULL != this->mFile); 78fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten assert(0 != this->mLine); 79fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#endif 80fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten 81e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten int ok; 82e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint32 objectID = IObjectToObjectID(this); 83e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten CAudioPlayer *ap; 844b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 854b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // FIXME The endless if statements are getting ugly, should use bit search 864b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 87e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // Android likes to see certain updates synchronously 883c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi 89e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes & ATTR_GAIN) { 90e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten switch (objectID) { 91e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten case SL_OBJECTID_AUDIOPLAYER: 92e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten attributes &= ~ATTR_GAIN; // no need to process asynchronously also 93e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap = (CAudioPlayer *) this; 94e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#ifdef ANDROID 95d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi android_audioPlayer_volumeUpdate(ap); 96e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#else 97e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten audioPlayerGainUpdate(ap); 98e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif 99e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 100e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten case SL_OBJECTID_OUTPUTMIX: 101e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // FIXME update gains on all players attached to this outputmix 1020b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten SL_LOGE("[ FIXME: gain update on an SL_OBJECTID_OUTPUTMIX to be implemented ]"); 1033c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi break; 1043c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi case SL_OBJECTID_MIDIPLAYER: 1057a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // MIDI 1060b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten SL_LOGE("[ FIXME: gain update on an SL_OBJECTID_MIDIPLAYER to be implemented ]"); 107e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 108e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten default: 109e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 110e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 111e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 1123c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi 1133c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi if (attributes & ATTR_POSITION) { 1143c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi switch (objectID) { 1153c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi case SL_OBJECTID_AUDIOPLAYER: 1163c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi ap = (CAudioPlayer *) this; 1173c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#ifdef ANDROID 1184b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten attributes &= ~ATTR_POSITION; // no need to process asynchronously also 119d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi android_audioPlayer_seek(ap, ap->mSeek.mPos); 1203c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#else 1214b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten //audioPlayerTransportUpdate(ap); 1223c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#endif 1233c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi break; 1243c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi case SL_OBJECTID_MIDIPLAYER: 1257a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // MIDI 1260b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten SL_LOGE("[ FIXME: position update on an SL_OBJECTID_MIDIPLAYER to be implemented ]"); 1273c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi break; 1283c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi default: 1293c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi break; 1303c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi } 1313c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi } 1323c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi 133e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes & ATTR_TRANSPORT) { 134e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (SL_OBJECTID_AUDIOPLAYER == objectID) { 1354b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID 136e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten attributes &= ~ATTR_TRANSPORT; // no need to process asynchronously also 137e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap = (CAudioPlayer *) this; 138e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // FIXME should only call when state changes 139d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi android_audioPlayer_setPlayState(ap); 140e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // FIXME ditto, but for either eventflags or marker position 141d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi android_audioPlayer_useEventMask(ap); 142e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#else 1434b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten //audioPlayerTransportUpdate(ap); 144e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif 145e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 146e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 1474b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 1484b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // ( buffer queue count is non-empty and play state == PLAYING ) became true 1494b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten if (attributes & ATTR_ENQUEUE) { 1504b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten if (SL_OBJECTID_AUDIOPLAYER == objectID) { 1514b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten attributes &= ~ATTR_ENQUEUE; 1524b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten ap = (CAudioPlayer *) this; 1534b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten if (SL_PLAYSTATE_PLAYING == ap->mPlay.mState) { 154b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi#ifdef ANDROID 155a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi android_audioPlayer_bufferQueueRefilled(ap); 156b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi#endif 1574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 1584b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 1594b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 1604b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 161e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes) { 162e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten unsigned oldAttributesMask = this->mAttributesMask; 163e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten this->mAttributesMask = oldAttributesMask | attributes; 164e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (oldAttributesMask) 165e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten attributes = ATTR_NONE; 166e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 167fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#ifdef USE_DEBUG 168fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten memset(&this->mOwner, 0, sizeof(pthread_t)); 169fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten this->mFile = NULL; 170fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten this->mLine = 0; 171fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#endif 172e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ok = pthread_mutex_unlock(&this->mMutex); 173e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten assert(0 == ok); 174e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes) { // first update to this interface since previous sync 175e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten IEngine *thisEngine = this->mEngine; 176e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten interface_lock_exclusive(thisEngine); 177e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten thisEngine->mChangedMask |= 1 << (this->mInstanceID - 1); 178e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten interface_unlock_exclusive(thisEngine); 179e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 180e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten} 181e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 1820b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 1830b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten/* Wait on the condition variable associated with the object; see pthread_cond_wait */ 1840b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 185a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid object_cond_wait(IObject *this) 186a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 187a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten int ok; 188a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten ok = pthread_cond_wait(&this->mCond, &this->mMutex); 189a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten assert(0 == ok); 190a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 191a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 1920b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 1930b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten/* Signal the condition variable associated with the object; see pthread_cond_signal */ 1940b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 195a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid object_cond_signal(IObject *this) 196a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 197a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten int ok; 198a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten ok = pthread_cond_signal(&this->mCond); 199a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten assert(0 == ok); 200a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 201a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten 2020b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 2030b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten/* Broadcast the condition variable associated with the object; see pthread_cond_broadcast */ 2040b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 205a438eb1cf1ae602afab00336528dd230bd929206Glenn Kastenvoid object_cond_broadcast(IObject *this) 206a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten{ 207a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten int ok; 208a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten ok = pthread_cond_broadcast(&this->mCond); 209a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten assert(0 == ok); 210a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten} 211