=================================================================================
0. 基本概念
=================================================================================
核心头文件 glib.h config.h
0. 版本: #include <glib/gversion.h>
/* Define to the GLIB major version */
#define GLIB_MAJOR_VERSION 2/* Define to the GLIB micro version */
#define GLIB_MICRO_VERSION 3/* Define to the GLIB minor version */
#define GLIB_MINOR_VERSION 52#define GLIB_CHECK_VERSION(major,minor,micro) \
(GLIB_MAJOR_VERSION > (major) || \
(GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION > (minor)) || \
(GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION == (minor) && \
GLIB_MICRO_VERSION >= (micro)))
glib_check_version()0. 基本数据类型: #include <glib/gtypes.h>
typedef void* gpointer;
typedef const void *gconstpointer;
/* Portable versions of host-network order stuff */
#define g_ntohl(val) (GUINT32_FROM_BE (val))
#define g_ntohs(val) (GUINT16_FROM_BE (val))
#define g_htonl(val) (GUINT32_TO_BE (val))
#define g_htons(val) (GUINT16_TO_BE (val))
G_BYTE_ORDER
#define G_LITTLE_ENDIAN 1234
#define G_BIG_ENDIAN 4321
#define G_PDP_ENDIAN 3412 /* unused, need specific PDP check */
类型转换:
#include <glibconfig.h>
#define GPOINTER_TO_INT(p) ((gint) (gint) (p))
#define GPOINTER_TO_UINT(p) ((guint) (guint) (p))#define GINT_TO_POINTER(i) ((gpointer) (gint) (i))
#define GUINT_TO_POINTER(u) ((gpointer) (guint) (u))#include <glib/gmacros.h>
/* Macros by analogy to GINT_TO_POINTER, GPOINTER_TO_INT */
#define GPOINTER_TO_SIZE(p) ((gsize) (p))
#define GSIZE_TO_POINTER(s) ((gpointer) (gsize) (s))=================================================================================
1. 解析配置文件
=================================================================================
gkeyfile.c/gkeyfile.h
1.1 三个对象
config_file --load--> GKeyFile --init--> 自定义对象(保存key和其他成员)
1.2 如何设计
config_file: "\n" "\0" "#" <- comment(key=NULL)
group <- GKeyFileGroup(GKeyFileKeyValuePair)
struct _GKeyFileKeyValuePair
{
gchar *key; /* NULL for comments */
gchar *value;
};
GKeyFile
创建:
g_key_file_new
g_key_file_save_to_file
g_key_file_to_data
初始化:
g_key_file_load_from_file -> g_key_file_load_from_fd -> g_key_file_parse_data g_key_file_flush_parse_buffer
g_key_file_load_from_data -> g_key_file_parse_data g_key_file_flush_parse_buffer
g_key_file_load_from_dirs -> g_key_file_load_from_fd
g_key_file_load_from_data_dirs -> g_key_file_load_from_dirs
g_key_file_load_from_bytes -> g_key_file_load_from_data
调用:
group >>>
g_key_file_get_groups/g_key_file_remove_group/g_key_file_has_group
g_key_file_get_start_group
key >>>
g_key_file_get_keys/g_key_file_remove_key/g_key_file_has_key
value >>>
g_key_file_get_value/g_key_file_set_value
g_key_file_get_[integer|string|boolean|double|uint64|int64|integer_list|string_list|boolean_list|double_list]
g_key_file_set_[integer|string|boolean|double|uint64|int64|integer_list|string_list|boolean_list|double_list]
locale >>>(utf8)
g_key_file_get_locale_string/g_key_file_set_locale_string
g_key_file_get_locale_string_list/g_key_file_set_locale_string_list
comment >>>
g_key_file_get_comment/g_key_file_set_comment/g_key_file_remove_comment
其他设置:
separator >>>
g_key_file_set_list_separator
内置接口: 无须调用,已经被封装了。
g_key_file_parse_*
释放:
Use g_strfreev() to free *_list and group(gchar**).=================================================================================
2. log系统
=================================================================================
核心定义
/* Glib log levels and flags. */
typedef enum
{
/* log flags */
G_LOG_FLAG_RECURSION = 1 << 0,
G_LOG_FLAG_FATAL = 1 << 1,/* GLib log levels */
G_LOG_LEVEL_ERROR = 1 << 2, /* always fatal */
G_LOG_LEVEL_CRITICAL = 1 << 3,
G_LOG_LEVEL_WARNING = 1 << 4,
G_LOG_LEVEL_MESSAGE = 1 << 5,
G_LOG_LEVEL_INFO = 1 << 6,
G_LOG_LEVEL_DEBUG = 1 << 7,G_LOG_LEVEL_MASK = ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL)
} GLogLevelFlags;核心函数:
g_log -> g_logv(log_domain, log_level, format, ...)
handler:
g_log_set_handler
g_log_set_handler_full
g_log_remove_handler
init/uninit:
__btd_log_init
__btd_log_cleanup
api:
g_message G_LOG_LEVEL_MESSAGE
g_critical G_LOG_LEVEL_CRITICAL
g_warning G_LOG_LEVEL_WARNING
g_info G_LOG_LEVEL_INFO
g_error G_LOG_LEVEL_ERROR
g_debug G_LOG_LEVEL_DEBUG
以下是bluez中自定义的log接口(syslog.h)
error() -> vsyslog(LOG_ERR) logging_log(HCI_DEV_NONE, LOG_ERR)
warn() -> vsyslog(LOG_WARNING) logging_log(HCI_DEV_NONE, LOG_WARNING)
info() -> vsyslog(LOG_INFO) logging_log(HCI_DEV_NONE, LOG_INFO)
#define HCI_DEV_NONE 0xffffbtd_log -> vsyslog(priority) logging_log(index, priority)
btd_error -> vsyslog(LOG_ERR) logging_log(index, LOG_INFO)
btd_warn -> vsyslog(LOG_WARNING) logging_log(index, LOG_INFO)
btd_info -> vsyslog(LOG_INFO) logging_log(index, LOG_INFO)
btd_debug -> vsyslog(LOG_DEBUG) logging_log(index, LOG_INFO)
__attribute__((format(printf, 3, 4))); 这个表示可变参数从第4个开始
=================================================================================
2. HashTable
=================================================================================
ghash.c/ghash.h
核心数据结构
struct _GHashTable
{
gint size;
gint mod;
guint mask;
gint nnodes;
gint noccupied; /* nnodes + tombstones */gpointer *keys;
guint *hashes;
gpointer *values;GHashFunc hash_func;
GEqualFunc key_equal_func;
gint ref_count;
#ifndef G_DISABLE_ASSERT
/*
* Tracks the structure of the hash table, not its contents: is only
* incremented when a node is added or removed (is not incremented
* when the key or data of a node is modified).
*/
int version;
#endif
GDestroyNotify key_destroy_func;
GDestroyNotify value_destroy_func;
};
#define G_BEGIN_DECLS extern "C" {
#define G_END_DECLS }创建:
g_hash_table_new(GHashFunc, GEqualFunc) -> g_hash_table_new_full -> g_slice_new(分配内存) g_hash_table_set_shift(size=2^3)
g_new0(key,value,hash分配空间 -> g_malloc0_n)
#define g_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc0)
#define g_renew(struct_type, mem, n_structs) _G_RENEW (struct_type, mem, n_structs, realloc)
#define _G_NEW(struct_type, n_structs, func) \
((struct_type *) g_##func##_n ((n_structs), sizeof (struct_type)))
#define _G_RENEW(struct_type, mem, n_structs, func) \
((struct_type *) g_##func##_n (mem, (n_structs), sizeof (struct_type)))g_hash_table_new_full
销毁:
g_hash_table_destroy -> g_hash_table_remove_all g_hash_table_unref
插入:
g_hash_table_insert -> g_hash_table_insert_internal(keep=FALSE) -> g_hash_table_lookup_node g_hash_table_insert_node
g_hash_table_replace -> g_hash_table_insert_internal(keep=TRUE)
g_hash_table_add -> g_hash_table_insert_internal(keep=TRUE)
移除:
g_hash_table_remove -> g_hash_table_remove_internal(notify=TRUE) -> g_hash_table_lookup_node g_hash_table_remove_node g_hash_table_maybe_resize
g_hash_table_remove_all -> g_hash_table_remove_all_nodes(notify=TRUE,destruction=FALSE) g_hash_table_maybe_resize
g_hash_table_steal -> g_hash_table_remove_internal(notify=FALSE)
g_hash_table_steal_all -> g_hash_table_remove_all_nodes(notify=TRUE,destruction=TRUE) g_hash_table_maybe_resize
查找:
g_hash_table_lookup -> g_hash_table_lookup_node
g_hash_table_contains -> g_hash_table_lookup_node
g_hash_table_lookup_extended -> g_hash_table_lookup_node
g_hash_table_find -> 调用predicate
遍历:
g_hash_table_foreach
g_hash_table_foreach_remove -> g_hash_table_foreach_remove_or_steal(notify=TRUE) -> g_hash_table_remove_node g_hash_table_maybe_resize
g_hash_table_foreach_steal -> g_hash_table_foreach_remove_or_steal(notify=FALSE)
迭代器:
g_hash_table_iter_init
g_hash_table_iter_next
g_hash_table_iter_get_hash_table
g_hash_table_iter_remove -> iter_remove_or_steal(notify=TRUE) -> g_hash_table_remove_node
g_hash_table_iter_steal -> iter_remove_or_steal(notify=FALSE) -> g_hash_table_remove_node
key/value:
g_hash_table_get_keys -> g_list_prepend
g_hash_table_get_values -> g_list_prepend
g_hash_table_get_keys_as_array -> g_new
others:
g_hash_table_size
g_hash_table_ref -> g_atomic_int_inc
g_hash_table_unref -> g_atomic_int_dec_and_test g_hash_table_remove_all_nodes(notify=TRUE,destruction=TRUE)
/* Hash Functions */
g_[str|int|int64|double|direct]_equal
g_[str|int|int64|double|direct]_hash
注: steal表示强制操作,不通知,不执行销毁回调函数.=================================================================================
3. GString
=================================================================================
gstring.c/gstring.h
gstrfuncs.c/gstrfuncs.h
核心数据结构
struct _GString
{
gchar *str;
gsize len;
gsize allocated_len;
};
申请/分配:
g_string_new -> g_string_sized_new g_string_append_len( -> g_string_insert_len -> g_string_maybe_expand memmove/memcpy)
g_string_new_len -> g_string_new
-> g_string_sized_new g_string_append_len
g_string_sized_new -> g_slice_new g_string_maybe_expand( -> g_realloc)
释放:
g_string_free -> g_free/g_slice_free
g_string_free_to_bytes -> g_string_free g_bytes_new_take( -> g_bytes_new_with_free_func)
api:
g_string_equal
g_string_hash
g_string_assign -> g_string_truncate g_string_append
g_string_truncate (字符串截断=0)
g_string_erase
g_string_set_size -> g_string_maybe_expand (扩展2^N < n)g_string_insert_len -> g_string_maybe_expand
g_string_insert -> g_string_insert_len
g_string_insert_c -> g_string_maybe_expand
g_string_insert_unichar -> g_string_maybe_expandg_string_append -> g_string_insert_len
g_string_append_len
g_string_append_c -> g_string_insert_c -> g_string_maybe_expand
g_string_append_unichar -> g_string_insert_unichar -> g_string_maybe_expandg_string_prepend -> g_string_insert_len
g_string_prepend_len
g_string_prepend_c -> g_string_insert_c -> g_string_maybe_expand
g_string_prepend_unichar -> g_string_insert_unichar -> g_string_maybe_expandg_string_overwrite -> g_string_overwrite_len
g_string_overwrite_len -> g_string_maybe_expandg_string_ascii_down -> g_ascii_tolower -> g_ascii_islower
g_string_ascii_up -> g_ascii_toupper -> g_ascii_islowerg_string_vprintf -> g_string_truncate g_string_append_vprintf
g_string_printf -> g_string_truncate g_string_append_vprintf
g_string_append_vprintf -> g_vasprintf g_string_maybe_expand
g_string_append_printf -> g_string_append_vprintf
g_string_append_uri_escapeddeprecated:
g_string_down
g_string_up
g_string_sprintf -> g_string_printf
g_string_sprintfa -> g_string_append_printf=================================================================================
4. List
=================================================================================
glist.c/glist.h
gslice.c/gslice.h
>>> fast threaded memory chunk allocator
>>> 参考memory相关
核心数据结构
/* Doubly linked lists */
struct _GList
{
gpointer data;
GList *next;
GList *prev;
};
关于内存的ops主要是封装了glice
申请/分配:
g_list_alloc -> _g_list_alloc0 -> g_slice_new0 -> g_slice_alloc0 -> g_slice_alloc
释放:
g_list_free -> g_slice_free_chain -> g_slice_free_chain_with_offset
g_list_free_1 -> _g_list_free1 -> g_slice_free -> g_slice_free1
g_list_free1 -> g_list_free_1
g_list_free_full -> g_list_foreach g_list_free
add:
g_list_append -> _g_list_alloc g_list_last
g_list_prepend -> _g_list_alloc
g_list_insert -> g_list_prepend g_list_append g_list_nth _g_list_alloc
g_list_insert_sorted -> g_list_insert_sorted_real
g_list_insert_sorted_with_data -> g_list_insert_sorted_real
g_list_insert_before
delete:
g_list_remove -> _g_list_remove_link
g_list_remove_all -> _g_list_free1
g_list_remove_link -> _g_list_remove_link
g_list_delete_link -> _g_list_remove_link _g_list_free1
change:
g_list_concat -> g_list_last
g_list_reverse
copy:
g_list_copy -> g_list_copy_deep
g_list_copy_deep -> _g_list_alloc
find:
g_list_find
g_list_find_custom
g_list_position
g_list_index
g_list_last
g_list_first
g_list_nth
g_list_nth_prev
g_list_nth_data
g_list_previous
g_list_next
sort:
g_list_sort -> g_list_sort_real <-> g_list_sort_merge
g_list_sort_with_data -> g_list_sort_real
others:
g_list_length
g_list_foreach=================================================================================
5. Slist
=================================================================================
gslist.c/gslist.h
gslice.c/gslice.h
>>> fast threaded memory chunk allocator
>>> 参考memory相关
核心数据结构
/* Singly linked lists */
struct _GSList
{
gpointer data;
GSList *next;
};
关于内存的ops主要是封装了glice
申请/分配:
g_slist_alloc -> _g_slist_alloc0 -> g_slice_new0 -> g_slice_alloc0 -> g_slice_alloc
释放:
g_slist_free -> g_slice_free_chain -> g_slice_free_chain_with_offset
g_slist_free_1 -> _g_slist_free1 -> g_slice_free -> g_slice_free1
g_slist_free1 -> g_slist_free_1
g_slist_free_full -> g_slist_foreach g_slist_free
add:
g_slist_append -> _g_slist_alloc g_slist_last
g_slist_prepend -> _g_slist_alloc
g_slist_insert -> g_slist_prepend g_slist_append _g_slist_alloc
g_slist_insert_sorted -> g_slist_insert_sorted_real
g_slist_insert_sorted_with_data -> g_slist_insert_sorted_real
g_slist_insert_before
delete:
g_slist_remove -> _g_slist_remove_link
g_slist_remove_all -> _g_slist_free1
g_slist_remove_link -> _g_slist_remove_link
g_slist_delete_link -> _g_slist_remove_link _g_slist_free1
change:
g_slist_concat -> g_slist_last
g_slist_reverse
copy:
g_slist_copy -> g_slist_copy_deep
g_slist_copy_deep -> _g_slist_alloc
find:
g_slist_find
g_slist_find_custom
g_slist_position
g_slist_index
g_slist_last
g_slist_nth
g_slist_nth_data
g_slist_next
sort:
g_slist_sort -> g_slist_sort_real <-> g_slist_sort_merge
g_slist_sort_with_data -> g_slist_sort_real
others:
g_slist_length
g_slist_foreach
=================================================================================
6. GIOChannel-GSource-GIOUnixWatch
=================================================================================typedef struct _GIOUnixChannel GIOUnixChannel;
struct _GIOUnixChannel
{
GIOChannel channel;
gint fd;
};
GIOUnixChannel *unix_channel = g_new (GIOUnixChannel, 1);
GIOChannel *channel = (GIOChannel *)unix_channel; // 妙用
GIOUnixChannel *unix_channel = (GIOUnixChannel *) channel; // 反用typedef struct _GIOChannel GIOChannel;
struct _GIOChannel
{
/*< private >*/
gint ref_count;
GIOFuncs *funcs; => unix_channel_funcsgchar *encoding;
GIConv read_cd;
GIConv write_cd;
gchar *line_term; /* String which indicates the end of a line of text */
guint line_term_len; /* So we can have null in the line term */gsize buf_size;
GString *read_buf; /* Raw data from the channel */
GString *encoded_read_buf; /* Channel data converted to UTF-8 */
GString *write_buf; /* Data ready to be written to the file */
gchar partial_write_buf[6]; /* UTF-8 partial characters, null terminated *//* Group the flags together, immediately after partial_write_buf, to save memory */
guint use_buffer : 1; /* The encoding uses the buffers */
guint do_encode : 1; /* The encoding uses the GIConv coverters */
guint close_on_unref : 1; /* Close the channel on final unref */
guint is_readable : 1; /* Cached GIOFlag */
guint is_writeable : 1; /* ditto */
guint is_seekable : 1; /* ditto */gpointer reserved1;
gpointer reserved2;
};struct _GSource
{
/*< private >*/
gpointer callback_data;
GSourceCallbackFuncs *callback_funcs;const GSourceFuncs *source_funcs;
guint ref_count;GMainContext *context;
gint priority;
guint flags;
guint source_id;GSList *poll_fds;
GSource *prev;
GSource *next;char *name;
GSourcePrivate *priv;
};typedef struct _GIOUnixWatch GIOUnixWatch;
struct _GIOUnixWatch
{
GSource source;
GPollFD pollfd;
GIOChannel *channel;
GIOCondition condition;
};=================================================================================
Memory
=================================================================================
1. 申请内存
g_new(type,n) g_malloc_n(n,nb) g_malloc(nb) malloc(nb)
g_new0(type,n) g_malloc0_n(n,nb) g_malloc0(nb) calloc(1, nb)
g_renew(type,*p,n) g_realloc_n(*p,n,nb) g_realloc(*p,n*nb) realloc(*p,n*nb)
g_try_new g_try_malloc_n g_try_malloc malloc
g_try_new0 g_try_malloc0_n g_try_malloc0 calloc
g_try_renew g_try_realloc_n g_try_realloc realloc
g_alloca
g_newa
2. 释放内存
g_free(gpointer mem)
void g_clear_pointer(gpointer *pp, GDestroyNotify destroy)
gpointer g_steal_pointer(gpointer pp)3. 其他:映射
g_memmove memmove
g_memdup
g_mem_is_system_malloc return TRUE;
Glib学习笔记
最新推荐文章于 2022-05-14 22:41:31 发布