Dear Pixman-devs,

as written earlier, I working on a pixman port as a real AmigaOS shared library. As real pixman requires some static writable data and on AmigaOS TLS is not supported natively, the access to the pixman fast cache needs to be synched at least. As the AmigaOS port shouldn't be included in the main pixman git according to your first response I had to think of a variant how to to redefine the existing TLS macros for other platforms.

In this version of the patch, I introduced a PIXMAN_CUSTOM_TLS define. If defined, a file called pixman-tls.h will be included, in which the TLS definitions could be made. Otherwise, all TLS defines are done in pixman-compiler.h as usual. In AmigaOS, the synchronization will be done by a Mutex/Semaphore, therefore it is also necessary to indicate the end of an access to a variable. This will be done now by using the PIXMAN_UNGET_THREAD_LOCAL macros as the counterpart for PIXMAN_GET_THREAD_LOCAL (instead of GET/UNGET words like OBTAIN/RELEASE or LOCK/UNLOCK may be better, but I leave this up to you).

I'm not really 100% happy with the PIXMAN_CUSTOM_TLS solution, but I didn't see how an external port can supply own definitions otherwise. Feedback and comments are welcome! Thanks

Best
Sebastian


---
 pixman/pixman-compiler.h |    9 +++++++++
 pixman/pixman-utils.c    |    2 ++
 2 files changed, 11 insertions(+)

diff --git a/pixman/pixman-compiler.h b/pixman/pixman-compiler.h
index a978acc..1081a39 100644
--- a/pixman/pixman-compiler.h
+++ b/pixman/pixman-compiler.h
@@ -94,6 +94,14 @@
     ((type *)(((uint8_t *)data) - offsetof (type, member)))

 /* TLS */
+#if defined(PIXMAN_CUSTOM_TLS)
+
+#include "pixman-tls.h"
+
+#else
+
+#   define PIXMAN_UNGET_THREAD_LOCAL(name) {}
+
 #if defined(PIXMAN_NO_TLS)

 #   define PIXMAN_DEFINE_THREAD_LOCAL(type, name)                      \
@@ -220,3 +228,4 @@
# error "Unknown thread local support for this system. Pixman will not work with multiple threads. Define PIXMAN_NO_TLS to acknowledge and accept this limitation and compile pixman without thread-safety support."

 #endif
+#endif
\ No newline at end of file
diff --git a/pixman/pixman-utils.c b/pixman/pixman-utils.c
index 93c061a..addadae 100644
--- a/pixman/pixman-utils.c
+++ b/pixman/pixman-utils.c
@@ -120,6 +120,7 @@ _pixman_lookup_composite_function (pixman_implementation_t *toplevel,
            ++info;
        }
     }
+    PIXMAN_UNGET_THREAD_LOCAL(fast_path_cache);
     return FALSE;

 update_cache:
@@ -138,6 +139,7 @@ update_cache:
        cache->cache[0].fast_path.dest_flags = dest_flags;
        cache->cache[0].fast_path.func = *out_func;
     }
+    PIXMAN_UNGET_THREAD_LOCAL(fast_path_cache);

     return TRUE;
 }
--
1.7.10.4

_______________________________________________
Pixman mailing list
Pixman@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/pixman

Reply via email to