| // Copyright 2019 The Fuchsia Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 | library zx; | 
 |  | 
 | type ProfileInfoType = strict enum { | 
 |     ZX_PROFILE_INFO_SCHEDULER = 1; | 
 | }; | 
 |  | 
 | type ProfileScheduler = strict union { | 
 |     1: priority int32; | 
 |     2: boost uint32; | 
 |     3: deboost uint32; | 
 |     4: quantum uint32; | 
 | }; | 
 |  | 
 | const ZX_PRIORITY_LOWEST int32 = 0; | 
 | const ZX_PRIORITY_LOW int32 = 8; | 
 | const ZX_PRIORITY_DEFAULT int32 = 16; | 
 | const ZX_PRIORITY_HIGH int32 = 24; | 
 | const ZX_PRIORITY_HIGHEST int32 = 31; | 
 |  | 
 | type ProfileInfoData = strict union { | 
 |     1: scheduler ProfileScheduler; | 
 | }; | 
 |  | 
 | type ProfileInfo = struct { | 
 |     type ProfileInfoType; | 
 |     // TODO(scottmg): This needs to be presented as an unnamed union in C, and | 
 |     // ProfileInfoData doesn't really need a name. Not sure if the semantics of | 
 |     // fidl unions make sense here. | 
 |     unnamed ProfileInfoData; | 
 | }; | 
 |  | 
 | @transport("Syscall") | 
 | closed protocol Profile { | 
 |     /// ## Summary | 
 |     /// | 
 |     /// Create a scheduler profile. | 
 |     /// | 
 |     /// ## Declaration | 
 |     /// | 
 |     /// ```c | 
 |     /// #include <zircon/syscalls.h> | 
 |     /// | 
 |     /// zx_status_t zx_profile_create(zx_handle_t profile_rsrc, | 
 |     ///                               uint32_t options, | 
 |     ///                               const zx_profile_info_t* profile, | 
 |     ///                               zx_handle_t* out); | 
 |     /// ``` | 
 |     /// | 
 |     /// ## Description | 
 |     /// | 
 |     /// `zx_profile_create()` creates a new [profile](/docs/reference/kernel_objects/profile.md) object. | 
 |     /// | 
 |     /// The parameter *profile* specifies the settings in the profile, which in turn | 
 |     /// will be applied to threads when [`zx_object_set_profile()`] is called. The | 
 |     /// fields of *profile* are shown below. *options* must be zero. | 
 |     /// | 
 |     /// ```c | 
 |     /// #define ZX_PROFILE_INFO_FLAG_PRIORITY (1 << 0) | 
 |     /// #define ZX_PROFILE_INFO_FLAG_CPU_MASK (1 << 1) | 
 |     /// #define ZX_PROFILE_INFO_FLAG_DEADLINE (1 << 2) | 
 |     /// #define ZX_PROFILE_INFO_FLAG_NO_INHERIT (1 << 3) | 
 |     /// #define ZX_PROFILE_INFO_FLAG_MEMORY_PRIORITY (1 << 4) | 
 |     /// | 
 |     /// typedef struct zx_profile_info { | 
 |     ///   // A bitmask of ZX_PROFILE_INFO_FLAG_* values. Controls overall profile | 
 |     ///   // options as well as determining which other fields below have been specified. | 
 |     ///   // Other fields are considered unset. | 
 |     ///   uint32_t flags; | 
 |     /// | 
 |     ///   uint8_t padding1[4]; | 
 |     /// | 
 |     ///   union { | 
 |     ///     struct { | 
 |     ///       // Scheduling priority. |flags| must have ZX_PROFILE_INFO_FLAG_PRIORITY or | 
 |     ///       // ZX_PROFILE_INFO_FLAG_MEMORY_PRIORITY set. | 
 |     ///       int32_t priority; | 
 |     ///       uint8_t padding2[20]; | 
 |     ///     }; | 
 |     /// | 
 |     ///     // Scheduling deadline. |flags| must have ZX_PROFILE_INFO_FLAG_DEADLINE set. | 
 |     ///     zx_sched_deadline_params_t deadline_params; | 
 |     ///   }; | 
 |     /// | 
 |     ///   // CPUs that threads may be scheduled on. |flags| must have | 
 |     ///   // ZX_PROFILE_INFO_FLAG_CPU_MASK set. | 
 |     ///   zx_cpu_set_t cpu_affinity_mask; | 
 |     /// } zx_profile_info_t; | 
 |     /// ``` | 
 |     /// | 
 |     /// The `flags` field controls overall profile options in addition to specifying | 
 |     /// which fields in the `zx_profile_info_t` structure contain valid values. Values | 
 |     /// in fields without a corresponding `flag` bit set will be ignored. This allows | 
 |     /// fields with values of `0` and unset fields to be distinguished, even if | 
 |     /// additional fields are added in future. | 
 |     /// | 
 |     /// `ZX_PROFILE_INFO_FLAG_PRIORITY` and `ZX_PROFILE_INFO_FLAG_DEADLINE` specify the | 
 |     /// `scheduling discipline` for the profile, either "fair scheduling" (for | 
 |     /// `PRIORITY`) or "deadline scheduling" (for `DEADLINE`.  No more than one of these | 
 |     /// disciplines may be selected at the same time. | 
 |     /// | 
 |     /// `ZX_PROFILE_INFO_FLAG_MEMORY_PRIORITY` allows for creating a profile that can be applied to | 
 |     /// VMARs and is incompatible with any flags related scheduling. When selecting a memory | 
 |     /// priority only `ZX_PRIORITY_DEFAULT` and `ZX_PRIORITY_HIGH` currently have meaning, with the | 
 |     /// former being the default all VMARs initially have, and the latter indicating that all kernel | 
 |     /// initiated reclamation on objects the profile is applied to should be avoided. | 
 |     /// | 
 |     /// By default, profiles participate in profile inheritance when assigned to a | 
 |     /// thread which blocks in a futex with an assigned owner (see `zx_futex_wait()`). | 
 |     /// Profiles created with the `ZX_PROFILE_INFO_FLAG_NO_INHERIT` do not.  When | 
 |     /// threads assigned with such a profile block in a futex with an owner, the | 
 |     /// owner of the futex receives no direct profile pressure from the blocking | 
 |     /// thread (however, they may receive pressure from a different thread | 
 |     /// blocked behind the blocking thread). | 
 |     /// | 
 |     /// Deadline profiles must always be inheritable.  Attempts to create a | 
 |     /// non-inheritable deadline profile will fail with ZX_ERR_INVALID_ARGS. | 
 |     /// | 
 |     /// | 
 |     /// Upon success a handle for the new profile is returned. | 
 |     /// | 
 |     /// ## Rights | 
 |     /// | 
 |     /// *profile_rsrc* must have resource kind `ZX_RESOURCE_KIND_SYSTEM` with base | 
 |     /// `ZX_RSRC_SYSTEM_PROFILE_BASE`. | 
 |     /// | 
 |     /// Caller job policy must allow `ZX_POL_NEW_PROFILE`. | 
 |     /// | 
 |     /// ## Return value | 
 |     /// | 
 |     /// Returns `ZX_OK` and a handle to the new profile (via *out*) on success. In the | 
 |     /// event of failure, a negative error value is returned. | 
 |     /// | 
 |     /// ## Errors | 
 |     /// | 
 |     /// `ZX_ERR_BAD_HANDLE`  *profile_rsrc* is not a valid handle. | 
 |     /// | 
 |     /// `ZX_ERR_ACCESS_DENIED`  *profile_rsrc* is not the profile resource. | 
 |     /// | 
 |     /// `ZX_ERR_INVALID_ARGS`  One or more of the arguments provided were invalid: | 
 |     /// | 
 |     ///   * *profile* or *out* was an invalid pointer | 
 |     ///   * *flags* contains an unknown option | 
 |     ///   * *flags* either failed to specify a scheduling discipline, a cpu affinity mask, or a | 
 |     ///             memory priority. | 
 |     ///   * *flags* specified more than one scheduling discipline at once. | 
 |     ///   * *flags* specified the scheduling discipline as deadline, but the profile | 
 |     ///             was also marked as "no inherit". | 
 |     ///   * *flags* specified a scheduling discipline and a memory priority. | 
 |     ///   * *options* was not zero | 
 |     ///   * *priority* was an invalid priority | 
 |     /// | 
 |     /// `ZX_ERR_NO_MEMORY`  Failure due to lack of memory. | 
 |     /// | 
 |     /// ## See also | 
 |     /// | 
 |     ///  - [`zx_object_set_profile()`] | 
 |     ///  - [`zx_futex_wait()`] | 
 |     /// | 
 |     /// [`zx_object_set_profile()`]: object_set_profile.md | 
 |     /// [`zx_futex_wait()`]: futex_wait.md | 
 |     strict Create(resource struct { | 
 |         profile_rsrc Handle:RESOURCE; | 
 |         options uint32; | 
 |         profile ProfileInfo; | 
 |     }) -> (resource struct { | 
 |         out Handle:PROFILE; | 
 |     }) error Status; | 
 | }; |