blob: 9e9df73ba31619fde7c77687a81050e0fdb61b33 [file] [log] [blame]
Elliott Hughescac7b9d2013-10-23 09:48:29 -07001/*
Elliott Hughes5905d6f2018-01-30 15:09:51 -08002 * Copyright (C) 2018 The Android Open Source Project
Elliott Hughescac7b9d2013-10-23 09:48:29 -07003 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
Elliott Hughes5905d6f2018-01-30 15:09:51 -080029#pragma once
Elliott Hughescac7b9d2013-10-23 09:48:29 -070030
Elliott Hughes215baed2023-07-17 17:15:01 -070031// Android's 32-bit ABI shipped with a sigset_t too small to include any
32// of the realtime signals, so we have both sigset_t and sigset64_t. Many
33// new system calls only accept a sigset64_t, so this helps paper over
34// the difference at zero cost to LP64 in most cases after the optimizer
35// removes the unnecessary temporary `ptr`.
36struct SigSetConverter {
37 public:
38 SigSetConverter(const sigset_t* s) : SigSetConverter(const_cast<sigset_t*>(s)) {}
39
40 SigSetConverter(sigset_t* s) {
41#if defined(__LP64__)
42 // sigset_t == sigset64_t on LP64.
43 ptr = s;
44#else
45 sigset64 = {};
46 if (s != nullptr) {
47 original_ptr = s;
48 sigset = *s;
49 ptr = &sigset64;
50 } else {
51 ptr = nullptr;
52 }
53#endif
54 }
55
56 void copy_out() {
57#if defined(__LP64__)
58 // We used the original pointer directly, so no copy needed.
59#else
60 *original_ptr = sigset;
61#endif
62 }
63
64 sigset64_t* ptr;
65
66 private:
67 [[maybe_unused]] sigset_t* original_ptr;
68 union {
69 sigset_t sigset;
70 sigset64_t sigset64;
71 };
Elliott Hughes5905d6f2018-01-30 15:09:51 -080072};