| <chapter> | |
| <title>Graphical modules</title> | |
| <sect1> | |
| <title>GDI Module</title> | |
| <sect2> | |
| <title>X Windows System interface</title> | |
| <para> | |
| The X libraries used to implement X clients (such as Wine) | |
| do not work properly if multiple threads access the same | |
| display concurrently. It is possible to compile the X | |
| libraries to perform their own synchronization (initiated | |
| by calling <function>XInitThreads()</function>). However, | |
| Wine does not use this approach. Instead Wine performs its | |
| own synchronization using the | |
| <function>wine_tsx11_lock()</function> / <function>wine_tsx11_unlock()</function> | |
| functions. This locking protects library access | |
| with a critical section, and also arranges things so that | |
| X libraries compiled without <option>-D_REENTRANT</option> | |
| (eg. with global <varname>errno</varname> variable) will | |
| work with Wine. | |
| </para> | |
| <para> | |
| In the past, all calls to X used to go through a wrapper called | |
| <function>TSX...()</function> (for "Thread Safe X ..."). | |
| While it is still being used in the code, it's inefficient | |
| as the lock is potentially aquired and released unnecessarily. | |
| New code should explicitly aquire the lock. | |
| </para> | |
| </sect2> | |
| </sect1> | |
| </chapter> | |
| <!-- Keep this comment at the end of the file | |
| Local variables: | |
| mode: sgml | |
| sgml-parent-document:("wine-devel.sgml" "set" "book" "part" "chapter" "") | |
| End: | |
| --> |