Alexandre Julliard : winex11: Create contexts at initialization time to avoid the need for locks.

Alexandre Julliard julliard at winehq.org
Thu Aug 16 15:26:13 CDT 2012


Module: wine
Branch: master
Commit: c970621d90372d14f982b41811efa4e4fe9e5ec8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c970621d90372d14f982b41811efa4e4fe9e5ec8

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Aug 15 15:51:06 2012 +0200

winex11: Create contexts at initialization time to avoid the need for locks.

---

 dlls/winex11.drv/mouse.c       |   12 +++++-------
 dlls/winex11.drv/window.c      |    6 +-----
 dlls/winex11.drv/x11drv.h      |    4 ++++
 dlls/winex11.drv/x11drv_main.c |    4 ++++
 4 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index e8ba8e3..caa2530 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -121,10 +121,11 @@ static const UINT button_up_data[NB_BUTTONS] =
     XBUTTON2
 };
 
+XContext cursor_context = 0;
+
 static HWND cursor_window;
 static HCURSOR last_cursor;
 static DWORD last_cursor_change;
-static XContext cursor_context;
 static RECT clip_rect;
 static Cursor create_cursor( HANDLE handle );
 
@@ -200,16 +201,13 @@ void set_window_cursor( Window window, HCURSOR handle )
 {
     Cursor cursor, prev;
 
-    wine_tsx11_lock();
     if (!handle) cursor = get_empty_cursor();
-    else if (!cursor_context || XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&cursor ))
+    else if (XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&cursor ))
     {
         /* try to create it */
-        wine_tsx11_unlock();
         if (!(cursor = create_cursor( handle ))) return;
 
         wine_tsx11_lock();
-        if (!cursor_context) cursor_context = XUniqueContext();
         if (!XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&prev ))
         {
             /* someone else was here first */
@@ -221,12 +219,12 @@ void set_window_cursor( Window window, HCURSOR handle )
             XSaveContext( gdi_display, (XID)handle, cursor_context, (char *)cursor );
             TRACE( "cursor %p created %lx\n", handle, cursor );
         }
+        wine_tsx11_unlock();
     }
 
     XDefineCursor( gdi_display, window, cursor );
     /* make the change take effect immediately */
     XFlush( gdi_display );
-    wine_tsx11_unlock();
 }
 
 /***********************************************************************
@@ -1205,7 +1203,7 @@ void CDECL X11DRV_DestroyCursorIcon( HCURSOR handle )
     Cursor cursor;
 
     wine_tsx11_lock();
-    if (cursor_context && !XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&cursor ))
+    if (!XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&cursor ))
     {
         TRACE( "%p xid %lx\n", handle, cursor );
         XFreeCursor( gdi_display, cursor );
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index c69ef8c..c8e48b2 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -75,7 +75,7 @@ int clipping_cursor = 0;
 XContext winContext = 0;
 
 /* X context to associate a struct x11drv_win_data to an hwnd */
-static XContext win_data_context;
+XContext win_data_context = 0;
 
 /* time of last user event and window where it's stored */
 static Time last_user_time;
@@ -1914,11 +1914,7 @@ static struct x11drv_win_data *alloc_win_data( Display *display, HWND hwnd )
     if ((data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data))))
     {
         data->hwnd = hwnd;
-        wine_tsx11_lock();
-        if (!winContext) winContext = XUniqueContext();
-        if (!win_data_context) win_data_context = XUniqueContext();
         XSaveContext( display, (XID)hwnd, win_data_context, (char *)data );
-        wine_tsx11_unlock();
     }
     return data;
 }
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index f24ccdc..3aaedef 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -615,6 +615,10 @@ static inline BOOL is_window_rect_fullscreen( const RECT *rect )
 
 /* X context to associate a hwnd to an X window */
 extern XContext winContext DECLSPEC_HIDDEN;
+/* X context to associate a struct x11drv_win_data to an hwnd */
+extern XContext win_data_context DECLSPEC_HIDDEN;
+/* X context to associate an X cursor to a Win32 cursor handle */
+extern XContext cursor_context DECLSPEC_HIDDEN;
 
 extern void X11DRV_InitClipboard(void) DECLSPEC_HIDDEN;
 extern int CDECL X11DRV_AcquireClipboard(HWND hWndClipWindow) DECLSPEC_HIDDEN;
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 1499329..5659143 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -570,6 +570,10 @@ static BOOL process_attach(void)
 
     XInternAtoms( display, (char **)atom_names, NB_XATOMS - FIRST_XATOM, False, X11DRV_Atoms );
 
+    winContext = XUniqueContext();
+    win_data_context = XUniqueContext();
+    cursor_context = XUniqueContext();
+
     if (TRACE_ON(synchronous)) XSynchronize( display, True );
 
     xinerama_init( WidthOfScreen(screen), HeightOfScreen(screen) );




More information about the wine-cvs mailing list