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/* 3DCommit implementation */ 18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h" 20a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 22a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DCommit_Commit(SL3DCommitItf self) 23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DCommit *thiz = (I3DCommit *) self; 27bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IObject *thisObject = InterfaceToIObject(thiz); 28a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten object_lock_exclusive(thisObject); 29bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if (thiz->mDeferred) { 30bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint32 myGeneration = thiz->mGeneration; 31a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten do { 32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten ++thiz->mWaiting; 33a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten object_cond_wait(thisObject); 34bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten } while (thiz->mGeneration == myGeneration); 35a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten } 36a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten object_unlock_exclusive(thisObject); 37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 40a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 41a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 43a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DCommit_SetDeferred(SL3DCommitItf self, SLboolean deferred) 44a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 47bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DCommit *thiz = (I3DCommit *) self; 48bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IObject *thisObject = InterfaceToIObject(thiz); 49a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten object_lock_exclusive(thisObject); 50bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDeferred = SL_BOOLEAN_FALSE != deferred; // normalize 51a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten object_unlock_exclusive(thisObject); 52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 55a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 56a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 58a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SL3DCommitItf_ I3DCommit_Itf = { 59a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DCommit_Commit, 60a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DCommit_SetDeferred 61a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}; 62a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 63a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid I3DCommit_init(void *self) 64a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 65bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DCommit *thiz = (I3DCommit *) self; 66bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &I3DCommit_Itf; 67bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDeferred = SL_BOOLEAN_FALSE; 68bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mGeneration = 0; 69bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mWaiting = 0; 70a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 71