add function id_generator_next_extra_ptr
parent
32c1445d41
commit
f6609c7612
4
HISTORY
4
HISTORY
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
Version 1.40 2018-10-29
|
Version 1.40 2018-11-09
|
||||||
* add function conn_pool_parse_server_info and conn_pool_load_server_info
|
* add function conn_pool_parse_server_info and conn_pool_load_server_info
|
||||||
* support directive: #@add_annotation, for example:
|
* support directive: #@add_annotation, for example:
|
||||||
#@add_annotation CONFIG_GET /usr/lib/libshmcache.so /etc/libshmcache.conf
|
#@add_annotation CONFIG_GET /usr/lib/libshmcache.so /etc/libshmcache.conf
|
||||||
|
|
@ -10,6 +10,8 @@ Version 1.40 2018-10-29
|
||||||
* add function format_http_date
|
* add function format_http_date
|
||||||
* add function hash_find1 and hash_find2
|
* add function hash_find1 and hash_find2
|
||||||
* add function resolve_path and fast_buffer_append_file
|
* add function resolve_path and fast_buffer_append_file
|
||||||
|
* add function id_generator_next_extra_ptr, with NULL pointer to set
|
||||||
|
extra data to sn % (1 << extra_bits)
|
||||||
|
|
||||||
Version 1.39 2018-07-31
|
Version 1.39 2018-07-31
|
||||||
* add #@function REPLACE_VARS
|
* add #@function REPLACE_VARS
|
||||||
|
|
|
||||||
|
|
@ -23,11 +23,14 @@
|
||||||
#define MINOR_VERSION 0
|
#define MINOR_VERSION 0
|
||||||
#define PATCH_VERSION 8
|
#define PATCH_VERSION 8
|
||||||
|
|
||||||
|
#define IDG_FLAGS_EXTRA_DATA_BY_MOD 1
|
||||||
|
|
||||||
#define PHP_IDG_RESOURCE_NAME "fastcommon_idg"
|
#define PHP_IDG_RESOURCE_NAME "fastcommon_idg"
|
||||||
#define DEFAULT_SN_FILENAME "/tmp/fastcommon_id_generator.sn"
|
#define DEFAULT_SN_FILENAME "/tmp/fastcommon_id_generator.sn"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct idg_context idg_context;
|
struct idg_context idg_context;
|
||||||
|
int flags;
|
||||||
} PHPIDGContext;
|
} PHPIDGContext;
|
||||||
|
|
||||||
static int le_consumer;
|
static int le_consumer;
|
||||||
|
|
@ -144,7 +147,7 @@ PHP_MINIT_FUNCTION(fastcommon)
|
||||||
{
|
{
|
||||||
static char buff[16];
|
static char buff[16];
|
||||||
|
|
||||||
log_init();
|
log_try_init();
|
||||||
le_consumer = zend_register_list_destructors_ex(id_generator_dtor, NULL,
|
le_consumer = zend_register_list_destructors_ex(id_generator_dtor, NULL,
|
||||||
PHP_IDG_RESOURCE_NAME, module_number);
|
PHP_IDG_RESOURCE_NAME, module_number);
|
||||||
|
|
||||||
|
|
@ -158,6 +161,9 @@ PHP_MINIT_FUNCTION(fastcommon)
|
||||||
FASTCOMMON_REGISTER_CHAR_STR_CONSTANT("FASTCOMMON_LOG_TIME_PRECISION_NONE",
|
FASTCOMMON_REGISTER_CHAR_STR_CONSTANT("FASTCOMMON_LOG_TIME_PRECISION_NONE",
|
||||||
LOG_TIME_PRECISION_NONE, buff + 6);
|
LOG_TIME_PRECISION_NONE, buff + 6);
|
||||||
|
|
||||||
|
REGISTER_LONG_CONSTANT("FASTCOMMON_IDG_FLAGS_EXTRA_DATA_BY_MOD",
|
||||||
|
IDG_FLAGS_EXTRA_DATA_BY_MOD, CONST_CS | CONST_PERSISTENT);
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -479,7 +485,8 @@ ZEND_FUNCTION(fastcommon_is_private_ip)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
resource fastcommon_id_generator_init([string filename = "/tmp/fastcommon_id_generator.sn",
|
resource fastcommon_id_generator_init([string filename = "/tmp/fastcommon_id_generator.sn",
|
||||||
int machine_id = 0, int mid_bits = 16, int extra_bits = 0, int sn_bits = 16, int mode = 0644])
|
int machine_id = 0, int mid_bits = 16, int extra_bits = 0, int sn_bits = 16,
|
||||||
|
int mode = 0644, int flags = 0])
|
||||||
return resource handle for success, false for fail
|
return resource handle for success, false for fail
|
||||||
*/
|
*/
|
||||||
ZEND_FUNCTION(fastcommon_id_generator_init)
|
ZEND_FUNCTION(fastcommon_id_generator_init)
|
||||||
|
|
@ -491,11 +498,12 @@ ZEND_FUNCTION(fastcommon_id_generator_init)
|
||||||
long extra_bits;
|
long extra_bits;
|
||||||
long sn_bits;
|
long sn_bits;
|
||||||
long mode;
|
long mode;
|
||||||
|
long flags;
|
||||||
char *filename;
|
char *filename;
|
||||||
PHPIDGContext *php_idg_context;
|
PHPIDGContext *php_idg_context;
|
||||||
|
|
||||||
argc = ZEND_NUM_ARGS();
|
argc = ZEND_NUM_ARGS();
|
||||||
if (argc > 6) {
|
if (argc > 7) {
|
||||||
logError("file: "__FILE__", line: %d, "
|
logError("file: "__FILE__", line: %d, "
|
||||||
"fastcommon_id_generator_init parameters count: %d is invalid",
|
"fastcommon_id_generator_init parameters count: %d is invalid",
|
||||||
__LINE__, argc);
|
__LINE__, argc);
|
||||||
|
|
@ -509,9 +517,10 @@ ZEND_FUNCTION(fastcommon_id_generator_init)
|
||||||
extra_bits = 0;
|
extra_bits = 0;
|
||||||
sn_bits = 16;
|
sn_bits = 16;
|
||||||
mode = ID_GENERATOR_DEFAULT_FILE_MODE;
|
mode = ID_GENERATOR_DEFAULT_FILE_MODE;
|
||||||
if (zend_parse_parameters(argc TSRMLS_CC, "|slllll", &filename,
|
flags = 0;
|
||||||
|
if (zend_parse_parameters(argc TSRMLS_CC, "|sllllll", &filename,
|
||||||
&filename_len, &machine_id, &mid_bits, &extra_bits,
|
&filename_len, &machine_id, &mid_bits, &extra_bits,
|
||||||
&sn_bits, &mode) == FAILURE)
|
&sn_bits, &mode, &flags) == FAILURE)
|
||||||
{
|
{
|
||||||
logError("file: "__FILE__", line: %d, "
|
logError("file: "__FILE__", line: %d, "
|
||||||
"zend_parse_parameters fail!", __LINE__);
|
"zend_parse_parameters fail!", __LINE__);
|
||||||
|
|
@ -532,6 +541,7 @@ ZEND_FUNCTION(fastcommon_id_generator_init)
|
||||||
RETURN_BOOL(false);
|
RETURN_BOOL(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
php_idg_context->flags = flags;
|
||||||
last_idg_context = php_idg_context;
|
last_idg_context = php_idg_context;
|
||||||
ZEND_REGISTER_RESOURCE(return_value, php_idg_context, le_consumer);
|
ZEND_REGISTER_RESOURCE(return_value, php_idg_context, le_consumer);
|
||||||
}
|
}
|
||||||
|
|
@ -545,10 +555,11 @@ ZEND_FUNCTION(fastcommon_id_generator_next)
|
||||||
{
|
{
|
||||||
int argc;
|
int argc;
|
||||||
long extra;
|
long extra;
|
||||||
|
int extra_val;
|
||||||
|
int *extra_ptr;
|
||||||
int64_t id;
|
int64_t id;
|
||||||
zval *zhandle;
|
zval *zhandle;
|
||||||
PHPIDGContext *php_idg_context;
|
PHPIDGContext *php_idg_context;
|
||||||
struct idg_context *context;
|
|
||||||
|
|
||||||
argc = ZEND_NUM_ARGS();
|
argc = ZEND_NUM_ARGS();
|
||||||
if (argc > 2) {
|
if (argc > 2) {
|
||||||
|
|
@ -570,7 +581,6 @@ ZEND_FUNCTION(fastcommon_id_generator_next)
|
||||||
{
|
{
|
||||||
ZEND_FETCH_RESOURCE(php_idg_context, PHPIDGContext *, &zhandle, -1,
|
ZEND_FETCH_RESOURCE(php_idg_context, PHPIDGContext *, &zhandle, -1,
|
||||||
PHP_IDG_RESOURCE_NAME, le_consumer);
|
PHP_IDG_RESOURCE_NAME, le_consumer);
|
||||||
context = &php_idg_context->idg_context;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -580,10 +590,20 @@ ZEND_FUNCTION(fastcommon_id_generator_next)
|
||||||
RETURN_BOOL(false);
|
RETURN_BOOL(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
context = &last_idg_context->idg_context;
|
php_idg_context = last_idg_context;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id_generator_next_extra(context, extra, &id) != 0) {
|
logInfo("flags: %d", php_idg_context->flags);
|
||||||
|
if ((php_idg_context->flags & IDG_FLAGS_EXTRA_DATA_BY_MOD)) {
|
||||||
|
extra_ptr = NULL;
|
||||||
|
} else {
|
||||||
|
extra_val = extra;
|
||||||
|
extra_ptr = &extra_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id_generator_next_extra_ptr(&php_idg_context->idg_context,
|
||||||
|
extra_ptr, &id) != 0)
|
||||||
|
{
|
||||||
RETURN_BOOL(false);
|
RETURN_BOOL(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -182,12 +182,13 @@ void id_generator_destroy(struct idg_context *context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int id_generator_next_extra(struct idg_context *context, const int extra,
|
int id_generator_next_extra_ptr(struct idg_context *context,
|
||||||
int64_t *id)
|
const int *extra, int64_t *id)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
int len;
|
int len;
|
||||||
int bytes;
|
int bytes;
|
||||||
|
int new_extra;
|
||||||
int64_t sn;
|
int64_t sn;
|
||||||
char buff[32];
|
char buff[32];
|
||||||
char *endptr;
|
char *endptr;
|
||||||
|
|
@ -250,9 +251,18 @@ int id_generator_next_extra(struct idg_context *context, const int extra,
|
||||||
|
|
||||||
file_unlock(context->fd);
|
file_unlock(context->fd);
|
||||||
|
|
||||||
|
if (extra == NULL)
|
||||||
|
{
|
||||||
|
new_extra = sn % (1 << context->extra_bits);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
new_extra = *extra;
|
||||||
|
}
|
||||||
|
|
||||||
*id = (((int64_t)time(NULL)) << context->mes_bits_sum) |
|
*id = (((int64_t)time(NULL)) << context->mes_bits_sum) |
|
||||||
context->masked_mid | ((extra << context->sn_bits) & context->extra_mask) |
|
context->masked_mid |
|
||||||
|
((new_extra << context->sn_bits) & context->extra_mask) |
|
||||||
(sn & context->sn_mask);
|
(sn & context->sn_mask);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -122,15 +122,42 @@ static inline int id_generator_init(struct idg_context *context, const char *fil
|
||||||
void id_generator_destroy(struct idg_context *context);
|
void id_generator_destroy(struct idg_context *context);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* generate next id ex
|
* generate next id with extra pointer
|
||||||
|
* parameter:
|
||||||
|
* context: the id generator context
|
||||||
|
* extra: the extra data pointer, NULL for set extra data to sn % (1 << extra_bits)
|
||||||
|
* id: store the id
|
||||||
|
* return error no, 0 for success, none zero for fail
|
||||||
|
*/
|
||||||
|
int id_generator_next_extra_ptr(struct idg_context *context,
|
||||||
|
const int *extra, int64_t *id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* generate next id with extra data
|
||||||
* parameter:
|
* parameter:
|
||||||
* context: the id generator context
|
* context: the id generator context
|
||||||
* extra: the extra data
|
* extra: the extra data
|
||||||
* id: store the id
|
* id: store the id
|
||||||
* return error no, 0 for success, none zero for fail
|
* return error no, 0 for success, none zero for fail
|
||||||
*/
|
*/
|
||||||
int id_generator_next_extra(struct idg_context *context, const int extra,
|
static inline int id_generator_next_extra(struct idg_context *context,
|
||||||
int64_t *id);
|
const int extra, int64_t *id)
|
||||||
|
{
|
||||||
|
return id_generator_next_extra_ptr(context, &extra, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* generate next id, set extra data to sn % (1 << extra_bits)
|
||||||
|
* parameter:
|
||||||
|
* context: the id generator context
|
||||||
|
* id: store the id
|
||||||
|
* return error no, 0 for success, none zero for fail
|
||||||
|
*/
|
||||||
|
static inline int id_generator_next_extra_by_mod(struct idg_context *context,
|
||||||
|
int64_t *id)
|
||||||
|
{
|
||||||
|
return id_generator_next_extra_ptr(context, NULL, id);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* generate next id
|
* generate next id
|
||||||
|
|
@ -141,7 +168,8 @@ int id_generator_next_extra(struct idg_context *context, const int extra,
|
||||||
*/
|
*/
|
||||||
static inline int id_generator_next(struct idg_context *context, int64_t *id)
|
static inline int id_generator_next(struct idg_context *context, int64_t *id)
|
||||||
{
|
{
|
||||||
return id_generator_next_extra(context, 0, id);
|
const int extra = 0;
|
||||||
|
return id_generator_next_extra_ptr(context, &extra, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -49,4 +49,3 @@ int main(int argc, char *argv[])
|
||||||
id_generator_destroy(&context);
|
id_generator_destroy(&context);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue