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