1*be691f3bSpatrick //===-- PosixSpawnResponsible.h ---------------------------------*- C++ -*-===// 2*be691f3bSpatrick // 3*be691f3bSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*be691f3bSpatrick // See https://llvm.org/LICENSE.txt for license information. 5*be691f3bSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*be691f3bSpatrick // 7*be691f3bSpatrick //===----------------------------------------------------------------------===// 8*be691f3bSpatrick 9*be691f3bSpatrick #ifndef LLDB_HOST_POSIXSPAWNRESPONSIBLE_H 10*be691f3bSpatrick #define LLDB_HOST_POSIXSPAWNRESPONSIBLE_H 11*be691f3bSpatrick 12*be691f3bSpatrick #include <spawn.h> 13*be691f3bSpatrick 14*be691f3bSpatrick #if __has_include(<responsibility.h>) 15*be691f3bSpatrick #include <dispatch/dispatch.h> 16*be691f3bSpatrick #include <dlfcn.h> 17*be691f3bSpatrick #include <responsibility.h> 18*be691f3bSpatrick 19*be691f3bSpatrick // Older SDKs have responsibility.h but not this particular function. Let's 20*be691f3bSpatrick // include the prototype here. 21*be691f3bSpatrick errno_t responsibility_spawnattrs_setdisclaim(posix_spawnattr_t *attrs, 22*be691f3bSpatrick bool disclaim); 23*be691f3bSpatrick 24*be691f3bSpatrick #endif 25*be691f3bSpatrick setup_posix_spawn_responsible_flag(posix_spawnattr_t * attr)26*be691f3bSpatrickstatic inline int setup_posix_spawn_responsible_flag(posix_spawnattr_t *attr) { 27*be691f3bSpatrick if (@available(macOS 10.14, *)) { 28*be691f3bSpatrick #if __has_include(<responsibility.h>) 29*be691f3bSpatrick static __typeof__(responsibility_spawnattrs_setdisclaim) 30*be691f3bSpatrick *responsibility_spawnattrs_setdisclaim_ptr; 31*be691f3bSpatrick static dispatch_once_t pred; 32*be691f3bSpatrick dispatch_once(&pred, ^{ 33*be691f3bSpatrick responsibility_spawnattrs_setdisclaim_ptr = 34*be691f3bSpatrick #ifdef __cplusplus 35*be691f3bSpatrick reinterpret_cast<__typeof__(&responsibility_spawnattrs_setdisclaim)> 36*be691f3bSpatrick #endif 37*be691f3bSpatrick (dlsym(RTLD_DEFAULT, "responsibility_spawnattrs_setdisclaim")); 38*be691f3bSpatrick }); 39*be691f3bSpatrick if (responsibility_spawnattrs_setdisclaim_ptr) 40*be691f3bSpatrick return responsibility_spawnattrs_setdisclaim_ptr(attr, true); 41*be691f3bSpatrick #endif 42*be691f3bSpatrick } 43*be691f3bSpatrick return 0; 44*be691f3bSpatrick } 45*be691f3bSpatrick 46*be691f3bSpatrick #endif // LLDB_HOST_POSIXSPAWNRESPONSIBLE_H 47