sd_device_ref, sd_device_unref, sd_device_unrefp — Create or destroy references to a device object
#include <systemd/sd-device.h>
| sd_device* sd_device_ref( | sd_device *device ); | 
| sd_device* sd_device_unref( | sd_device *device ); | 
| void sd_device_unrefp( | sd_device **device ); | 
sd_device_ref() increases the internal reference counter of
    device by one.
sd_device_unref() decreases the internal reference counter of
    device by one. Once the reference count has dropped to zero,
    device is destroyed and cannot be used anymore, so further calls to
    sd_device_ref() or sd_device_unref() are illegal.
sd_device_unrefp() is similar to sd_device_unref() but
    takes a pointer to a pointer to an sd_device object. This call is useful in conjunction with
    GCC's and LLVM's Clean-up
    Variable Attribute. Note that this function is defined as an inline function. Use a declaration
    like the following, in order to allocate a device object that is freed automatically as the code block is
    left:
{
  __attribute__((cleanup(sd_device_unrefp))) sd_device *device = NULL;
  int r;
  …
  r = sd_device_new_from_syspath(&device, "…");
  if (r < 0) {
    errno = -r;
    fprintf(stderr, "Failed to allocate device: %m\n");
  }
  …
}sd_device_ref() and sd_device_unref() execute no
    operation if the argument is NULL. sd_device_unrefp() will
    first dereference its argument, which must not be NULL, and will execute no
    operation if that is NULL.
sd_device_ref() always returns the argument, and
    sd_device_unref() always returns NULL.