about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorJune McEnroe <programble@gmail.com>2017-08-02 00:55:52 -0400
committerJune McEnroe <programble@gmail.com>2017-08-02 00:55:52 -0400
commit94a62246be9c8683d623ebe515af98ad698dbad6 (patch)
treee3b4beecfe6b0cd315a5a9379aa90fc68dbdf9d5
parentMadvise RANDOM and NOSYNC (diff)
downloadtorus-94a62246be9c8683d623ebe515af98ad698dbad6.tar.gz
torus-94a62246be9c8683d623ebe515af98ad698dbad6.zip
Split tile access and modify
-rwxr-xr-xserver.c16
-rw-r--r--torus.h4
2 files changed, 17 insertions, 3 deletions
diff --git a/server.c b/server.c
index 97d4230..fc3b3d0 100755
--- a/server.c
+++ b/server.c
@@ -56,11 +56,23 @@ static struct Tile *tileGet(uint32_t tileX, uint32_t tileY) {
         memset(tile->colors, COLOR_WHITE, CELLS_SIZE);
         tile->create = time(NULL);
     }
+    return tile;
+}
+
+static struct Tile *tileAccess(uint32_t tileX, uint32_t tileY) {
+    struct Tile *tile = tileGet(tileX, tileY);
     tile->access = time(NULL);
     tile->accessCount++;
     return tile;
 }
 
+static struct Tile *tileModify(uint32_t tileX, uint32_t tileY) {
+    struct Tile *tile = tileGet(tileX, tileY);
+    tile->modify = time(NULL);
+    tile->modifyCount++;
+    return tile;
+}
+
 static struct Client {
     int fd;
 
@@ -102,7 +114,7 @@ static bool clientSend(const struct Client *client, const struct ServerMessage *
     if (len < 0) return false;
 
     if (msg->type == SERVER_TILE) {
-        struct Tile *tile = tileGet(client->tileX, client->tileY);
+        struct Tile *tile = tileAccess(client->tileX, client->tileY);
         len = send(client->fd, tile, sizeof(*tile), 0);
         if (len < 0) return false;
     }
@@ -227,7 +239,7 @@ static bool clientMove(struct Client *client, int8_t dx, int8_t dy) {
 }
 
 static bool clientPut(const struct Client *client, uint8_t color, char cell) {
-    struct Tile *tile = tileGet(client->tileX, client->tileY);
+    struct Tile *tile = tileModify(client->tileX, client->tileY);
     tile->colors[client->cellY][client->cellX] = color;
     tile->cells[client->cellY][client->cellX] = cell;
 
diff --git a/torus.h b/torus.h
index 9158ef7..6b28f8c 100644
--- a/torus.h
+++ b/torus.h
@@ -27,10 +27,12 @@ enum {
 
 struct Tile {
     time_t create;
-    time_t access;
+    time_t modify;
     char cells[CELL_ROWS][CELL_COLS] ALIGNED(16);
     uint8_t colors[CELL_ROWS][CELL_COLS] ALIGNED(16);
+    uint32_t modifyCount;
     uint32_t accessCount;
+    time_t access;
 } ALIGNED(4096);
 static_assert(sizeof(struct Tile) == 4096, "struct Tile is page-sized");
 static_assert(offsetof(struct Tile, cells) == 16, "stable cells offset");