各模块整理综述

1. buffer

  • The libPhenom buffer API allows for fixed-size buffers to be used reasonably efficiently in an application. The API provides a couple of benefits:
  • Slices can be made over a region of another buffer. The slice allows for the region to be referenced without copying, while still safely managing the underlying storage
    The object representation of a string buffer means that we can avoid string interning costs when integrating with runtimes such as Lua
  • Discontiguous buffers can be used to accumulate data. The fixed size of these buffers helps to reduce heap fragmentation. An API is provided to locate and slice (or duplicate if needed) a delimited record (such as CRLF delimited lines)

2. Configuration

  • libPhenom provides a relatively simple configuration facility; the process has a global configuration expressed as a variant object.
  • There is limited support for mutating the configuration: any values or objects you obtain via the configuration API MUST be treated as read-only as they may be accessed from any thread concurrently.
  • If you need to mutate the configuration at runtime (not recommended), then you need to replace the entire configuration object with the new generation of the configuration, and then dispose of the old one.

Counters

The counter subsystem provides a set of functions that allows the application to build a hierarchy of 64-bit counter values.

These values may be modified and queried atomically via the provided API.

Functions are provided to introspect the hierarchy and groups of related counters can be read consistently. Note that the system does not provide a means for snapshotting the entire counter hierarchy.

Counters are implemented such that individual threads may manipulate their values uncontested (with no locking!), but allowing for a reader to obtain a consistent view of a related set of counters.

Base Environment

Including phenom/defs.h sets the base environment for using phenom. This header should be included first (most phenom headers will pull this in explicitly) so that the compilation environment exposes the more modern unix compilation features of your system.

DNS Resolution facilities

libPhenom provides an asynchronous wrapper around the system resolver that delegates to the system provided getaddrinfo() library function but runs in a thread pool.

This is provided for the common case of resolving a target hostname and then setting up an async connect.

The resolver functions operate by schedling a resolution and arrange to invoke a callback when the results are available. The same callback is invoked in both the success and error cases. The callback may be triggered on the same thread that scheduled the resolution, but the common case is for the resolution to complete on some other thread and invoke the callback in that context.

The intended usage is that you schedule a job to continue your processing in some other context.

Hash Table

libPhenom provides a hash table facility that allows the construction of maps from an arbitrary key type to an arbitrary value type.

The hash table uses closed hashing / open addressing to reduce the volume of discrete allocations required to maintain the table.

Note: The tables have no built-in mutex or locking capability. For a concurrent map you might consider using the Concurrency Kit hash-set API. You may alternatively wrap your hash table implementation in an appropriate mutex or reader-writer lock.

Jobs

Jobs describe a parcel of work. Jobs may be triggered or dispatched in one of a number of "run classes". There are three run classes:

  • Immediate. The work is dispatched immediately on the calling thread.
  • NBIO. The work is dispatched when a descriptor is signalled for I/O.
  • Pool. The work is queued to a thread pool and is dispatched as soon as a worker becomes available. libPhenom allows multiple pools to be defined to better partition and prioritize your workload.

JSON Support

libPhenom provides JSON encoding and decoding support functions. These are implemented in terms of the variant datatype; you may encode from a variant to JSON and vice-versa.

Listener

socket服务器端监听绑定过程

Logging

libPhenom provides simple but useful logging utilities.

Each logged message is associated with one of the following severity levels:

  • PH_LOG_PANIC - the world is going to end
  • PH_LOG_ALERT - take notice this is very import
  • PH_LOG_CRIT - almost as important as alert
  • PH_LOG_ERR - something bad happened; you should probably look at it
  • PH_LOG_WARN - something happened but it may not be actionable
  • PH_LOG_NOTICE - somewhat noisy notification about something
  • PH_LOG_INFO - rather more noisy notification of something
  • PH_LOG_DEBUG - noisy diagnostic mode
    The system has an overall log level that specifies the threshold for which log messages will be allowed to hit the underyling logs.

The default is PH_LOG_ERR, meaning that a log event must be PH_LOG_ERR or higher for the message to hit the logs.

Expanded log messages have a maximum length of 1024 bytes in the current implementation.

Memory management facility

It is important for long-running infrastructure software to maintain information about its memory usage. This facility allows named memory types to be registered and have stats maintained against them.

OpenSSL

Printf

Reference Counting

Helpers for working with reference counters in C. These delegate to Concurrency Kit and use the primitive fetch-and-add functions (ck_pr_faa_XXX).

Socket

Streams

libPhenom provides a portable layer over streaming IO

Strings

C strings are somewhat bare, so we provide some helpers that aim to assist with:

avoiding heap allocations where possible
tracking heap allocations when not avoidable
safely manage string expansion and growth

Utility Functions

A slightly random set of helper functions.

Spawn

Timer Wheel

This borrows from the concepts explored in the paper: "Hashed and Hierarchical Timing Wheels: Effcient Data Structures for Implementing a Timer Facility by George Varghese and Anthony Lauck"

We model timers as the number of ticks until the next due event. We allow 32-bits of space to track this due interval, and break that into 4 regions of 8 bits. Each region indexes into a bucket of 256 lists.

Bucket 0 represents those events that are due the soonest. Each tick causes us to look at the next list in a bucket. The 0th list in a bucket is special; it means that it is time to flush the timers from the next higher bucket and schedule them into a different bucket.

This technique results in a very cheap mechanism for maintaining time and timers, provided that we can maintain a consistent rate of ticks.

Variant Data Type

Variants can represent runtime variable values and are primarily useful when it comes to serialization to/from the JSON or BSER encoding formats.

Note: JSON requires that all strings be UTF-8 encoded, but these functions won't validate the strings you pass into them because there are situations where binary string support is desirable or essential. You may use ph_string_is_valid_utf8()to check for correctness.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,324评论 0 10
  • 《纽约时报》畅销系列《飓光志》开启第三卷!在《渡誓》中,复仇心切的虚渡大肆回归,人类遭遇新一轮灭世。 在达力拿·寇...
    Botanica阅读 1,351评论 2 4
  • 如果再给我一次选择的机会,我一定会牢牢把握手中的幸福,不让你逃走! 遇到你是在高一的时候,虽然我们在同...
    蓝莓酱紫阅读 483评论 0 0