# HG changeset patch # User Adam Chlipala # Date 1447966924 18000 # Node ID 6e580e31907786fcea8bc3db656e831884297c3f # Parent 6d56080f495c529eec8e8fdbae1935e2691b599e Fix condition for installing new cache entries diff -r 6d56080f495c -r 6e580e319077 src/c/urweb.c --- a/src/c/urweb.c Thu Nov 19 13:18:58 2015 -0500 +++ b/src/c/urweb.c Thu Nov 19 16:02:04 2015 -0500 @@ -504,8 +504,8 @@ size_t output_buffer_size; // Sqlcache. - int numRecording; - int recordingOffset; + int numRecording, recordingCapacity; + int *recordingOffsets; uw_Sqlcache_Update *cacheUpdate; uw_Sqlcache_Update *cacheUpdateTail; uw_Sqlcache_Unlock *cacheUnlock; @@ -596,7 +596,8 @@ ctx->output_buffer_size = 1; ctx->numRecording = 0; - ctx->recordingOffset = 0; + ctx->recordingCapacity = 0; + ctx->recordingOffsets = malloc(0); ctx->cacheUpdate = NULL; ctx->cacheUpdateTail = NULL; @@ -669,6 +670,8 @@ free(ctx->output_buffer); + free(ctx->recordingOffsets); + free(ctx); } @@ -692,6 +695,7 @@ ctx->usedSig = 0; ctx->needsResig = 0; ctx->remoteSock = -1; + ctx->numRecording = 0; } void uw_reset_keep_request(uw_context ctx) { @@ -1739,17 +1743,16 @@ } void uw_recordingStart(uw_context ctx) { - if (ctx->numRecording++ == 0) { - ctx->recordingOffset = ctx->page.front - ctx->page.start; + if (ctx->numRecording == ctx->recordingCapacity) { + ++ctx->recordingCapacity; + ctx->recordingOffsets = realloc(ctx->recordingOffsets, sizeof(int) * ctx->recordingCapacity); } + ctx->recordingOffsets[ctx->numRecording] = ctx->page.front - ctx->page.start; + ++ctx->numRecording; } char *uw_recordingRead(uw_context ctx) { - // Only the outermost recorder can read unless the recording is empty. - char *recording = ctx->page.start + ctx->recordingOffset; - if (--ctx->numRecording > 0 && recording != ctx->page.front) { - return NULL; - } + char *recording = ctx->page.start + ctx->recordingOffsets[--ctx->numRecording]; return strdup(recording); } @@ -4709,6 +4712,7 @@ while (numKeys-- > 0) { buf = uw_Sqlcache_keyCopy(buf, keys[numKeys]); size_t len = buf - key; + entry = uw_Sqlcache_find(cache, key, len, 1); if (!entry) { entry = calloc(1, sizeof(uw_Sqlcache_Entry)); @@ -4720,7 +4724,7 @@ } free(key); } - if (entry->value && entry->value->timeValid < value->timeValid) { + if (!entry->value || entry->value->timeValid < value->timeValid) { uw_Sqlcache_freeValue(entry->value); entry->value = value; entry->value->timeValid = timeNow; diff -r 6d56080f495c -r 6e580e319077 src/lru_cache.sml --- a/src/lru_cache.sml Thu Nov 19 13:18:58 2015 -0500 +++ b/src/lru_cache.sml Thu Nov 19 16:02:04 2015 -0500 @@ -65,6 +65,7 @@ val revArgs = paramRepeatRev (fn p => "p" ^ p) ", " + val argNums = List.tabulate (params, fn i => "p" ^ Int.toString i) in Print.box [string ("static uw_Sqlcache_Cache cacheStruct" ^ i ^ " = {"), @@ -119,7 +120,12 @@ newline, string " } else {", newline, - (*string (" puts(\"SQLCACHE: miss " ^ i ^ ".\");"), + (*string (" printf(\"SQLCACHE: miss " ^ i ^ " " ^ String.concatWith ", " (List.tabulate (params, fn _ => "%s")) ^ ".\\n\""), + (case argNums of + [] => Print.box [] + | _ => Print.box [string ", ", + p_list string argNums]), + string ");", newline,*) string " uw_recordingStart(ctx);", newline, @@ -159,6 +165,8 @@ newline, string (" uw_Sqlcache_flush(ctx, cache" ^ i ^ ", ks);"), newline, + (*string (" puts(\"SQLCACHE: flushed " ^ i ^ ".\");"), + newline,*) string " return uw_unit_v;", newline, string "}", diff -r 6d56080f495c -r 6e580e319077 tests/fib.ur --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/fib.ur Thu Nov 19 16:02:04 2015 -0500 @@ -0,0 +1,10 @@ +fun fib n = + if n = 0 then + 0 + else if n = 1 then + 1 + else + fib (n - 1) + fib (n - 2) + +fun main n : transaction page = + return {[fib n]}