FF8 and DirectMusic

Martin Lexa mlexa at iol.cz
Tue Aug 6 06:10:44 CDT 2002


* Johan Gill (johane at lysator.liu.se) wrote:

> This is probably related to something more graphical.
  Probably yes. Here is my current investigation:

  Debug:
  ------

  wine --debugmsg +module,+x11drv,+ddraw,+win32,+gdi FF8Config.exe

  [...]
  trace:ddraw:User_DirectDrawSurface_final_release waiting for update
  thread to terminate...
  trace:ddraw:User_DirectDrawSurface_final_release update thread
  terminated
  trace:ddraw:DIB_DirectDrawSurface_free_dc Releasing DC for surface:
  0x403df0a0

  [Point 1] X11DRV_SelectBitmap called
  trace:gdi:GDI_GetObjPtr (0044): enter 1
  trace:gdi:SelectObject hdc=00c8 0044
  trace:gdi:GDI_GetObjPtr (00c8): enter 2
  trace:gdi:GetStockObject returning   44
  trace:gdi:GDI_GetObjPtr (0044): enter 3
  trace:gdi:GetStockObject returning   44
  trace:x11drv:X11DRV_SelectBitmap Before wine_tsx11_lock()
  err:ntdll:RtlpWaitForCriticalSection section 0x40cd0644
  "x11drv_main.c: X11DRV_CritSection" wait timed out, retrying (60 sec)
  tid=080720a8
  [End of point 1]

  Code:
  -----

  HBITMAP X11DRV_SelectBitmap( X11DRV_PDEVICE *physDev, HBITMAP
	hbitmap )

	[...]

    /* Change GC depth if needed */
	   
	if (dc->bitsPerPixel != bmp->bitmap.bmBitsPixel)
	{
		TRACE("Before wine_tsx11_lock()\n");
		wine_tsx11_lock();
		TRACE("After wine_tsx11_lock()\n");
		XFreeGC( gdi_display, physDev->gc );
		physDev->gc = XCreateGC(gdi_display, physDev->drawable,	0, NULL );
		XSetGraphicsExposures(gdi_display,physDev->gc,False );
		XSetSubwindowMode(gdi_display,physDev->gc,IncludeInferiors);
		XFlush(gdi_display);
		TRACE("Before wine_tsx11_unlock()\n");
		wine_tsx11_unlock();
		TRACE("After wine_tsx11_unlock()\n");
	}
	
	GDI_ReleaseObj(hbitmap);
	return hbitmap;

  static void nop(void)
  {
  }
	 
  void (*wine_tsx11_lock)(void) = nop;
  void (*wine_tsx11_unlock)(void) = nop;

  Why there is no locking mechanism? This should be the problem, shouldn't be?

  If running wine with --debugmsg +all FF8Config:

  [...]
  [Point 1] X11DRV_SelectBitmap called
  080720a8:Call x11drv.SelectBitmap(403ff140,00000044) ret=407a7268
  080720a8:trace:win32:_EnterSysLevel (0x407de7a4, level 3): thread
  0x80720a8 (fs 008f, pid 4757) count before 2
  080720a8:trace:win32:_EnterSysLevel (0x407de7a4, level 3): thread
  0x80720a8 (fs 008f, pid 4757) count after  3
  080720a8:trace:gdi:GDI_GetObjPtr (0044): enter 3
  080720a8:trace:gdi:GetStockObject returning   44
  080720a8:trace:gdi:GDI_ReleaseObj (0044): leave 3
  080720a8:trace:win32:_LeaveSysLevel (0x407de7a4, level 3): thread
  0x80720a8 (fs 008f, pid 4757) count before 3
  080720a8:trace:win32:_LeaveSysLevel (0x407de7a4, level 3): thread
  0x80720a8 (fs 008f, pid 4757) count after  2
  080720a8:Ret  x11drv.SelectBitmap() retval=00000044 ret=407a7268
  [End of point 1]
  [...]
  
  As you can see function SelectBitmap run without any problems and
FF8Config works correctly.

  Which "debug message slowing" is so important? These
in win32:_EnterSysLevel and win32:_LeaveSysLevel. If I disable any TRACEs,
messages, etc. in these two functions then running wine
'with --debugmsg +all' FF8Config will hang.

  This should be some kind of race condition bug. Or am I wrong? Could
someone help me with this? I don't know wine internals too much but I'd
like to solve this. Thank you.

Martin



More information about the wine-devel mailing list