MSI: First go at thread safety for MSI records
Mike McCormack
mike at codeweavers.com
Wed Dec 22 19:44:32 CST 2004
ChangeLog:
* First go at thread safety for MSI 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 23 Dec 2004 01:43:40 -0000
@@ -121,6 +121,7 @@
info->magic = MSIHANDLE_MAGIC;
info->type = type;
info->refcount = 1;
+ InitializeCriticalSection( &info->cs );
info->destructor = destroy;
}
@@ -141,6 +142,16 @@
}
info->refcount++;
+}
+
+void msiobj_lock( MSIOBJECTHDR *info )
+{
+ EnterCriticalSection( &info->cs );
+}
+
+void msiobj_unlock( MSIOBJECTHDR *info )
+{
+ LeaveCriticalSection( &info->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 23 Dec 2004 01:43:40 -0000
@@ -54,6 +54,7 @@
UINT magic;
UINT type;
UINT refcount;
+ CRITICAL_SECTION cs;
msihandledestructor destructor;
struct tagMSIOBJECTHDR *next;
struct tagMSIOBJECTHDR *prev;
@@ -230,6 +231,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 23 Dec 2004 01:43:40 -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