// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MOJO_PUBLIC_C_SYSTEM_QUOTA_H_ #define MOJO_PUBLIC_C_SYSTEM_QUOTA_H_ #include #include "mojo/public/c/system/macros.h" #include "mojo/public/c/system/system_export.h" #include "mojo/public/c/system/types.h" // Flags passed to |MojoSetQuota| via |MojoSetQuotaOptions|. typedef uint32_t MojoSetQuotaFlags; // No flags. #define MOJO_SET_QUOTA_FLAG_NONE ((MojoSetQuotaFlags)0) // Options passed to |MojoSetQuota()|. struct MOJO_ALIGNAS(8) MojoSetQuotaOptions { // The size of this structure, used for versioning. uint32_t struct_size; // See |MojoSetQuotaFlags| above. MojoSetQuotaFlags flags; }; MOJO_STATIC_ASSERT(sizeof(MojoSetQuotaOptions) == 8, "MojoSetQuotaOptions has wrong size."); // Flags passed to |MojoQueryQuota| via |MojoQueryQuotaOptions|. typedef uint32_t MojoQueryQuotaFlags; // No flags. #define MOJO_QUERY_QUOTA_FLAG_NONE ((MojoQueryQuotaFlags)0) // Options passed to |MojoQueryQuota()|. struct MOJO_ALIGNAS(8) MojoQueryQuotaOptions { // The size of this structure, used for versioning. uint32_t struct_size; // See |MojoQueryQuotaFlags| above. MojoQueryQuotaFlags flags; }; MOJO_STATIC_ASSERT(sizeof(MojoQueryQuotaOptions) == 8, "MojoQueryQuotaOptions has wrong size."); // The maximum value any quota can be set to. Effectively means "no quota". #define MOJO_QUOTA_LIMIT_NONE ((uint64_t)0xffffffffffffffff) // An enumeration of different types of quotas that can be set on a handle. typedef uint32_t MojoQuotaType; // Limits the number of unread messages which can be queued on a message pipe // endpoint before raising a |MOJO_HANDLE_SIGNAL_QUOTA_EXCEEDED| signal on that // endpoint. May only be set on message pipe handles. #define MOJO_QUOTA_TYPE_RECEIVE_QUEUE_LENGTH ((MojoQuotaType)0) // Limits the total size (in bytes) of unread messages which can be queued on a // message pipe endpoint before raising a |MOJO_HANDLE_SIGNAL_QUOTA_EXCEEDED| // signal on that endpoint. May only be set on message pipe handles. #define MOJO_QUOTA_TYPE_RECEIVE_QUEUE_MEMORY_SIZE ((MojoQuotaType)1) #ifdef __cplusplus extern "C" { #endif // Sets a quota on a given handle which will cause that handle to raise the // |MOJO_HANDLE_SIGNAL_QUOTA_EXCEEDED| signal if the quota is exceeded. Signals // can be trapped using |MojoCreateTrap()| and related APIs (see trap.h). // // All quota limits on a handle default to |MOJO_QUOTA_LIMIT_NONE|, meaning that // the resource is unlimited. // // NOTE: A handle's quota is only enforced as long as the handle remains within // the process which set the quota. // // Parameters: // |handle|: The handle on which a quota should be set. // |type|: The type of quota to set. Certain types of quotas may only be set // on certain types of handles. See notes on individual quota type // definitions above for meaning and restrictions. // |limit|: The limiting value of the quota. The meaning of this is determined // by |type|. See notes on individual quota type definitions above. // |options|: Additional options; may be null. // // Returns: // |MOJO_RESULT_OK| if the quota was successfully set. // |MOJO_RESULT_INVALID_ARGUMENT| if |handle| is not a valid handle value, // |type| is not a known quota type, |options| is non-null but // |*options| is malformed, or the quota |type| cannot be set on |handle| // because the quota does not apply to that type of handle. MOJO_SYSTEM_EXPORT MojoResult MojoSetQuota(MojoHandle handle, MojoQuotaType type, uint64_t limit, const struct MojoSetQuotaOptions* options); // Queries a handle for information about a specific quota. // // Parameters: // |handle|: The handle to query. // |type|: The type of quota to query. // |limit|: Receives the quota's currently set limit if non-null. // |usage|: Receives the quota's current usage if non-null. // // Returns: // |MOJO_RESULT_OK| if the quota was successfully queried on |handle|. Upon // return, |*limit| contains the quota's current limit if |limit| is // non-null, and |*usage| contains the quota's current usage if |usage| is // non-null. // |MOJO_RESULT_INVALID_ARGUMENT| if |handle| is not a valid handle value or // quota |type| does not apply to the type of object referenced by // |handle|. MOJO_SYSTEM_EXPORT MojoResult MojoQueryQuota(MojoHandle handle, MojoQuotaType type, const struct MojoQueryQuotaOptions* options, uint64_t* limit, uint64_t* usage); #ifdef __cplusplus } // extern "C" #endif #endif // MOJO_PUBLIC_C_SYSTEM_QUOTA_H_