Skip to content

Commit

Permalink
Simplified code for pipeline and multi/exec.
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolasff committed Sep 17, 2010
1 parent c55a283 commit c697ca1
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 175 deletions.
53 changes: 31 additions & 22 deletions common.h
Expand Up @@ -43,9 +43,9 @@
fold_item *f1 = malloc(sizeof(fold_item)); \
f1->fun = (void *)callback; \
f1->next = NULL; \
fold_item *current = get_multi_current(getThis());\
fold_item *current = redis_sock->current;\
if(current) current->next = f1; \
set_multi_current(getThis(), f1); \
redis_sock->current = f1; \
}

#define PIPELINE_ENQUEUE_COMMAND(cmd, cmd_len) request_item *tmp; \
Expand All @@ -55,13 +55,13 @@
tmp->request_size = cmd_len;\
tmp->next = NULL;\
zval *z_this = getThis(); \
struct request_item *current_request = get_pipeline_current(z_this); \
struct request_item *current_request = redis_sock->pipeline_current; \
if(current_request) {\
current_request->next = tmp;\
} \
set_pipeline_current(z_this, tmp); \
if(NULL == get_pipeline_head(z_this)) { \
set_pipeline_head(z_this, get_pipeline_current(z_this)); \
redis_sock->pipeline_current = tmp; \
if(NULL == redis_sock->pipeline_head) { \
redis_sock->pipeline_head = redis_sock->pipeline_current;\
/* head_request = current_request;*/ \
}

Expand All @@ -74,12 +74,12 @@
fold_item *f1 = malloc(sizeof(fold_item)); \
f1->fun = (void *)callback; \
f1->next = NULL; \
fold_item *current = get_multi_current(getThis());\
fold_item *current = redis_sock->current;\
if(current) current->next = f1; \
set_multi_current(getThis(), f1); \
if(NULL == get_multi_head(getThis())) { \
redis_sock->current = f1; \
if(NULL == redis_sock->head) { \
/* head = current;*/ \
set_multi_head(getThis(), get_multi_current(getThis()));\
redis_sock->head = redis_sock->current;\
}\
}

Expand Down Expand Up @@ -112,19 +112,10 @@ else if(get_flag(object TSRMLS_CC) == REDIS_MULTI) { \
REDIS_ELSE_IF_MULTI(function) \
REDIS_ELSE_IF_PIPELINE(function);

/* {{{ struct RedisSock */
typedef struct RedisSock_ {
php_stream *stream;
char *host;
unsigned short port;
long timeout;
int failed;
int status;
} RedisSock;
/* }}} */
typedef enum {ATOMIC, MULTI, PIPELINE} redis_mode;

typedef struct fold_item {
zval * (*fun)(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, ...);
zval * (*fun)(INTERNAL_FUNCTION_PARAMETERS, void *, ...);
struct fold_item *next;
} fold_item;

Expand All @@ -134,5 +125,23 @@ typedef struct request_item {
struct request_item *next;
} request_item;

/* {{{ struct RedisSock */
typedef struct {
php_stream *stream;
char *host;
unsigned short port;
long timeout;
int failed;
int status;

redis_mode mode;
fold_item *head;
fold_item *current;

request_item *pipeline_head;
request_item *pipeline_current;
} RedisSock;
/* }}} */

void
free_reply_callbacks(zval *z_this);
free_reply_callbacks(zval *z_this, RedisSock *redis_sock);
94 changes: 6 additions & 88 deletions library.c
Expand Up @@ -445,6 +445,12 @@ PHPAPI RedisSock* redis_sock_create(char *host, int host_len, unsigned short por
redis_sock->port = port;
redis_sock->timeout = timeout;

redis_sock->mode = ATOMIC;
redis_sock->head = NULL;
redis_sock->current = NULL;
redis_sock->pipeline_head = NULL;
redis_sock->pipeline_current = NULL;

return redis_sock;
}

Expand Down Expand Up @@ -620,91 +626,3 @@ PHPAPI void redis_free_socket(RedisSock *redis_sock)
efree(redis_sock);
}


PHPAPI fold_item* get_multi_head(zval *object TSRMLS_DC) {

zval **multi_head = NULL;
int type;

zend_hash_find(Z_OBJPROP_P(object), "multi_head", sizeof("multi_head"), (void **) &multi_head);
return zend_list_find(Z_LVAL_PP(multi_head), &type);
}

PHPAPI void set_multi_head(zval *object, fold_item *head TSRMLS_DC) {

zval **multi_head = NULL;

zend_hash_find(Z_OBJPROP_P(object), "multi_head", sizeof("multi_head"), (void **) &multi_head);
if(multi_head) { /* replace */
zend_list_delete(Z_LVAL_PP(multi_head));
}

int list_id = zend_list_insert(head, le_redis_multi_head);
add_property_resource(object, "multi_head", list_id);
}

PHPAPI fold_item* get_multi_current(zval *object TSRMLS_DC) {

zval **multi_current = NULL;
int type;

zend_hash_find(Z_OBJPROP_P(object), "multi_current", sizeof("multi_current"), (void **) &multi_current);
return zend_list_find(Z_LVAL_PP(multi_current), &type);
}

PHPAPI void set_multi_current(zval *object, fold_item *current TSRMLS_DC) {

zval **multi_current = NULL;

zend_hash_find(Z_OBJPROP_P(object), "multi_current", sizeof("multi_current"), (void **) &multi_current);
if(multi_current) { /* replace */
zend_list_delete(Z_LVAL_PP(multi_current));
}

int list_id = zend_list_insert(current, le_redis_multi_current);
add_property_resource(object, "multi_current", list_id);
}

PHPAPI request_item* get_pipeline_head(zval *object TSRMLS_DC) {

zval **pipeline_head = NULL;
int type;

zend_hash_find(Z_OBJPROP_P(object), "pipeline_head", sizeof("pipeline_head"), (void **) &pipeline_head);
return zend_list_find(Z_LVAL_PP(pipeline_head), &type);
}

PHPAPI void set_pipeline_head(zval *object, request_item *head TSRMLS_DC) {

zval **pipeline_head = NULL;

zend_hash_find(Z_OBJPROP_P(object), "pipeline_head", sizeof("pipeline_head"), (void **) &pipeline_head);
if(pipeline_head) { /* replace */
zend_list_delete(Z_LVAL_PP(pipeline_head));
}

int list_id = zend_list_insert(head, le_redis_pipeline_head);
add_property_resource(object, "pipeline_head", list_id);
}

PHPAPI request_item* get_pipeline_current(zval *object TSRMLS_DC) {

zval **pipeline_current = NULL;
int type;

zend_hash_find(Z_OBJPROP_P(object), "pipeline_current", sizeof("pipeline_current"), (void **) &pipeline_current);
return zend_list_find(Z_LVAL_PP(pipeline_current), &type);
}

PHPAPI void set_pipeline_current(zval *object, request_item *current TSRMLS_DC) {

zval **pipeline_current = NULL;

zend_hash_find(Z_OBJPROP_P(object), "pipeline_current", sizeof("pipeline_current"), (void **) &pipeline_current);
if(pipeline_current) { /* replace */
zend_list_delete(Z_LVAL_PP(pipeline_current));
}

int list_id = zend_list_insert(current, le_redis_pipeline_current);
add_property_resource(object, "pipeline_current", list_id);
}
7 changes: 0 additions & 7 deletions php_redis.h
Expand Up @@ -152,12 +152,6 @@ PHPAPI int redis_response_enqueued(RedisSock *redis_sock TSRMLS_DC);
PHPAPI int get_flag(zval *object TSRMLS_DC);
PHPAPI void set_flag(zval *object, int new_flag TSRMLS_DC);

/* MULTI/EXEC */
PHPAPI fold_item* get_multi_head(zval *object);
PHPAPI void set_multi_head(zval *object, fold_item *head);
PHPAPI fold_item* get_multi_current(zval *object);
PHPAPI void set_multi_current(zval *object, fold_item *current);

/* pipeline */
PHPAPI request_item* get_pipeline_head(zval *object);
PHPAPI void set_pipeline_head(zval *object, request_item *head);
Expand All @@ -167,7 +161,6 @@ PHPAPI void set_pipeline_current(zval *object, request_item *current);
ZEND_BEGIN_MODULE_GLOBALS(redis)
ZEND_END_MODULE_GLOBALS(redis)

typedef enum {ATOMIC, MULTI, PIPELINE} redis_mode;

struct redis_queued_item {

Expand Down

0 comments on commit c697ca1

Please sign in to comment.