void
tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file);
+/**
+ * @brief Get a fd from the given enviroment variable.
+ * @details
+ * This function will dup the fd of the given enviroment variable. The Caller
+ * @b SHOULD close the fd.
+ * \n
+ * In DRM system, a drm-master-fd @b SHOULD be shared between TDM backend and
+ * TBM backend in display server side by using "TDM_DRM_MASTER_FD"
+ * and "TBM_DRM_MASTER_FD".
+ * @param[in] env The given enviroment variable
+ * @return fd if success. Otherwise, -1.
+ * @see #tdm_helper_set_fd()
+ */
+int tdm_helper_get_fd(const char *env);
+
+/**
+ * @brief Set the given fd to the give enviroment variable.
+ * @details
+ * In DRM system, a drm-master-fd @b SHOULD be shared between TDM backend and
+ * TBM backend in display server side by using "TDM_DRM_MASTER_FD"
+ * and "TBM_DRM_MASTER_FD".
+ * @param[in] env The given enviroment variable
+ * @param[in] fd The given fd
+ * @see #tdm_helper_get_fd()
+ */
+void tdm_helper_set_fd(const char *env, int fd);
+
#ifdef __cplusplus
}
#endif
#include "tdm.h"
#include "tdm_backend.h"
#include "tdm_private.h"
+#include "tdm_helper.h"
static tdm_private_layer *
_tdm_display_find_private_layer(tdm_private_output *private_output,
_tdm_display_destroy_private_display(private_display);
_tdm_display_unload_module(private_display);
+ tdm_helper_set_fd("TDM_DRM_MASTER_FD", -1);
+
pthread_mutex_unlock(&private_display->lock);
pthread_mutex_destroy(&private_display->lock);
TDM_INFO("dump %s", file);
}
+
+EXTERN int
+tdm_helper_get_fd(const char *env)
+{
+ const char *value;
+ int fd, newfd, flags, ret;
+
+ value = (const char*)getenv(env);
+ if (!value)
+ return -1;
+
+ ret = sscanf(value, "%d", &fd);
+ if (ret < 0) {
+ TDM_ERR("sscanf failed: %m");
+ return -1;
+ }
+
+ flags = fcntl(fd, F_GETFD);
+ if (flags == -1) {
+ TDM_ERR("fcntl failed: %m");
+ return -1;
+ }
+
+ newfd = dup(fd);
+ if (newfd < 0) {
+ TDM_ERR("dup failed: %m");
+ return -1;
+ }
+
+ TDM_INFO("%s: fd(%d) newfd(%d)", env, fd, newfd);
+
+ fcntl(newfd, F_SETFD, flags | FD_CLOEXEC);
+
+ return newfd;
+}
+
+EXTERN void
+tdm_helper_set_fd(const char *env, int fd)
+{
+ char buf[32];
+ int ret;
+
+ snprintf(buf, sizeof(buf), "%d", fd);
+
+ ret = setenv(env, (const char*)buf, 1);
+ if (ret) {
+ TDM_ERR("setenv failed: %m");
+ return;
+ }
+
+ if (fd >= 0)
+ TDM_INFO("%s: fd(%d)", env, fd);
+}