#!ruby # -*- mode: ruby; coding: utf-8 -*- # Last updated: <2022/08/17 02:20:57 +0900> # # DL, fiddle sample. use mutex. # Support Ruby 1.9.3 only # # Windows10 x64 21H2 + Ruby 1.9.3 p551 i386-mingw32 require "dl" require "fiddle" include Fiddle libc = DL.dlopen("kernel32.dll") create_mutex = Fiddle::Function.new(libc["CreateMutex"], [TYPE_LONG, TYPE_LONG, TYPE_VOIDP], TYPE_LONG) release_mutex = Fiddle::Function.new(libc["ReleaseMutex"], [TYPE_LONG], TYPE_LONG) close_handle = Fiddle::Function.new(libc["CloseHandle"], [TYPE_LONG], TYPE_LONG) get_last_error = Fiddle::Function.new(libc["GetLastError"], [], TYPE_LONG) mutex_name = "rubydlfiddlemutexsample" ERROR_ALREADY_EXISTS = 183 mutex = create_mutex.call(0, 1, mutex_name) # err = Fiddle::win32_last_error err = get_last_error.call() puts "Mutex : #{mutex}" puts "GetLastError : #{err}" if mutex == 0 or err == ERROR_ALREADY_EXISTS puts "already exists" exit else 10.times do |i| puts i sleep 1 end end if mutex != 0 release_mutex.call(mutex) close_handle.call(mutex) end