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 }