Friday, November 4, 2011

Global locking through StablePtr

I spoke before of using global locks in Haskell to protect a thread-unsafe C library. And I wrote about a GHC bug which breaks the most straightforward way to get a global lock.

My new solution is to store an MVar lock in a C global variable via StablePtr. I've implemented this, and it seems to work. I'd appreciate if people could bang on this code and report any issues.

You can get the library from Hackage or browse the source, including a test program. You can also use this code as a template for including a similar lock in your own Haskell project.

The C code

On the C side, we declare a global variable and a function to read that variable.

static void* global = 0;

void* hs_globalzmlock_get_global(void) {
return global;

To avoid name clashes, I gave this function a long name based on the z-encoding of my package's name. The variable named global will not conflict with another compilation unit, because it's declared static.

Another C function will set this variable, if it was previously 0. Two threads might execute this code concurrently, so we use a GCC built-in for atomic memory access.

int hs_globalzmlock_set_global(void* new_global) {
void* old = __sync_val_compare_and_swap(&global, 0, new_global);
return (old == 0);

If old is not 0, then someone has already set global, and our assignment was dropped. We report this condition to the caller.

Foreign imports

On the Haskell side, we import these C functions.

foreign import ccall unsafe "hs_globalzmlock_get_global"
c_get_global :: IO (Ptr ())

foreign import ccall "hs_globalzmlock_set_global"
c_set_global :: Ptr () -> IO CInt

The unsafe import of c_get_global demands justification. This wrinkle arises from the fact that GHC runs many Haskell threads on the same OS thread. A long-running foreign call from that OS thread might block unrelated Haskell code. GHC prevents this by moving the foreign call and/or other Haskell threads to a different OS thread. This adds latency to the foreign call — about 100 nanoseconds in my tests.

In most cases a 100 ns overhead is negligible. But it matters for functions which are guaranteed to return in a very short amount of time. And blocking other Haskell threads during such a short call is fine. Marking the import unsafe tells GHC to ignore the blocking concern, and generate a direct C function call.

Our function c_get_global is a good use case for unsafe, because it simply returns a global variable. In my tests, adding unsafe decreased the overall latency of locking by about 50%. We cannot use unsafe with c_set_global because, in the worst case, GCC implements atomic operations with blocking library functions. That's okay because c_set_global will only be called a few times anyway.

The Haskell code

Now we have access to a C global of type void*, and we want to store a Haskell value of type MVar (). The StablePtr module is just what we need. A StablePtr is a reference to some Haskell expression, which can be converted to Ptr (), aka void*. There is no guarantee about this Ptr () value, except that it can be converted back to the original StablePtr.

Here's how we store an MVar:

set :: IO ()
set = do
mv <- newMVar ()
ptr <- newStablePtr mv
ret <- c_set_global (castStablePtrToPtr ptr)
when (ret == 0) $
freeStablePtr ptr

It's fine for two threads to enter set concurrently. In one thread, the assignment will be dropped, and c_set_global will return 0. In that case we free the unused StablePtr, and the MVar will eventually be garbage-collected. StablePtrs must be freed manually, because the GHC garbage collector can't tell if some C code has stashed away the corresponding void*.

Now we can retrieve the MVar, or create it if necessary.

get :: IO (MVar ())
get = do
p <- c_get_global
if p == nullPtr
then set >> get
else deRefStablePtr (castPtrToStablePtr p)

In the common path, we do an unsynchronized read on the global variable. Only if the variable appears to contain NULL do we allocate an MVar, perform a synchronized compare-and-swap, etc. This keeps overhead low, and makes this library suitable for fine-grained locking.

All that's left is the user-visible locking interface:

lock :: IO a -> IO a
lock act = get >>= flip withMVar (const act)

Inspecting the machine code

Just for fun, let's see how GCC implements __sync_val_compare_and_swap on the AMD64 architecture.

$ objdump -d dist/build/cbits/global.o
0000000000000010 <hs_globalzmlock_set_global>:
  10:   31 c0                   xor    %eax,%eax
  12:   f0 48 0f b1 3d 00 00    lock cmpxchg %rdi,0x0(%rip)
  19:   00 00

This lock cmpxchg is the same instruction used by the GHC runtime system for its own atomic compare-and-swap. The offset on the operand 0x0(%rip) will be relocated to point at global.


  1. Nice article, thanks for the information. It's very complete information. I will bookmark for next reference
    jaring futsal | jaring golf | jaring pengaman proyek |
    jaring pengaman bangunan | jaring pengaman gedung

  2. WOW! I Love it...
    and i thing thats good for you >>

    Make Up BK Acne Balancing Mask
    Thank you!

  3. Did you know that you can easily view the contents of your phone on your TV without a cable? With a screen mirror app you can easily do the screen mirroring from Android to TV. Check out to find out more.

  4. Suggest good information in this message, click here.

  5. Easyworship Crack
    Cracked Here is a useful place where you can easily find Activators, Patch, Full version software Free Download, License key, serial key, keygen, Activation Key and Torrents.
    Get all of these by easily just on a single click.

  6. Voicemod Pro Crack
    Voicemod Pro Crack is a useful place where you can easily find Activators, Patch, Full version software Free Download, License key, serial key, keygen, Activation Key and Torrents.
    Get all of these by easily just on a single click.

  7. Packers and Movers Bangalore - Reliable and Verified Household Shifting Service Providers Give Reasonable ###Packers and Movers Charges. Cheap and Best Office Relocation Compare Quotation for Assurance for Local and Domestic House Shifting and Get estimates today to save upto 20%, ***Read Customer Reviews - @ Packers And Movers Bangalore

  8. Get Shifting/Relocation Quotation from ###Packers and Movers Delhi. Packers and Movers Delhi 100% Affordable and Reliable ***Household Shifting Services. Compare Transportation Charges and Save Time, Verified and Trusted Packers and Movers in Delhi, Cheap and Safe Local, Domestic House Shifting @ Packers And Movers Delhi

  9. Malayalam Medium Kerala SSLC 10th Class Model Paper 2022 Keral 10th previous year Sample Papers 2022 Malayalam medium pdf free download is students essential for SSLC 2022 Examination Prepare. Kerala SSLC Model Paper 2022 Kerala State SSLC Question Papers 2022 kerala SSLC sample question paper 2022 English medium and previous years question papers for upcoming examinations in 2022.

  10. Packers and Movers Chennai Give Safe and Reliable ***Household Shifting Services in Chennai with Reasonable ###Packers and Movers Price Quotation. We Provide Household Shifting, Office Relocation, ✔✔✔ Local and Domestic Transportation Services, Affordable and Reliable Shifting Service Charges @ Packers And Movers Chennai


  11. تنسيق الحدائق المنزلية من الامور الممتعة وهي غالبا تتطلب فقط تنظيم وترتيب الفضاء بحيث تستغل كل فراغ في الحديقة وتمزج بين الالوان للحصول على منظر جميل من النباتات
    شركة تنسيق حدائق بجدة
    نحتاج إلى إبقاء الخزان الجديد في نفس الحالة لفترة طويلة من خلال تعقيم المياه في الخزان أولاً ، حيث أن الخزان الجديد خالٍ تمامًا من الرواسب والفطريات. مع إدخال الماء ، لا يوجد مجال لدخول الفيروسات إلى الخزان ، لذلك يجب توخي الحذر للتأكد من أن الماء معقم وحرص على إبقاء الخزان لأطول فترة ممكنة.
    أفضل شركة تنظيف خزانات بالطائف لتنظيف جميع انواع الخزانات بمهارة
    شركة تنظيف خزانات بالطائف
    نظافة وجمال منزلك خير دليل على نظافة الجدران حيث ينكشف بسرعة أكبر قدر من الأوساخ والغبار والأوساخ ، كما نقوم بتنظيف الجدران بالطلاء والمواد الحافظة للجدران وتنظيفها بكفاءة عالية. تستخدمين أفضل وأقوى وأسلم المنظفات لصحتك ، والتي تحتوي أيضًا على عطر ذكي يعزز جمال المكان. يبدأ التنظيف بغسل جميع أنواع الجدران سواء كانت دهانات أو دريوال أو جميع أنواع ورق الحائط.
    شركة تنظيف منازل بالطائف

  12. Your website, especially this blog page, has recently provided me with lots of useful information. Your articles have received numerous comments as well. Thanks for sharing. This is a very popular platform and it is a topic of discussion among people. This article can help you get more likes and popularity for your Instagram post if you want more likes and popularity. To learn more, read the whole profile Generate Fake Instagram Post

  13. เหตุผลที่ควรสมัครเดิมพันออนไลน์กับ Ufabet

    1. เว็บพนันออนไลน์ Ufabet เว็บตรง เป็นเว็บพนันที่ถูกกฎหมายจดทะเบียนจริงมีสำนักงานจริงในหลายประเทศ จึงทำให้คุณเชื่อถือบริการของที่นี่ได้

    2. บริการเกมพนันที่นี่มีให้ครบแน่นอน เดิมพันกีฬา เดิมพันคาสิโน และ ยังอัพเดทบริการเกมใหม่ ๆ ทันสมัยแปลกใหม่มากมาย เอาใจคอพนันชาวไทยตลอดทั้งปี ทุกบริการเล่นง่ายผ่านระบบออนไลน์ เป็นสมาชิกที่นี่ได้สิทธิประโยชน์อื่น ๆ ที่พร้อมให้สมาชิกเลือกได้

    3. มีพนักงานพร้อมดูแลสมาชิกมีตลอด 24 ชั่วโมง ติดต่อได้ง่าย บริการข้อมูลข่าวสารและสูตรการเดิมพันต่าง ๆ มากมายให้สมาชิกได้เล่นเดิมพันตลอดทั้งปี เล่นบริการเดิมพันทำเงินเลือกที่นี่ย้ำว่าเป็นบริการสุดพิเศษ ทำเงินได้ทำกำไรได้จริง

  14. เล่นเดิมพันได้ลื่นไหล ทำเงินได้จริง เกมใหม่มีตลอดเวลาแน่นอน การันตีเลยว่า Ufabet ทำให้คุณไม่พลาดที่จะทำเงินกับเกมพนันทันสมัย พนันออนไลน์ ทุกบริการที่คุณต้องการมีให้ที่นี่แน่นอน ย้ำว่าอย่าพลาดหากกำลังมองหาการเดิมพันออนไลน์ดี ๆ เชื่อถือได้จ่ายจริง แนะนำเลือกที่นี่ไม่พลาดแน่นอน ก่อนตัดสินใจเลือกอ่านคำแนะนำของเราได้และเหตผลที่เราอยากบอกคือ

  15. เว็บไซต์เดิมพันออนไลน์ที่ครบวงจรที่สุด ต้องยกนิ้วให้ SA Gaming เจ้าแห่งคาสิโนออนไลน์ดีที่สุด เล่นง่ายได้เงินจริง เว็บไซต์เดิมพันออนไลน์ ที่ครบวงจรที่สุด เกมเดิมพันออนไลน์ครบวงจร ตอบโจทย์ทุกความต้องการของผู้เล่น เพราพว่าเราได้รวบรวมเกมเดิมพันออนไลน์ทุกค่าย ทุกเกม ทุกเเขนงไว้ในเว็บไซต์เดียว เข้าถึงง่าย ใช้งานสะดวก เว็บเดียวจบครบทุกบริการ.

  16. Gutt Websäit : Zonahobisaya
    Gutt Websäit : Sinopsis Film Terbaru
    Gutt Websäit : Zonahobisaya
    Gutt Websäit : Zonahobisaya
    Gutt Websäit : Profil
    Gutt Websäit : Zonahobisaya
    Gutt Websäit : Zonahobisaya
    Gutt Websäit : Zonahobisaya

  17. I trully appretiate your work and tips given by you is helpful to me. I will share this information with my family & friends. This is a great website, keep the positive reviews coming. This is a great inspiring .do my assignment I am pretty much pleased with your good work. You put really very helpful information. I am looking to reading your next post. !!!!