threads.txt   [plain text]


Threads with FreeType
=====================


The  FreeType  engine  can  now  be compiled  in  thread-safe  mode.
Because  we want  to  keep the  engine  small and  fast, the  thread
protection is simple.   This file gives an overview  of what you can
do, and what you should strictly never do.


How to enable thread-safe support?

A. You must  have a valid  replacement for the  file `lib/ttmutex.c'
   which  calls  your system's  API  to  create,  lock, and  release
   mutexes or semaphores.  The current implementation is a dummy and
   doesn't do anything.

B. You      must     re-define      the      configuration     macro
   TT_CONFIG_OPTION_THREAD_SAFE   located  in   `ttconfig.h'.   Then
   recompile.


IMPORTANT NOTE:

  If two threads create and  use their own TT_Engine structure, they
  can freely call the library  concurrently on each of them (as well
  as  all their related  objects), even  in the  non-threaded build.
  The following remarks only  apply to concurrent requests performed
  on a single TT_Engine shared by multiple threads.


--------------------------------------------------------------------

- What you can do:

  With the exceptions listed below (in `What you can't do'), you can
  call all  API functions  concurrently with two  different threads.
  This includes:

    Creating two or more faces from the same engine (i.e. concurrent
    calls to TT_Open_Face()/TT_Open_Collection()).

    Creating  two  or  more  instances  from the  same  face  object
    (i.e. concurrent calls to TT_New_Instance()).

    Creating two or more glyph  containers from the same face object
    (i.e. concurrent calls to TT_New_Glyph()).

    The same holds for destruction of objects.

    Load  two or  more  glyphs  concurrently for  the  same face  or
    instance (i.e. concurrent TT_Load_Glyph() calls).

    Render two or  more glyphs at the same time,  in the same engine
    (i.e.   calling  TT_Get_Glyph_Bitmap()/TT_Get_Glyph_Pixmap()  or
    TT_Get_Outline_Bitmap()/TT_GetOutline_Pixmap() concurrently).

    NOTE: The  scan-line converter  can only render  one glyph  at a
          time,  for  a   given  TT_Engine.   Concurrent  calls  are
          synchronized through a mutex, though.

          If  you  really, _really_,  need  to  generate bitmaps  or
          pixmaps concurrently, create  an additional engine and use
          it   with  TT_Get_Outline_Bitmap()/TT_Get_Outline_Pixmap()
          (you don't  need to create  any object in it,  the outline
          can come from any source too).

          This is, however, not recommended (it works perfectly, but
          this  could change  in  the future  for various  technical
          reasons).


---------------------------------------------------------------------------

- What you cannot do:

  - You shouldn't try to delete  an object while still using it with
    another thread.  The engine  doesn't protect you from stupidity!
    For example, these concurrent calls:

      TT_Close_Face( face );
      TT_Get_Glyph_Bitmap( glyph, &bitmap );

    will act unexpectedly if the glyph is a child of the face (i.e.,
    was created with TT_New_Glyph( face, &glyph ))
                                   ^^^^
                                 same face

    Here are some other examples:

      TT_Get_Glyph_Outline( glyph1, ... );
      TT_Load_Glyph( instance, glyph1, ... );

    or

      TT_Get_Outline_BBox( outline, &bbox );
      TT_Transform_Outline( outline );

    etc.

    You get the  idea: Only the face and  instances are protected --
    glyph containers and outlines should be thread-specific.


  - You  shouldn't initialize extensions  in an  engine concurrently
    (which is what every mere mortal will do anyway :-).



That's about it. Now enjoy the lib ;-)


PS: See the  `MT-Note' and  `MT-Safe'  remarks  in ttapi.c  for more
    detailed information on each specific function.


--- end of threads.txt ---