diff --git a/.travis.yml b/.travis.yml
index c11d9fa..1748b52 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -15,6 +15,8 @@ rvm:
 
 matrix:
   allow_failures:
+    - rvm: 2.2
+      if: os = osx
     - rvm: ruby-head
     - rvm: jruby-head
     - rvm: truffleruby
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 02e9f6d..d03f3c0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,12 @@
-## Master - unreleased
+## HEAD (unreleased)
+
+## 0.2.7
+
+- Native (faster) support for returning memory from different PIDs on mac (https://github.com/schneems/get_process_mem/pull/42)
+
+## 0.2.6
+
+- Support returning memory from different PIDs on mac (https://github.com/schneems/get_process_mem/pull/41)
 
 ## 0.2.5
 
diff --git a/debian/changelog b/debian/changelog
index 810d2df..1bd1f3b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-ruby-get-process-mem (0.2.5-2) UNRELEASED; urgency=medium
+ruby-get-process-mem (0.2.7-1) UNRELEASED; urgency=medium
 
   * Set field Upstream-Contact in debian/copyright.
   * Set upstream metadata fields: Bug-Submit.
@@ -6,8 +6,9 @@ ruby-get-process-mem (0.2.5-2) UNRELEASED; urgency=medium
     (already present in machine-readable debian/copyright).
   * Bump debhelper from old 12 to 13.
   * Update standards version to 4.5.1, no changes needed.
+  * New upstream release.
 
- -- Debian Janitor <janitor@jelmer.uk>  Sun, 23 Feb 2020 14:52:54 +0000
+ -- Debian Janitor <janitor@jelmer.uk>  Sun, 22 May 2022 02:55:51 -0000
 
 ruby-get-process-mem (0.2.5-1) unstable; urgency=medium
 
diff --git a/debian/patches/bundler b/debian/patches/bundler
index dceab1b..fe0807f 100644
--- a/debian/patches/bundler
+++ b/debian/patches/bundler
@@ -5,15 +5,17 @@ Forwarded: not-needed
 Last-Update: 2015-06-14
 ---
 This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
---- a/test/test_helper.rb
-+++ b/test/test_helper.rb
+Index: ruby-get-process-mem/test/test_helper.rb
+===================================================================
+--- ruby-get-process-mem.orig/test/test_helper.rb
++++ ruby-get-process-mem/test/test_helper.rb
 @@ -1,5 +1,3 @@
 -Bundler.require
 -
  require 'get_process_mem'
  require 'test/unit'
  
-@@ -7,4 +5,4 @@
+@@ -7,4 +5,4 @@ def fixture_path(name = nil)
    path = Pathname.new(File.expand_path("../fixtures", __FILE__))
    return path.join(name) if name
    path
diff --git a/lib/get_process_mem.rb b/lib/get_process_mem.rb
index e781209..67aaf25 100644
--- a/lib/get_process_mem.rb
+++ b/lib/get_process_mem.rb
@@ -119,6 +119,8 @@ class GetProcessMem
   end
 
   def darwin_memory
-    Darwin.resident_size
+    Darwin.resident_size(pid)
+  rescue Errno::EPERM
+    nil
   end
 end
diff --git a/lib/get_process_mem/darwin.rb b/lib/get_process_mem/darwin.rb
index 2fd98cb..111f734 100644
--- a/lib/get_process_mem/darwin.rb
+++ b/lib/get_process_mem/darwin.rb
@@ -3,49 +3,59 @@ require 'ffi'
 class GetProcessMem
   class Darwin
     extend FFI::Library
-    ffi_lib 'c'
-    attach_function :mach_task_self, [], :__darwin_mach_port_t
-    attach_function :task_info,
-                    [
-                      :__darwin_mach_port_t,
-                      :int,     # return selector
-                      :pointer, #pointer to task info
-                      :pointer, #pointer to int (size of structure / bytes filled out)
-                    ],
-                    :int
+    ffi_lib 'proc'
 
-    class IntPtr < FFI::Struct
-      layout :value, :int
-    end
 
     class TaskInfo < FFI::Struct
-      layout  :suspend_count, :int32,
-              :virtual_size, :uint64,
-              :resident_size, :uint64,
-              :user_time, :uint64,
-              :system_time, :uint64,
-              :policy, :int32
+      layout :pti_virtual_size, :uint64,
+             :pti_resident_size, :uint64,
+             :pti_total_user, :uint64,
+             :pti_total_system, :uint64,
+             :pti_threads_user, :uint64,
+             :pti_threads_system, :uint64,
+             :pti_policy, :int32,
+             :pti_faults, :int32,
+             :pti_pageins, :int32,
+             :pti_cow_faults, :int32,
+             :pti_messages_sent, :int32,
+             :pti_messages_received, :int32,
+             :pti_syscalls_mach, :int32,
+             :pti_syscalls_unix, :int32,
+             :pti_csw, :int32,
+             :pti_threadnum, :int32,
+             :pti_numrunning, :int32,
+             :pti_priority, :int32
+
     end
 
-    MACH_TASK_BASIC_INFO = 20
-    MACH_TASK_BASIC_INFO_COUNT = TaskInfo.size / FFI.type_size(:uint)
+
+    attach_function :proc_pidinfo,
+                    [
+                      :int, #pid
+                      :int, # flavour
+                      :uint64, #arg, not needed for this selector
+                      TaskInfo.by_ref, #output buffer
+                      :int, #size of buffer
+                    ],
+                    :int
+
+
+    PROC_PIDTASKINFO = 4 #from sys/proc_info.h
 
     class << self
-      def resident_size
-        mach_task_info[:resident_size]
+      def resident_size(pid)
+        get_proc_pidinfo(pid)[:pti_resident_size]
       end
 
       private
 
-      def mach_task_info
+      def get_proc_pidinfo(pid)
         data = TaskInfo.new
-        out_count = IntPtr.new
-        out_count[:value] = MACH_TASK_BASIC_INFO_COUNT
-        result = task_info(mach_task_self, MACH_TASK_BASIC_INFO, data, out_count)
-        if result == 0
+        result = proc_pidinfo(pid, PROC_PIDTASKINFO, 0, data, TaskInfo.size)
+        if result == TaskInfo.size
           data
         else
-          raise "task_info returned #{result}"
+          raise SystemCallError.new("proc_pidinfo returned #{result}", FFI.errno);
         end
       end
     end
diff --git a/lib/get_process_mem/version.rb b/lib/get_process_mem/version.rb
index 018d81f..91be889 100644
--- a/lib/get_process_mem/version.rb
+++ b/lib/get_process_mem/version.rb
@@ -1,3 +1,3 @@
 class GetProcessMem
-  VERSION = "0.2.5"
+  VERSION = "0.2.7"
 end
diff --git a/test/get_process_mem_test.rb b/test/get_process_mem_test.rb
index 8f39297..f7b831f 100644
--- a/test/get_process_mem_test.rb
+++ b/test/get_process_mem_test.rb
@@ -1,11 +1,20 @@
 require 'test_helper'
 
 class GetProcessMemTest < Test::Unit::TestCase
-
   def setup
     @mem = GetProcessMem.new
   end
 
+  def test_different_pid_returns_different_memory
+    pid = Process.spawn("tail -f Gemfile")
+
+    other_mem = GetProcessMem.new(pid)
+    assert @mem.kb > other_mem.kb
+  ensure
+    Process.kill('TERM', pid) if pid
+    Process.wait(pid) if pid
+  end
+
   def test_seems_to_work
     assert @mem.kb    > 0
     assert @mem.mb    > 0