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-- |
40 | 1 |
|
2 |
#include <stdlib.h> |
|
3 |
#include <assert.h> |
|
4 |
||
5 |
#include "request.h" |
|
6 |
#include "memcache.h" |
|
7 |
#include "../common.h" |
|
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 | 10 |
struct memcache_req *req = NULL; |
11 |
||
12 |
// allocate it |
|
13 |
if ((req = calloc(1, sizeof(*req))) == NULL) |
|
14 |
ERROR("calloc"); |
|
15 |
||
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 | 18 |
|
19 |
// copy the key |
|
20 |
if ((req->key.buf = malloc(key->len)) == NULL) |
|
21 |
ERROR("malloc key buf"); |
|
22 |
||
23 |
// copy over the key |
|
24 |
memcpy(req->key.buf, key->buf, key->len); |
|
25 |
req->key.len = key->len; |
|
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 | 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 | 30 |
req->cb_arg = cb_arg; |
31 |
||
32 |
// success |
|
33 |
return req; |
|
34 |
||
35 |
error: |
|
36 |
if (req) { |
|
37 |
free(req->key.buf); |
|
38 |
free(req); |
|
39 |
} |
|
40 |
||
41 |
return NULL; |
|
42 |
} |
|
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 | 46 |
} |
47 |
||
48 |
void memcache_req_error (struct memcache_req *req) { |
|
49 |
// forget our connection |
|
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 | 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 | 85 |
} |
86 |
||
87 |
void memcache_req_free (struct memcache_req *req) { |
|
88 |
// must be unused |
|
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 | 91 |
|
92 |
free(req->key.buf); |
|
93 |
free(req); |
|
94 |
} |
|
95 |