diff options
author | Simon Zeni <simon@bl4ckb0ne.ca> | 2021-04-29 12:01:28 -0400 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-05-05 10:40:21 +0200 |
commit | 2c90e0f521b2bb57d00e5a374b0eff99f3a2d744 (patch) | |
tree | a70a938e0431285f040b21bcf7e987dedbccb7ca | |
parent | d0c1f0c0b6370a0462fcb30d041e37f22fe33076 (diff) |
render/gbm_allocator: duplicate drm fd during creation process
-rw-r--r-- | include/render/gbm_allocator.h | 2 | ||||
-rw-r--r-- | render/allocator.c | 6 | ||||
-rw-r--r-- | render/gbm_allocator.c | 8 |
3 files changed, 9 insertions, 7 deletions
diff --git a/include/render/gbm_allocator.h b/include/render/gbm_allocator.h index b4f40039..df6b5e39 100644 --- a/include/render/gbm_allocator.h +++ b/include/render/gbm_allocator.h @@ -26,7 +26,7 @@ struct wlr_gbm_allocator { /** * Creates a new GBM allocator from a DRM FD. * - * Takes ownership over the FD. + * Does not take ownership over the FD. */ struct wlr_allocator *wlr_gbm_allocator_create(int drm_fd); diff --git a/render/allocator.c b/render/allocator.c index 46d7b2de..6dd8592b 100644 --- a/render/allocator.c +++ b/render/allocator.c @@ -1,6 +1,5 @@ #define _POSIX_C_SOURCE 200809L #include <assert.h> -#include <fcntl.h> #include <stdlib.h> #include <wlr/util/log.h> #include <xf86drm.h> @@ -29,10 +28,7 @@ struct wlr_allocator *allocator_autocreate_with_drm_fd( if ((backend_caps & gbm_caps) && (renderer_caps & gbm_caps) && drm_fd != -1) { wlr_log(WLR_DEBUG, "Trying to create gbm allocator"); - int fd = fcntl(drm_fd, F_DUPFD_CLOEXEC, 0); - if (fd < 0) { - wlr_log(WLR_ERROR, "fcntl(F_DUPFD_CLOEXEC) failed"); - } else if ((alloc = wlr_gbm_allocator_create(fd)) != NULL) { + if ((alloc = wlr_gbm_allocator_create(drm_fd)) != NULL) { return alloc; } wlr_log(WLR_DEBUG, "Failed to create gbm allocator"); diff --git a/render/gbm_allocator.c b/render/gbm_allocator.c index 33fbf954..4006b66d 100644 --- a/render/gbm_allocator.c +++ b/render/gbm_allocator.c @@ -159,7 +159,13 @@ static struct wlr_gbm_allocator *get_gbm_alloc_from_alloc( return (struct wlr_gbm_allocator *)alloc; } -struct wlr_allocator *wlr_gbm_allocator_create(int fd) { +struct wlr_allocator *wlr_gbm_allocator_create(int drm_fd) { + int fd = fcntl(drm_fd, F_DUPFD_CLOEXEC, 0); + if (fd < 0) { + wlr_log(WLR_ERROR, "fcntl(F_DUPFD_CLOEXEC) failed"); + return NULL; + } + uint64_t cap; if (drmGetCap(fd, DRM_CAP_PRIME, &cap) || !(cap & DRM_PRIME_CAP_EXPORT)) { |