Commit | Line | Data |
---|---|---|
3fa91327 DG |
1 | /* |
2 | * Copyright (C) 2011 - David Goulet <dgoulet@efficios.com> | |
3 | * | |
d14d33bf AM |
4 | * This program is free software; you can redistribute it and/or modify |
5 | * it under the terms of the GNU General Public License, version 2 only, | |
6 | * as published by the Free Software Foundation. | |
3fa91327 DG |
7 | * |
8 | * This program is distributed in the hope that it will be useful, but WITHOUT | |
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
11 | * more details. | |
12 | * | |
d14d33bf AM |
13 | * You should have received a copy of the GNU General Public License along |
14 | * with this program; if not, write to the Free Software Foundation, Inc., | |
15 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
3fa91327 DG |
16 | */ |
17 | ||
18 | #ifndef _COMPAT_CLONE_H | |
19 | #define _COMPAT_CLONE_H | |
20 | ||
21 | #ifdef __linux__ | |
22 | ||
23 | #include <sched.h> | |
24 | ||
89831a74 | 25 | static inline |
45aad3a7 | 26 | pid_t lttng_clone_files(int (*fn)(void *), void *child_stack, void *arg) |
89831a74 MD |
27 | { |
28 | return clone(fn, child_stack, CLONE_FILES | SIGCHLD, arg); | |
29 | } | |
30 | ||
7657ae75 | 31 | #elif defined(__FreeBSD__) |
3fa91327 DG |
32 | |
33 | #include <unistd.h> | |
34 | ||
89831a74 | 35 | static inline |
45aad3a7 | 36 | pid_t lttng_clone_files(int (*fn)(void *), void *child_stack, void *arg) |
3fa91327 | 37 | { |
45aad3a7 MD |
38 | pid_t pid; |
39 | ||
40 | pid = rfork(RFPROC | RFTHREAD); | |
41 | if (pid == 0) { | |
42 | /* child */ | |
43 | int ret; | |
44 | ||
45 | ret = fn(arg); | |
46 | exit(ret); | |
47 | } else if (pid > 0) { | |
48 | /* parent */ | |
49 | /* | |
50 | * Just return, the caller will wait for the child. | |
51 | */ | |
52 | return pid; | |
53 | } else { | |
54 | /* Error */ | |
55 | return pid; | |
56 | } | |
3fa91327 DG |
57 | } |
58 | ||
59 | #else | |
7657ae75 | 60 | #error "Please add support for your OS." |
3fa91327 DG |
61 | #endif /* __linux__ , __FreeBSD__ */ |
62 | ||
63 | #endif /* _COMPAT_CLONE_H */ |