Current File : //usr/include/idlist.h
/*
 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef	_IDLIST_H
#define	_IDLIST_H

#include <sys/list.h>
#include <sys/types.h>
#include <sys/avl.h>

#ifdef	__cplusplus
extern "C" {
#endif

#define	IDLIST_TYPE_UNKNOWN	0
#define	IDLIST_TYPE_CPU		1
#define	IDLIST_TYPE_CORE	2
#define	IDLIST_TYPE_SOCKET	3
#define	IDLIST_TYPE_ALL		4

#define	IDLIST_STR_CPU		"cpu"
#define	IDLIST_STR_CORE		"core"
#define	IDLIST_STR_SOCKET	"socket"
#define	IDLIST_STR_ALL		"all"

/*
 * Structures for fetching and assigning the current set of cpus, cores, and
 * sockets on the system
 */
typedef struct _idlist_cpu_state idlist_cpu_state_t;
typedef struct _idlist_cpu idlist_cpu_t;
typedef struct _idlist_core idlist_core_t;
typedef struct _idlist_socket idlist_socket_t;
typedef struct _idlist_pg idlist_pg_t;
typedef struct _idlist_lgrp idlist_lgrp_t;


/*
 * Structure to contain parsed form of an idlist, such as
 * "1,3,5-10"
 */
typedef struct _idlist idlist_t;

/*
 * Convert an idlist to internal structure and back.
 */
extern idlist_t *idlist_parse(const char *);
extern char *idlist_to_string(idlist_t *, size_t);

/*
 * idlist operations
 */
extern idlist_t *idlist_alloc(void);
extern void idlist_free(idlist_t *);

extern boolean_t idlist_has_id(idlist_t *, int id);
extern int idlist_add_id(idlist_t *, int id);
extern idlist_t *idlist_merge(idlist_t *, idlist_t *);
extern idlist_t *idlist_intersections(idlist_t *, idlist_t *);
extern idlist_t *idlist_misses(idlist_t *, idlist_t *);
extern idlist_t *idlist_remove(idlist_t *, idlist_t *);
extern int idlist_is_empty(idlist_t *);


/*
 * Fetch the current set of cpus, cores and sockets
 */
extern idlist_cpu_state_t *idlist_get_cpu_state(void);
extern void idlist_free_cpu_state(idlist_cpu_state_t *);
extern void idlist_test_cpu_state(void);

/*
 * Functions for looking up cpus, cores, and sockets.  None of the
 * returned structures should be freed by the caller.  They are freed when the
 * related idlist_cpu_state_t * is freed.
 */
extern idlist_cpu_t *idlist_get_cpu(idlist_cpu_state_t *, int);
extern boolean_t idlist_get_cpu_online(idlist_cpu_t *);
extern int idlist_get_cpu_id(idlist_cpu_t *, char *);

extern void idlist_get_cpu_assigned(idlist_cpu_t *, int *, int *,
    const char **);
extern int idlist_set_cpu_assigned(idlist_cpu_t *, int, int, const char *);

extern idlist_core_t *idlist_get_core(idlist_cpu_state_t *, int);
extern uint_t idlist_get_core_cpus_online(idlist_core_t *);
extern void idlist_get_core_assigned(idlist_core_t *, int *, int *,
    const char **);
extern int idlist_set_core_assigned(idlist_core_t *, int, int, const char *);

extern idlist_socket_t *idlist_get_socket(idlist_cpu_state_t *, int);
extern uint_t idlist_get_socket_cpus_online(idlist_socket_t *);
extern void idlist_get_socket_assigned(idlist_socket_t *, int *, int *, const
    char **);
extern int idlist_set_socket_assigned(idlist_socket_t *, int, int, const
    char *);

extern int *idlist_get_socket_cpus(idlist_cpu_state_t *, int, uint_t *);

extern int *idlist_get_socket_cores(idlist_cpu_state_t *, int, uint_t *);

extern int *idlist_get_core_cpus(idlist_cpu_state_t *, int, uint_t *);

extern idlist_pg_t *idlist_get_pg(idlist_cpu_state_t *, int);
extern int *idlist_get_pg_cpus(idlist_cpu_state_t *, int, uint_t *);

extern idlist_lgrp_t *idlist_get_lgrp(idlist_cpu_state_t *, int);
extern int *idlist_get_lgrp_cpus(idlist_cpu_state_t *, int, uint_t *);

/*
 * Convert an idlist to a fully expanded array of ints based on the
 * current cpu resources.  This function takes into account the running
 * system, so is only applicable when manipulating a dynamic configuration
 * or commiting a configuration.
 */
extern int idlist_to_ids(idlist_cpu_state_t *, const char *type,
    idlist_t *, int **, uint_t *);

extern idlist_t *idlist_allids_misses(idlist_cpu_state_t *, const char *,
    idlist_t *);

extern void idlist_print_cpu_state(idlist_cpu_state_t *);

#ifdef	__cplusplus
}
#endif

#endif	/* _IDLIST_H */