memcache/request.c
author Tero Marttila <terom@fixme.fi>
Wed, 27 Aug 2008 22:42:27 +0300
changeset 42 0e503189af2f
parent 41 540737bf6bac
child 43 e5b714190dee
permissions -rw-r--r--
more reply-receiving code, but still incomplete
40
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <stdlib.h>
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <assert.h>
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include "request.h"
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
#include "memcache.h"
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#include "../common.h"
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
41
540737bf6bac sending requests, and partial support for receiving -- incomplete, not tested
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
     9
struct memcache_req *memcache_req_alloc (struct memcache *mc, enum memcache_command cmd_type, const struct memcache_key *key, void *cb_arg) {
40
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    struct memcache_req *req = NULL;
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    // allocate it
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    if ((req = calloc(1, sizeof(*req))) == NULL)
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
        ERROR("calloc");
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    // state
41
540737bf6bac sending requests, and partial support for receiving -- incomplete, not tested
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    17
    req->state = MEMCACHE_STATE_INVALID;
40
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    // copy the key
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    if ((req->key.buf = malloc(key->len)) == NULL)
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
        ERROR("malloc key buf");
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    // copy over the key
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    memcpy(req->key.buf, key->buf, key->len);
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    req->key.len = key->len;
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
41
540737bf6bac sending requests, and partial support for receiving -- incomplete, not tested
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    27
    // store the other data
40
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    req->mc = mc;
41
540737bf6bac sending requests, and partial support for receiving -- incomplete, not tested
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    29
    req->cmd_type = cmd_type;
40
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    req->cb_arg = cb_arg;
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    // success
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    return req;
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
error:
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    if (req) {
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        free(req->key.buf);
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
        free(req);
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    }
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    return NULL;
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
}
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
42
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    44
static void _memcache_req_notify (struct memcache_req *req) {
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    45
    req->mc->cb_fn(req, req->cb_arg);
40
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
}
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
void memcache_req_error (struct memcache_req *req) {
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    // forget our connection
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    req->conn = NULL;
42
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    51
41
540737bf6bac sending requests, and partial support for receiving -- incomplete, not tested
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    52
    req->state = MEMCACHE_STATE_ERROR;
40
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
42
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    54
    _memcache_req_notify(req);
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    55
}
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    56
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    57
void memcache_req_queued (struct memcache_req *req) {
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    58
    req->state = MEMCACHE_STATE_QUEUED;
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    59
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    60
//    _memcache_req_notify(req);
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    61
}
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    62
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    63
void memcache_req_send (struct memcache_req *req) {
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    64
    req->state = MEMCACHE_STATE_SEND;
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    65
    
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    66
//    _memcache_req_notify(req);
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    67
}
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    68
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    69
void memcache_req_reply (struct memcache_req *req, enum memcache_reply reply_type) {
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    70
    req->state = MEMCACHE_STATE_REPLY;
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    71
    req->reply_type = reply_type;
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    72
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    73
    _memcache_req_notify(req);
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    74
}
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    75
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    76
void memcache_req_done (struct memcache_req *req) {
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    77
    // make sure we are in the STATE_SEND state
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    78
    assert(req->state == MEMCACHE_STATE_SEND);
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    79
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    80
    // forget the connection
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    81
    req->conn = NULL;
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    82
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    83
    // our state is currently indeterminate until req_reply is called
0e503189af2f more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    84
    req->state = MEMCACHE_STATE_INVALID;
40
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
}
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
void memcache_req_free (struct memcache_req *req) {
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    // must be unused
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    assert(req->conn == NULL);
41
540737bf6bac sending requests, and partial support for receiving -- incomplete, not tested
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    90
    assert(req->state == MEMCACHE_STATE_INVALID || req->state == MEMCACHE_STATE_ERROR);
40
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
    free(req->key.buf);
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    free(req);
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
}
9cecd22e643a *queuing, and add missing file
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95