diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-10-31 18:45:29 +0300 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-10-31 18:45:29 +0300 |
commit | cbb830d3182f7967ec477d1b050bc0dedbf71dd8 (patch) | |
tree | cfd3d1d75d5faba85d4f530c9fa7e30562770c58 /src/kvstorage_server.c | |
parent | 98bd93ffddbb1f40884c5c12269948f230dbd0d0 (diff) | |
download | rspamd-cbb830d3182f7967ec477d1b050bc0dedbf71dd8.tar.gz rspamd-cbb830d3182f7967ec477d1b050bc0dedbf71dd8.zip |
Add basic locking.
Diffstat (limited to 'src/kvstorage_server.c')
-rw-r--r-- | src/kvstorage_server.c | 8 |
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); } |