<div dir="ltr">On Sun, Sep 29, 2013 at 10:02 PM, Søren Sandmann <span dir="ltr"><<a href="mailto:sandmann@cs.au.dk" target="_blank">sandmann@cs.au.dk</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="im">Andrea Canciani <<a href="mailto:ranma42@gmail.com">ranma42@gmail.com</a>> writes:<br>

<br>
> I have some work on memleak related issues:<br>
><br>
> <a href="http://cgit.freedesktop.org/~ranma42/pixman/commit/?h=wip/simpleops-to-master&id=77db90242f7b7f12c5792480a10eb3a448e6c55f" target="_blank">http://cgit.freedesktop.org/~ranma42/pixman/commit/?h=wip/simpleops-to-master&id=77db90242f7b7f12c5792480a10eb3a448e6c55f</a><br>

> and<br>
> <a href="http://cgit.freedesktop.org/~ranma42/pixman/commit/?h=wip/simpleops-to-master&id=ca41228a66fe9bbec354cdef034c144ce1619793" target="_blank">http://cgit.freedesktop.org/~ranma42/pixman/commit/?h=wip/simpleops-to-master&id=ca41228a66fe9bbec354cdef034c144ce1619793</a><br>

><br>
> Do you think it might be worth to revive it and cleanup for review & merge?<br>
> Unfortunately they depend on simpleops, a header-library I wrote to<br>
> abstract (from compiler/platform) some low-level operations, like atomic<br>
> arithmetics, mutexes, threads and library constructors/destructors.<br>
> (currently all of them except init/fini are available in C11 and the<br>
> simpleops API tries to be as similar to C11 as possible, to ease C11-based<br>
> implementations and to make it easy to get rid of the simpleops dependency<br>
> when C11 support is sufficiently widespread).<br>
> Would it be ok to have it as dependency?<br>
<br>
</div>At some point pixman probably needs to become multithreaded and then we<br>
will need some abstraction for these low-level operations.<br>
<br>
I think I have mentioned before that it might be a good idea to have an<br>
MIT licensed utility library that could contain these lowlevel<br>
operations along with things like linked lists and growable<br>
arrays.</blockquote><div><br></div><div>Linked-list and hashtables are available in <a href="http://cgit.freedesktop.org/~ranma42/simpledata">http://cgit.freedesktop.org/~ranma42/simpledata</a><br></div><div>I could add growable arrays, if this is blocking the adoption of this abstractions.<br>
</div> <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Until simpleops grows into such a library, I think I'd prefer to<br>
keep the abstractions inside pixman, though those internal abstractions<br>
could potentially be based on code from simpleops.<br></blockquote><div><br><div>These header-based libraries can easily (assuming the build process is autotools or win32-makefile based) be included as git submodules.<br>
</div><div>(You might have noticed that they also provide some helpers for symbol visibility<br></div></div></div><div class="gmail_quote"> <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<br>
There is also a general issue with header libraries: they have<br>
potentialy complicated ABI issues because the code is inlined into all<br>
users, so if any aspect of the code changes, you have to recompile<br>
everything.<br>
<br>
Looking briefly at the simpleops code, I noticed a few things:<br>
<br>
- There doesn't appear to be support for __thread for thread local<br>
  variables.<br></blockquote><div><br></div><div>Exactly. I tried to implement them, but having all of them working with the same interface proved to be a very hard task.<br>For example, on Windows there seem to be some problems when dynamically loading libraries that use __declspec(thread) (this seems to be a known limitation, see <a href="http://msdn.microsoft.com/en-us/library/2s9wt68x.aspx">http://msdn.microsoft.com/en-us/library/2s9wt68x.aspx</a> and <a href="http://support.microsoft.com/kb/118816">http://support.microsoft.com/kb/118816</a> )<br>
</div><div>Instead, simpleops provides a C11-like thread-specific storage API.<br></div><div></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<br>
- It's a bit difficult to understand all the headers that include each<br>
  other. (The proliferation of headers is something that I never liked<br>
  about the cairo code as well). Would it be possible to just have one<br>
  header per platform -- ie., simpleops-win32.h, simpleops-posix, ...?<br></blockquote><div><br></div><div>It should be possible, but there seem to be quite a lot of platforms, because sometimes the features are made available by the compilers (example: atomics on gcc and msvc) while sometimes they depend on the system library (example: threads).<br>
</div><div><div>In addition to that, currently some common code is factored out and the files are structured so that they can be compared and extended (adding a new implementation or adding functions to all implementations) easily.<br>
</div>All in all I believe it would be possible to have simpleops-win32-gcc.h simpleops-win32-msvc.h simpleops-mac-posix.h simpleops-suncc-posix.h and so on, but I'm afraid it would be harder to maintain.<br></div><div>
For an efficient way to view and compare the implementations, see file:///path/to/simpleops/index.html?atomic/impl/_dispatch.h (and similarly using "mtx", "cnd", and so on instead of "atomic")<br>
</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
- There is no way to statically initialize a mutex. I realize that<br>
  that's because Windows doesn't offer this feature, but without it,<br>
  you need some kind of library initialization routine.<br></blockquote><div><br></div><div>Library initialization routine are provided, so you can use them both for mutex initialization and for TSS setup.<br></div><div>
A possible alternative would be to use something like call_once(), but it is pretty hard to perform the proper deinitialization upon library unload if you use that.<br></div><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<br>
  I wrote some notes here:<br>
<br>
      <a href="http://cgit.freedesktop.org/~sandmann/pixman/tree/docs/thread-primitives?h=docs" target="_blank">http://cgit.freedesktop.org/~sandmann/pixman/tree/docs/thread-primitives?h=docs</a><br>
<br>
  about how you could emulate them on Windows.<br></blockquote><div><br><div>Instead of static mutex initialization, your docs seem to be suggesting that call_once() should be made available.<br></div>Would that be sufficient?<br>
</div><div>How would you destroy/free that data that has been created/allocated in this initialization?<br></div><div>Ideally I'd want to be able to load, use and unload pixman, cairo and any library repeatedly with no bugs/leaks/crashes.<br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
- If/when we get serious about multithreading in pixman, we'd likely<br>
  need support for condition variables, and on Linux possibly handroll<br>
  the thread primitives based on futex() and clone() without using<br>
  pthreads.<br></blockquote><div><br></div><div>Simpleops already provides C11-like condition variables (cnd_{destroy,init,signal,timedwait,wait} are already implemented, cnd_broadcast is not, but it should be trivial to add it if needed).<br>
</div><div>It should also be possible to avoid pthread and use syscalls directly, but why should that be needed? Is pthread very inefficient on linux?<br></div><br></div><div class="gmail_quote">Andrea<br></div></div></div>