From 83f9bb7fb160c240d76b22bd049bb9ab57a37f55 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Fri, 25 Jan 2013 12:24:57 -0500 Subject: [PATCH] Implement lttng_iterate_fd wrapper Signed-off-by: Mathieu Desnoyers --- wrapper/fdtable.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++ wrapper/fdtable.h | 44 ++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 wrapper/fdtable.c create mode 100644 wrapper/fdtable.h diff --git a/wrapper/fdtable.c b/wrapper/fdtable.c new file mode 100644 index 00000000..a44beb55 --- /dev/null +++ b/wrapper/fdtable.c @@ -0,0 +1,57 @@ +/* + * wrapper/fdtable.c + * + * Copyright (C) 2013 Mathieu Desnoyers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "fdtable.h" + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)) + +/* + * Reimplementation of iterate_fd() for kernels between 2.6.32 and 3.6 + * (inclusive). + */ +int lttng_iterate_fd(struct files_struct *files, + unsigned int first, + int (*cb)(const void *, struct file *, unsigned int), + const void *ctx) +{ + struct fdtable *fdt; + struct file *filp; + unsigned int i; + int res = 0; + + if (!files) + return 0; + spin_lock(&files->file_lock); + fdt = files_fdtable(files); + for (i = 0; i < fdt->max_fds; i++) { + filp = fcheck_files(files, i); + if (!filp) + continue; + res = cb(ctx, filp, i); + if (res) + break; + } + spin_unlock(&files->file_lock); + return res; +} + +#endif diff --git a/wrapper/fdtable.h b/wrapper/fdtable.h new file mode 100644 index 00000000..7e74290e --- /dev/null +++ b/wrapper/fdtable.h @@ -0,0 +1,44 @@ +#ifndef _LTTNG_WRAPPER_FDTABLE_H +#define _LTTNG_WRAPPER_FDTABLE_H + +/* + * wrapper/fdtable.h + * + * Copyright (C) 2013 Mathieu Desnoyers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)) + +int lttng_iterate_fd(struct files_struct *files, + unsigned int first, + int (*cb)(const void *, struct file *, unsigned int), + const void *ctx); + +#else + +/* + * iterate_fd() appeared at commit + * c3c073f808b22dfae15ef8412b6f7b998644139a in the Linux kernel (first + * released kernel: v3.7). + */ +#define lttng_iterate_fd iterate_fd + +#endif +#endif /* _LTTNG_WRAPPER_FDTABLE_H */ -- 2.34.1