--- freem/src/global_bltin.c 2025/04/11 16:52:05 1.19 +++ freem/src/global_bltin.c 2025/04/11 18:24:32 1.20 @@ -1,5 +1,5 @@ /* - * $Id: global_bltin.c,v 1.19 2025/04/11 16:52:05 snw Exp $ + * $Id: global_bltin.c,v 1.20 2025/04/11 18:24:32 snw Exp $ * freem database engine * * @@ -24,6 +24,9 @@ * along with FreeM. If not, see . * * $Log: global_bltin.c,v $ + * Revision 1.20 2025/04/11 18:24:32 snw + * Fix bug in memory cache + * * Revision 1.19 2025/04/11 16:52:05 snw * Fix indentation in global handler * @@ -499,9 +502,8 @@ int gbl_read_block(global_handle *g, uns g->use_count++; - fstat (g->fd, &gstat); if (!g->locked) gbl_lock (g, 1); - + fstat (g->fd, &gstat); if ((g->last_block == blocknum) && (g->have_cached_block) && @@ -509,7 +511,6 @@ int gbl_read_block(global_handle *g, uns (gstat.st_mtime < g->last_read_time)) { /* the global has not been modified since the last read; grab from memory */ g->memory_reads++; - g->last_read_time = time (0L); memcpy (block, g->last_block_accessed, g->header.block_size); } else { @@ -520,14 +521,14 @@ int gbl_read_block(global_handle *g, uns /* update cache */ memcpy (g->last_block_accessed, block, g->header.block_size); g->have_cached_block = TRUE; - g->last_read_time = time (0L); - g->cached_block_num = blocknum; - + g->cached_block_num = blocknum; g->last_block = blocknum; - g->use_count++; g->read_ops++; } + g->last_read_time = time (0L); + g->use_count++; + if (g->locked) gbl_unlock (g); return TRUE; @@ -1158,7 +1159,7 @@ reopen: if (action == get_sym) { - tfast0: +tfast0: gbl_lock (g, 3); if (g->fast_path > 0) goto tfast1; /* try again last block */ @@ -1168,7 +1169,7 @@ reopen: for (;;) { - tfast1: +tfast1: gbl_read_block (g, blknbr, block); /* temporarily disabled @@ -2604,36 +2605,12 @@ s10: } case killone: - { if (found == 2) goto killo; /* entry found use normal kill routine */ goto quit; } - case merge_sym: - - printf("MERGE NOT IMPLEMENTED FOR GLOBALS\n"); - -#ifdef DEBUG_GBL - - int loop; - - printf ("DEBUG MERGE: "); - printf ("[key] is ["); - - for (loop = 0; key[loop] != EOL; loop++) printf ("%c", (key[loop] == DELIM) ? '!' : key[loop]); - - printf ("]\r\n"); - printf ("[data] is ["); - - for(loop = 0; data[loop] != EOL; loop++) printf ("%c", (data[loop] == DELIM) ? '!' : data[loop]); - - printf("]\r\n"); - -#endif - return; - default: merr_raise (INVREF); /* accidental call with wrong action code (v22-stuff) */