Line data Source code
1 : /* posix-thread.c - GPGRT thread functions for POSIX systems
2 : Copyright (C) 2014 g10 Code GmbH
3 :
4 : This file is part of libgpg-error.
5 :
6 : libgpg-error is free software; you can redistribute it and/or
7 : modify it under the terms of the GNU Lesser General Public License
8 : as published by the Free Software Foundation; either version 2.1 of
9 : the License, or (at your option) any later version.
10 :
11 : libgpg-error is distributed in the hope that it will be useful, but
12 : WITHOUT ANY WARRANTY; without even the implied warranty of
13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : Lesser General Public License for more details.
15 :
16 : You should have received a copy of the GNU Lesser General Public
17 : License along with this program; if not, see <https://www.gnu.org/licenses/>.
18 : */
19 :
20 : #if HAVE_CONFIG_H
21 : #include <config.h>
22 : #endif
23 :
24 : #ifdef HAVE_W32_SYSTEM
25 : # error This module may not be build for Windows.
26 : #endif
27 :
28 : #include <stdlib.h>
29 : #include <stdio.h>
30 : #include <string.h>
31 : #include <errno.h>
32 : #include <unistd.h> /* Get posix option macros. */
33 :
34 : #if USE_POSIX_THREADS
35 : # ifdef _POSIX_PRIORITY_SCHEDULING
36 : # include <sched.h>
37 : # endif
38 : #elif USE_SOLARIS_THREADS
39 : # include <thread.h>
40 : #endif
41 :
42 : #include "gpg-error.h"
43 :
44 : #include "thread.h"
45 :
46 : /*
47 : * Functions called before and after blocking syscalls.
48 : * gpgrt_set_syscall_clamp is used to set them.
49 : */
50 : static void (*pre_syscall_func)(void);
51 : static void (*post_syscall_func)(void);
52 :
53 :
54 : /* Helper to set the clamp functions. This is called as a helper from
55 : * _gpgrt_set_syscall_clamp to keep the function pointers local. */
56 : void
57 6 : _gpgrt_thread_set_syscall_clamp (void (*pre)(void), void (*post)(void))
58 : {
59 6 : pre_syscall_func = pre;
60 6 : post_syscall_func = post;
61 6 : }
62 :
63 :
64 :
65 : gpg_err_code_t
66 2423 : _gpgrt_yield (void)
67 : {
68 : #if USE_POSIX_THREADS
69 : # ifdef _POSIX_PRIORITY_SCHEDULING
70 2423 : if (pre_syscall_func)
71 0 : pre_syscall_func ();
72 2423 : sched_yield ();
73 2421 : if (post_syscall_func)
74 0 : post_syscall_func ();
75 : # else
76 : return GPG_ERR_NOT_SUPPORTED;
77 : # endif
78 : #elif USE_SOLARIS_THREADS
79 : if (pre_syscall_func)
80 : pre_syscall_func ();
81 : thr_yield ();
82 : if (post_syscall_func)
83 : post_syscall_func ();
84 : #else
85 : return GPG_ERR_NOT_SUPPORTED;
86 : #endif
87 :
88 2421 : return 0;
89 : }
|