X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcommon%2Fcompat%2Fclone.h;h=c3605080e8eac4ad38ec96557bbae96b77da4277;hb=45aad3a7fb17edf1aa382bc0a7f561758089d121;hp=45eb37982c225c9551fe10b3f3f8ba909092a8e4;hpb=3fa913274cd98e148113a27747ae755a15b3fc5b;p=lttng-tools.git diff --git a/src/common/compat/clone.h b/src/common/compat/clone.h index 45eb37982..c3605080e 100644 --- a/src/common/compat/clone.h +++ b/src/common/compat/clone.h @@ -22,23 +22,42 @@ #include -#elif __FreeBSD__ - -#include +static inline +pid_t lttng_clone_files(int (*fn)(void *), void *child_stack, void *arg) +{ + return clone(fn, child_stack, CLONE_FILES | SIGCHLD, arg); +} -#define CLONE_FILES 0 +#elif defined(__FreeBSD__) -#define clone(fct_ptr, child_stack, flags, arg, args...) \ - compat_clone(fct_ptr, child_stack, flags, arg) +#include -int compat_clone(int (*fn)(void *), void *child_stack, int flags, - void *arg) +static inline +pid_t lttng_clone_files(int (*fn)(void *), void *child_stack, void *arg) { - return -ENOSYS; + pid_t pid; + + pid = rfork(RFPROC | RFTHREAD); + if (pid == 0) { + /* child */ + int ret; + + ret = fn(arg); + exit(ret); + } else if (pid > 0) { + /* parent */ + /* + * Just return, the caller will wait for the child. + */ + return pid; + } else { + /* Error */ + return pid; + } } #else -#error "Please add support for your OS into compat/clone.h." +#error "Please add support for your OS." #endif /* __linux__ , __FreeBSD__ */ #endif /* _COMPAT_CLONE_H */