diff --git a/libglfork.cpp b/libglfork.cpp index 03f514f..bb42f0d 100644 --- a/libglfork.cpp +++ b/libglfork.cpp @@ -259,6 +259,22 @@ static struct PrimusInfo { } } primus; +static void cleanup() +{ + primus.drawables.clear(); +} + +static void register_cleanup_1() +{ + atexit(cleanup); +} + +static void register_cleanup() +{ + static pthread_once_t once = PTHREAD_ONCE_INIT; + pthread_once(&once, register_cleanup_1); +} + // Thread-specific data static __thread struct { Display *dpy; @@ -622,11 +638,6 @@ GLXContext glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config, GLXConte void glXDestroyContext(Display *dpy, GLXContext ctx) { primus.contexts.erase(ctx); - // kludge: reap background tasks when deleting the last context - // otherwise something will deadlock during unloading the library - if (primus.contexts.empty()) - for (DrawablesInfo::iterator i = primus.drawables.begin(); i != primus.drawables.end(); i++) - i->second.reap_workers(); primus.afns.glXDestroyContext(primus.adpy, ctx); } @@ -720,6 +731,7 @@ void glXSwapBuffers(Display *dpy, GLXDrawable drawable) di.actx = ctx; di.d.spawn_worker(drawable, display_work); di.r.spawn_worker(drawable, readback_work); + register_cleanup(); } // Readback thread needs a sync object to avoid reading an incomplete frame di.sync = primus.afns.glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);