let mutex_create =
  ref (fun () ->
         let r = ref false in

         let try_lock () =
           if !r then begin
             false
           end else begin
             r := true;
             true
           end
         in

         let lock () =
           if not (try_lock ()) then
             raise Lock_failure
         in

         let unlock () =
           r := false
         in

         {
           lock = lock;
           try_lock = try_lock;
           unlock = unlock;
         })