Mercurial > urweb
comparison src/c/urweb.c @ 2282:19b233bb3176
Make cache flushes safe for transactions (not sure about LRU bump on read).
author | Ziv Scully <ziv@mit.edu> |
---|---|
date | Thu, 12 Nov 2015 09:47:20 -0500 |
parents | 75cb60a7f6f1 |
children | 4afaab523213 |
comparison
equal
deleted
inserted
replaced
2281:75cb60a7f6f1 | 2282:19b233bb3176 |
---|---|
422 char *name; | 422 char *name; |
423 void *data; | 423 void *data; |
424 void (*free)(void*); | 424 void (*free)(void*); |
425 } global; | 425 } global; |
426 | 426 |
427 typedef struct uw_Sqlcache_Inval { | |
428 uw_Sqlcache_Cache *cache; | |
429 char **keys; | |
430 struct uw_Sqlcache_Inval *next; | |
431 } uw_Sqlcache_Inval; | |
432 | |
427 struct uw_context { | 433 struct uw_context { |
428 uw_app *app; | 434 uw_app *app; |
429 int id; | 435 int id; |
430 | 436 |
431 char *(*get_header)(void *, const char *); | 437 char *(*get_header)(void *, const char *); |
489 size_t output_buffer_size; | 495 size_t output_buffer_size; |
490 | 496 |
491 // Sqlcache. | 497 // Sqlcache. |
492 int numRecording; | 498 int numRecording; |
493 int recordingOffset; | 499 int recordingOffset; |
500 uw_Sqlcache_Inval *inval; | |
494 | 501 |
495 int remoteSock; | 502 int remoteSock; |
496 }; | 503 }; |
497 | 504 |
498 size_t uw_headers_max = SIZE_MAX; | 505 size_t uw_headers_max = SIZE_MAX; |
4659 uw_Sqlcache_freeValue(entry->value); | 4666 uw_Sqlcache_freeValue(entry->value); |
4660 entry->value = value; | 4667 entry->value = value; |
4661 entry->value->timeValid = timeNow; | 4668 entry->value->timeValid = timeNow; |
4662 } | 4669 } |
4663 | 4670 |
4664 void uw_Sqlcache_flush(uw_Sqlcache_Cache *cache, char **keys) { | 4671 void uw_Sqlcache_flushCommitOne(uw_Sqlcache_Cache *cache, char **keys) { |
4665 size_t numKeys = cache->numKeys; | 4672 size_t numKeys = cache->numKeys; |
4666 char *key = uw_Sqlcache_allocKeyBuffer(keys, numKeys); | 4673 char *key = uw_Sqlcache_allocKeyBuffer(keys, numKeys); |
4667 char *buf = key; | 4674 char *buf = key; |
4668 time_t timeNow = uw_Sqlcache_getTimeNow(cache); | 4675 time_t timeNow = uw_Sqlcache_getTimeNow(cache); |
4669 uw_Sqlcache_Entry *entry; | 4676 uw_Sqlcache_Entry *entry; |
4689 } | 4696 } |
4690 free(key); | 4697 free(key); |
4691 // All the keys were non-null and the relevant entry is present, so we delete it. | 4698 // All the keys were non-null and the relevant entry is present, so we delete it. |
4692 uw_Sqlcache_delete(cache, entry); | 4699 uw_Sqlcache_delete(cache, entry); |
4693 } | 4700 } |
4701 | |
4702 void uw_Sqlcache_flushFree(void *data, int dontCare) { | |
4703 uw_Sqlcache_Inval *inval = (uw_Sqlcache_Inval *)data; | |
4704 while (inval) { | |
4705 char** keys = inval->keys; | |
4706 size_t numKeys = inval->cache->numKeys; | |
4707 while (numKeys-- > 0) { | |
4708 free(keys[numKeys]); | |
4709 } | |
4710 free(keys); | |
4711 uw_Sqlcache_Inval *nextInval = inval->next; | |
4712 free(inval); | |
4713 inval = nextInval; | |
4714 } | |
4715 } | |
4716 | |
4717 void uw_Sqlcache_flushCommit(void *data) { | |
4718 uw_Sqlcache_Inval *inval = (uw_Sqlcache_Inval *)data; | |
4719 uw_Sqlcache_Inval *invalFirst = inval; | |
4720 while (inval) { | |
4721 uw_Sqlcache_Cache *cache = inval->cache; | |
4722 char **keys = inval->keys; | |
4723 uw_Sqlcache_flushCommitOne(cache, keys); | |
4724 inval = inval->next; | |
4725 } | |
4726 uw_Sqlcache_flushFree(invalFirst, 0); | |
4727 } | |
4728 | |
4729 void uw_Sqlcache_flush(uw_context ctx, uw_Sqlcache_Cache *cache, char **keys) { | |
4730 uw_Sqlcache_Inval *inval = malloc(sizeof(uw_Sqlcache_Inval)); | |
4731 inval->cache = cache; | |
4732 inval->keys = keys; | |
4733 inval->next = NULL; | |
4734 if (ctx->inval) { | |
4735 ctx->inval->next = inval; | |
4736 } else { | |
4737 uw_register_transactional(ctx, inval, uw_Sqlcache_flushCommit, NULL, uw_Sqlcache_flushFree); | |
4738 } | |
4739 ctx->inval = inval; | |
4740 } |