Module: ProcessShared::PSem

Extended by:
FFI::Library, DefineSingletonMethod
Included in:
AbstractSemaphore
Defined in:
lib/process_shared.rb,
lib/process_shared/psem.rb

Defined Under Namespace

Classes: Error

Class Method Summary collapse

Methods included from DefineSingletonMethod

define_singleton_method

Class Method Details

.psem_error_check(*syms) ⇒ Object

Replace methods in ‘syms` with error checking wrappers that invoke the original psem method and raise an appropriate error.

The last argument is assumed to be a pointer to a pointer where either a psem error or NULL will be stored.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/process_shared/psem.rb', line 29

def psem_error_check(*syms)
  syms.each do |sym|
    method = self.method(sym)

    block = lambda do |*args|
      if method.call(*args) < 0
        errp = args[-1]
        unless errp.nil?
          begin
            err = Error.new(errp.read_pointer)
            errp.write_pointer(nil)
            if err[:source] == PSem.e_source_system
              raise SystemCallError.new("error in #{sym}", err[:errno])
            else
              raise "error in #{sym}: #{err.get_integer(1)}"
            end
          ensure
            psem_error_free(err)
          end
        end
      end
    end

    define_method(sym, &block)
    define_singleton_method(sym, &block)
  end
end