MSI: implement thread safety for records (2nd try)

Mike McCormack mike at codeweavers.com
Sun Dec 26 05:39:06 CST 2004


ChangeLog:
* implement thread safety for records
-------------- next part --------------
Index: dlls/msi/handle.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/handle.c,v
retrieving revision 1.6
diff -u -r1.6 handle.c
--- dlls/msi/handle.c	9 Jul 2004 22:25:34 -0000	1.6
+++ dlls/msi/handle.c	26 Dec 2004 11:38:25 -0000
@@ -41,6 +41,16 @@
 };
 static CRITICAL_SECTION MSI_handle_cs = { &MSI_handle_cs_debug, -1, 0, 0, 0, 0 };
 
+static CRITICAL_SECTION MSI_object_cs;
+static CRITICAL_SECTION_DEBUG MSI_object_cs_debug =
+{
+    0, 0, &MSI_object_cs,
+    { &MSI_object_cs_debug.ProcessLocksList, 
+      &MSI_object_cs_debug.ProcessLocksList },
+      0, 0, { 0, (DWORD)(__FILE__ ": MSI_object_cs") }
+};
+static CRITICAL_SECTION MSI_object_cs = { &MSI_object_cs_debug, -1, 0, 0, 0, 0 };
+
 MSIOBJECTHDR *msihandletable[MSIMAXHANDLES];
 
 MSIHANDLE alloc_msihandle( MSIOBJECTHDR *obj )
@@ -141,6 +151,16 @@
     }
 
     info->refcount++;
+}
+
+void msiobj_lock( MSIOBJECTHDR *info )
+{
+    EnterCriticalSection( &MSI_object_cs );
+}
+
+void msiobj_unlock( MSIOBJECTHDR *info )
+{
+    LeaveCriticalSection( &MSI_object_cs );
 }
 
 int msiobj_release( MSIOBJECTHDR *info )
Index: dlls/msi/msipriv.h
===================================================================
RCS file: /home/wine/wine/dlls/msi/msipriv.h,v
retrieving revision 1.32
diff -u -r1.32 msipriv.h
--- dlls/msi/msipriv.h	22 Dec 2004 15:05:07 -0000	1.32
+++ dlls/msi/msipriv.h	26 Dec 2004 11:38:25 -0000
@@ -230,6 +230,8 @@
 extern void *alloc_msiobject(UINT type, UINT size, msihandledestructor destroy );
 extern void msiobj_addref(MSIOBJECTHDR *);
 extern int msiobj_release(MSIOBJECTHDR *);
+extern void msiobj_lock(MSIOBJECTHDR *);
+extern void msiobj_unlock(MSIOBJECTHDR *);
 extern MSIHANDLE msiobj_findhandle( MSIOBJECTHDR *hdr );
 
 /* add this table to the list of cached tables in the database */
Index: dlls/msi/record.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/record.c,v
retrieving revision 1.16
diff -u -r1.16 record.c
--- dlls/msi/record.c	6 Dec 2004 16:18:22 -0000	1.16
+++ dlls/msi/record.c	26 Dec 2004 11:38:26 -0000
@@ -116,7 +116,9 @@
         return 0;
     }
 
+    msiobj_lock( &rec->hdr );
     ret = MSI_RecordGetFieldCount( rec );
+    msiobj_unlock( &rec->hdr );
     msiobj_release( &rec->hdr );
 
     return ret;
@@ -180,7 +182,9 @@
     if( !rec )
         return MSI_NULL_INTEGER;
 
+    msiobj_lock( &rec->hdr );
     ret = MSI_RecordGetInteger( rec, iField );
+    msiobj_unlock( &rec->hdr );
     msiobj_release( &rec->hdr );
 
     return ret;
@@ -197,12 +201,14 @@
     if( !rec )
         return ERROR_INVALID_HANDLE;
 
+    msiobj_lock( &rec->hdr );
     for( i=0; i<=rec->count; i++)
     {
         MSI_FreeField( &rec->fields[i] );
         rec->fields[i].type = MSIFIELD_NULL;
         rec->fields[i].u.iVal = 0;
     }
+    msiobj_unlock( &rec->hdr );
 
     return ERROR_SUCCESS;
 }
@@ -232,7 +238,9 @@
     if( !rec )
         return ERROR_INVALID_HANDLE;
 
+    msiobj_lock( &rec->hdr );
     ret = MSI_RecordSetInteger( rec, iField, iVal );
+    msiobj_unlock( &rec->hdr );
     msiobj_release( &rec->hdr );
     return ret;
 }
@@ -259,7 +267,9 @@
     rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
     if( !rec )
         return ERROR_INVALID_HANDLE;
+    msiobj_lock( &rec->hdr );
     ret = MSI_RecordIsNull( rec, iField );
+    msiobj_unlock( &rec->hdr );
     msiobj_release( &rec->hdr );
     return ret;
 
@@ -318,7 +328,9 @@
     rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
     if( !rec )
         return ERROR_INVALID_HANDLE;
+    msiobj_lock( &rec->hdr );
     ret = MSI_RecordGetStringA( rec, iField, szValue, pcchValue);
+    msiobj_unlock( &rec->hdr );
     msiobj_release( &rec->hdr );
     return ret;
 }
@@ -385,7 +397,9 @@
     if( !rec )
         return ERROR_INVALID_HANDLE;
 
+    msiobj_lock( &rec->hdr );
     ret = MSI_RecordGetStringW( rec, iField, szValue, pcchValue );
+    msiobj_unlock( &rec->hdr );
     msiobj_release( &rec->hdr );
     return ret;
 }
@@ -426,7 +440,9 @@
     rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
     if( !rec )
         return ERROR_INVALID_HANDLE;
+    msiobj_lock( &rec->hdr );
     ret = MSI_RecordSetStringA( rec, iField, szValue );
+    msiobj_unlock( &rec->hdr );
     msiobj_release( &rec->hdr );
     return ret;
 }
@@ -463,7 +479,9 @@
     if( !rec )
         return ERROR_INVALID_HANDLE;
 
+    msiobj_lock( &rec->hdr );
     ret = MSI_RecordSetStringW( rec, iField, szValue );
+    msiobj_unlock( &rec->hdr );
     msiobj_release( &rec->hdr );
     return ret;
 }
@@ -554,7 +572,9 @@
     rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
     if( !rec )
         return ERROR_INVALID_HANDLE;
+    msiobj_lock( &rec->hdr );
     ret = MSI_RecordReadStream( rec, iField, buf, sz );
+    msiobj_unlock( &rec->hdr );
     msiobj_release( &rec->hdr );
     return ret;
 }


More information about the wine-patches mailing list