#ifdef MACH_KERNEL_PRIVATE
#include <kern/thread.h>
+#include <kern/thread_group.h>
#include <kern/locks.h>
#include <kern/queue.h>
#include <ipc/ipc_voucher.h>
#define BANK_ACCOUNT 1
struct bank_element {
- int be_type; /* Type of element */
+ unsigned int be_type:31, /* Type of element */
+ be_voucher_ref:1; /* Voucher system holds a ref */
int be_refs; /* Ref count */
- int be_made; /* Made refs for voucher, Actual ref is also taken for each Made ref */
+ unsigned int be_made; /* Made refs for voucher, Actual ref is only taken for voucher ref transition (0 to 1) */
#if DEVELOPMENT || DEBUG
task_t be_task; /* Customer task, do not use it since ref is not taken on task */
#endif
struct bank_task {
struct bank_element bt_elem; /* Bank element */
struct proc_persona_info bt_proc_persona; /* Persona of the process */
- ledger_t bt_creditcard; /* Ledger of the customer task */
+ ledger_t bt_ledger; /* Ledger of the customer task */
queue_head_t bt_accounts_to_pay; /* List of accounts worked for me and need to pay */
queue_head_t bt_accounts_to_charge; /* List of accounts I did work and need to charge */
decl_lck_mtx_data(, bt_acc_to_pay_lock) /* Lock to protect accounts to pay list */
};
#define bt_type bt_elem.be_type
+#define bt_voucher_ref bt_elem.be_voucher_ref
#define bt_refs bt_elem.be_refs
#define bt_made bt_elem.be_made
(OSAddAtomic(-(num), &(elem)->bt_refs))
#define bank_task_made_reference(elem) \
- (OSAddAtomic(1, &(elem)->bt_made))
+ (hw_atomic_add(&(elem)->bt_made, 1) - 1)
#define bank_task_made_release(elem) \
- (OSAddAtomic(-1, &(elem)->bt_made))
+ (hw_atomic_sub(&(elem)->bt_made, 1) + 1)
#define bank_task_made_release_num(elem, num) \
- (OSAddAtomic(-(num), &(elem)->bt_made))
+ (hw_atomic_sub(&(elem)->bt_made, (num)) + (num))
struct bank_account {
};
#define ba_type ba_elem.be_type
+#define ba_voucher_ref ba_elem.be_voucher_ref
#define ba_refs ba_elem.be_refs
#define ba_made ba_elem.be_made
(OSAddAtomic(-(num), &(elem)->ba_refs))
#define bank_account_made_reference(elem) \
- (OSAddAtomic(1, &(elem)->ba_made))
+ (hw_atomic_add(&(elem)->ba_made, 1) - 1)
#define bank_account_made_release(elem) \
- (OSAddAtomic(-1, &(elem)->ba_made))
+ (hw_atomic_sub(&(elem)->ba_made, 1) + 1)
#define bank_account_made_release_num(elem, num) \
- (OSAddAtomic(-(num), &(elem)->ba_made))
+ (hw_atomic_sub(&(elem)->ba_made, (num)) + (num))
struct _bank_ledger_indices {
int cpu_time;
+ int energy;
};
extern struct _bank_ledger_indices bank_ledgers;
extern void bank_init(void);
extern void bank_task_destroy(task_t);
extern void bank_task_initialize(task_t task);
-extern uint64_t bank_billed_time_safe(task_t task);
-extern uint64_t bank_billed_time(bank_task_t bank_task);
-extern uint64_t bank_serviced_time_safe(task_t task);
-extern uint64_t bank_serviced_time(bank_task_t bank_task);
-extern ledger_t bank_get_voucher_ledger(ipc_voucher_t voucher);
+extern void bank_billed_balance_safe(task_t task, uint64_t *cpu_time, uint64_t *energy);
+extern void bank_billed_balance(bank_task_t bank_task, uint64_t *cpu_time, uint64_t *energy);
+extern void bank_serviced_balance_safe(task_t task, uint64_t *cpu_time, uint64_t *energy);
+extern void bank_serviced_balance(bank_task_t bank_task, uint64_t *cpu_time, uint64_t *energy);
+extern kern_return_t bank_get_bank_ledger_and_thread_group(ipc_voucher_t voucher,
+ ledger_t *bankledger, struct thread_group **banktg);
extern void bank_swap_thread_bank_ledger(thread_t thread, ledger_t ledger);
#endif /* MACH_KERNEL_PRIVATE */