blob: 4e17cbe90fffbc6eb8b3d80c92c55fca1045309b [file] [log] [blame]
/*
* Copyright (c) 2019-2021 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef PAS_SCAVENGER_H
#define PAS_SCAVENGER_H
#include "pas_utils.h"
#include <sys/qos.h>
PAS_BEGIN_EXTERN_C;
enum pas_scavenger_state {
pas_scavenger_state_no_thread,
pas_scavenger_state_polling,
pas_scavenger_state_deep_sleep
};
typedef enum pas_scavenger_state pas_scavenger_state;
PAS_END_EXTERN_C;
#include <pthread.h>
PAS_BEGIN_EXTERN_C;
struct pas_scavenger_data;
typedef struct pas_scavenger_data pas_scavenger_data;
/* Holds data that needs to be initialized somehow. */
struct pas_scavenger_data {
pthread_mutex_t lock;
pthread_cond_t cond;
};
/* This is available extern for testing and debugging only. */
PAS_API extern bool pas_scavenger_is_enabled;
PAS_API extern bool pas_scavenger_eligibility_notification_has_been_deferred;
PAS_API extern pas_scavenger_state pas_scavenger_current_state;
PAS_API extern unsigned pas_scavenger_should_suspend_count;
PAS_API extern pas_scavenger_data* pas_scavenger_data_instance;
/* It's generally not a good idea to mess with this setting, but you an do, at any time. */
PAS_API extern double pas_scavenger_deep_sleep_timeout_in_milliseconds; /* How long to sleep
before shutting the
thread down. */
PAS_API extern double pas_scavenger_period_in_milliseconds; /* How long to sleep between
scavenges. */
PAS_API extern uint64_t pas_scavenger_max_epoch_delta; /* How much to subtract from the current epoch
to compute the max epoch. */
/* It's legal to set this anytime. */
PAS_API extern qos_class_t pas_scavenger_requested_qos_class;
typedef void (*pas_scavenger_activity_callback)(void);
/* This gets called when the scavenger thread has started. */
PAS_API extern pas_scavenger_activity_callback pas_scavenger_did_start_callback;
/* This gets called anytime the scavenger takes some pages and is about to consider sleeping.
It's called from the scavenger thread with no locks held. */
PAS_API extern pas_scavenger_activity_callback pas_scavenger_completion_callback;
/* This gets called when the scavenger thread is about to shut down. It's called from the
scavenger thread with no locks held. */
PAS_API extern pas_scavenger_activity_callback pas_scavenger_will_shut_down_callback;
/* This defers an eligibility notification. */
PAS_API bool pas_scavenger_did_create_eligible(void);
/* This executes an eligibility notification if there was one. */
PAS_API void pas_scavenger_notify_eligibility_if_needed(void);
PAS_API void pas_scavenger_suspend(void);
PAS_API void pas_scavenger_resume(void);
PAS_API void pas_scavenger_clear_all_non_tlc_caches(void);
PAS_API void pas_scavenger_clear_all_caches_except_remote_tlcs(void);
PAS_API void pas_scavenger_clear_all_caches(void);
PAS_API size_t pas_scavenger_decommit_free_memory(void);
PAS_API void pas_scavenger_run_synchronously_now(void);
typedef enum {
pas_scavenger_invalid_synchronous_operation_kind,
pas_scavenger_clear_all_non_tlc_caches_kind,
pas_scavenger_clear_all_caches_except_remote_tlcs_kind,
pas_scavenger_clear_all_caches_kind,
pas_scavenger_decommit_free_memory_kind,
pas_scavenger_run_synchronously_now_kind
} pas_scavenger_synchronous_operation_kind;
PAS_API void pas_scavenger_perform_synchronous_operation(
pas_scavenger_synchronous_operation_kind kind);
PAS_END_EXTERN_C;
#endif /* PAS_SCAVENGER_H */