summaryrefslogtreecommitdiffstats
path: root/src/kvstorage_server.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2011-10-31 18:45:29 +0300
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2011-10-31 18:45:29 +0300
commitcbb830d3182f7967ec477d1b050bc0dedbf71dd8 (patch)
treecfd3d1d75d5faba85d4f530c9fa7e30562770c58 /src/kvstorage_server.c
parent98bd93ffddbb1f40884c5c12269948f230dbd0d0 (diff)
downloadrspamd-cbb830d3182f7967ec477d1b050bc0dedbf71dd8.tar.gz
rspamd-cbb830d3182f7967ec477d1b050bc0dedbf71dd8.zip
Add basic locking.
Diffstat (limited to 'src/kvstorage_server.c')
-rw-r--r--src/kvstorage_server.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/kvstorage_server.c b/src/kvstorage_server.c
index 81d04d4c2..d124e9f4a 100644
--- a/src/kvstorage_server.c
+++ b/src/kvstorage_server.c
@@ -387,7 +387,9 @@ kvstorage_read_socket (f_str_t * in, void *arg)
rspamd_set_dispatcher_policy (session->dispather, BUFFER_CHARACTER, session->length);
}
else if (session->command == KVSTORAGE_CMD_GET) {
+ g_static_rw_lock_reader_lock (&session->cf->storage->rwlock);
elt = rspamd_kv_storage_lookup (session->cf->storage, session->key, session->now);
+ g_static_rw_lock_reader_unlock (&session->cf->storage->rwlock);
if (elt == NULL) {
return rspamd_dispatcher_write (session->dispather, ERROR_NOT_FOUND,
sizeof (ERROR_NOT_FOUND) - 1, FALSE, TRUE);
@@ -407,11 +409,14 @@ kvstorage_read_socket (f_str_t * in, void *arg)
}
}
else if (session->command == KVSTORAGE_CMD_DELETE) {
+ g_static_rw_lock_writer_lock (&session->cf->storage->rwlock);
if (rspamd_kv_storage_delete (session->cf->storage, session->key)) {
+ g_static_rw_lock_writer_unlock (&session->cf->storage->rwlock);
return rspamd_dispatcher_write (session->dispather, "DELETED" CRLF,
sizeof ("DELETED" CRLF) - 1, FALSE, TRUE);
}
else {
+ g_static_rw_lock_writer_unlock (&session->cf->storage->rwlock);
return rspamd_dispatcher_write (session->dispather, ERROR_NOT_FOUND,
sizeof (ERROR_NOT_FOUND) - 1, FALSE, TRUE);
}
@@ -426,12 +431,15 @@ kvstorage_read_socket (f_str_t * in, void *arg)
case KVSTORAGE_STATE_READ_DATA:
session->state = KVSTORAGE_STATE_READ_CMD;
rspamd_set_dispatcher_policy (session->dispather, BUFFER_LINE, -1);
+ g_static_rw_lock_writer_lock (&session->cf->storage->rwlock);
if (rspamd_kv_storage_insert (session->cf->storage, session->key, in->begin, in->len,
session->flags, session->expire)) {
+ g_static_rw_lock_writer_unlock (&session->cf->storage->rwlock);
return rspamd_dispatcher_write (session->dispather, "STORED" CRLF,
sizeof ("STORED" CRLF) - 1, FALSE, TRUE);
}
else {
+ g_static_rw_lock_writer_unlock (&session->cf->storage->rwlock);
return rspamd_dispatcher_write (session->dispather, ERROR_NOT_STORED,
sizeof (ERROR_NOT_STORED) - 1, FALSE, TRUE);
}