Rob Shearman : ole32: Make RegisteredClass list into a standard Wine
list.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Mar 9 15:47:47 CST 2007
Module: wine
Branch: master
Commit: 789f344c2b11c8508043de842b6601cec9ca941b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=789f344c2b11c8508043de842b6601cec9ca941b
Author: Rob Shearman <rob at codeweavers.com>
Date: Fri Mar 9 18:54:07 2007 +0000
ole32: Make RegisteredClass list into a standard Wine list.
---
dlls/ole32/compobj.c | 69 +++++++++++++-------------------------------------
1 files changed, 18 insertions(+), 51 deletions(-)
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index 900fc68..d0ef89c 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -117,6 +117,7 @@ static LONG s_COMLockCount = 0;
*/
typedef struct tagRegisteredClass
{
+ struct list entry;
CLSID classIdentifier;
LPUNKNOWN classObject;
DWORD runContext;
@@ -124,10 +125,9 @@ typedef struct tagRegisteredClass
DWORD dwCookie;
LPSTREAM pMarshaledData; /* FIXME: only really need to store OXID and IPID */
void *RpcRegistration;
- struct tagRegisteredClass* nextClass;
} RegisteredClass;
-static RegisteredClass* firstRegisteredClass = NULL;
+static struct list RegisteredClassList = LIST_INIT(RegisteredClassList);
static CRITICAL_SECTION csRegisteredClassList;
static CRITICAL_SECTION_DEBUG class_cs_debug =
@@ -1445,21 +1445,16 @@ static HRESULT COM_GetRegisteredClassObject(
LPUNKNOWN* ppUnk)
{
HRESULT hr = S_FALSE;
- RegisteredClass* curClass;
-
- EnterCriticalSection( &csRegisteredClassList );
+ RegisteredClass *curClass;
/*
* Sanity check
*/
assert(ppUnk!=0);
- /*
- * Iterate through the whole list and try to match the class ID.
- */
- curClass = firstRegisteredClass;
+ EnterCriticalSection( &csRegisteredClassList );
- while (curClass != 0)
+ LIST_FOR_EACH_ENTRY(curClass, &RegisteredClassList, RegisteredClass, entry)
{
/*
* Check if we have a match on the class ID and context.
@@ -1475,20 +1470,12 @@ static HRESULT COM_GetRegisteredClassObject(
IUnknown_AddRef(curClass->classObject);
hr = S_OK;
- goto end;
+ break;
}
-
- /*
- * Step to the next class in the list.
- */
- curClass = curClass->nextClass;
}
-end:
LeaveCriticalSection( &csRegisteredClassList );
- /*
- * If we get to here, we haven't found our class.
- */
+
return hr;
}
@@ -1569,8 +1556,6 @@ HRESULT WINAPI CoRegisterClassObject(
if ( newClass == NULL )
return E_OUTOFMEMORY;
- EnterCriticalSection( &csRegisteredClassList );
-
newClass->classIdentifier = *rclsid;
newClass->runContext = dwClsContext;
newClass->connectFlags = flags;
@@ -1582,7 +1567,6 @@ HRESULT WINAPI CoRegisterClassObject(
* unique. FIXME: not on 64-bit platforms.
*/
newClass->dwCookie = (DWORD)newClass;
- newClass->nextClass = firstRegisteredClass;
/*
* Since we're making a copy of the object pointer, we have to increase its
@@ -1591,7 +1575,8 @@ HRESULT WINAPI CoRegisterClassObject(
newClass->classObject = pUnk;
IUnknown_AddRef(newClass->classObject);
- firstRegisteredClass = newClass;
+ EnterCriticalSection( &csRegisteredClassList );
+ list_add_tail(&RegisteredClassList, &newClass->entry);
LeaveCriticalSection( &csRegisteredClassList );
*lpdwRegister = newClass->dwCookie;
@@ -1647,30 +1632,20 @@ HRESULT WINAPI CoRevokeClassObject(
DWORD dwRegister)
{
HRESULT hr = E_INVALIDARG;
- RegisteredClass** prevClassLink;
- RegisteredClass* curClass;
+ RegisteredClass *curClass;
TRACE("(%08x)\n",dwRegister);
EnterCriticalSection( &csRegisteredClassList );
- /*
- * Iterate through the whole list and try to match the cookie.
- */
- curClass = firstRegisteredClass;
- prevClassLink = &firstRegisteredClass;
-
- while (curClass != 0)
+ LIST_FOR_EACH_ENTRY(curClass, &RegisteredClassList, RegisteredClass, entry)
{
/*
* Check if we have a match on the cookie.
*/
if (curClass->dwCookie == dwRegister)
{
- /*
- * Remove the class from the chain.
- */
- *prevClassLink = curClass->nextClass;
+ list_remove(&curClass->entry);
if (curClass->runContext & CLSCTX_LOCAL_SERVER)
RPC_StopLocalServer(curClass->RpcRegistration);
@@ -1684,7 +1659,6 @@ HRESULT WINAPI CoRevokeClassObject(
{
LARGE_INTEGER zero;
memset(&zero, 0, sizeof(zero));
- /* FIXME: stop local server thread */
IStream_Seek(curClass->pMarshaledData, zero, STREAM_SEEK_SET, NULL);
CoReleaseMarshalData(curClass->pMarshaledData);
}
@@ -1695,21 +1669,12 @@ HRESULT WINAPI CoRevokeClassObject(
HeapFree(GetProcessHeap(), 0, curClass);
hr = S_OK;
- goto end;
+ break;
}
-
- /*
- * Step to the next class in the list.
- */
- prevClassLink = &(curClass->nextClass);
- curClass = curClass->nextClass;
}
-end:
LeaveCriticalSection( &csRegisteredClassList );
- /*
- * If we get to here, we haven't found our class.
- */
+
return hr;
}
@@ -2384,9 +2349,11 @@ static void COM_RevokeAllClasses(void)
{
EnterCriticalSection( &csRegisteredClassList );
- while (firstRegisteredClass!=0)
+ while (list_head(&RegisteredClassList))
{
- CoRevokeClassObject(firstRegisteredClass->dwCookie);
+ RegisteredClass *curClass = LIST_ENTRY(list_head(&RegisteredClassList),
+ RegisteredClass, entry);
+ CoRevokeClassObject(curClass->dwCookie);
}
LeaveCriticalSection( &csRegisteredClassList );
More information about the wine-cvs
mailing list