tic-tac-toe: improve event handling 55/15955/1
authorJose Bollo <jose.bollo@iot.bzh>
Wed, 1 Aug 2018 08:24:53 +0000 (10:24 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Thu, 2 Aug 2018 13:49:43 +0000 (15:49 +0200)
Change-Id: Ifba67b4b83650f9b32f78d077d0bbd3d3882238b
Signed-off-by: Jose Bollo <jose.bollo@iot.bzh>
bindings/samples/tic-tac-toe.c

index 2ee251c..c6acb7c 100644 (file)
@@ -64,7 +64,7 @@ static struct board *search_board(int id)
 /*
  * Creates a new board and returns it.
  */
-static struct board *get_new_board(afb_req_t req)
+static struct board *get_new_board()
 {
        /* allocation */
        struct board *board = calloc(1, sizeof *board);
@@ -78,7 +78,6 @@ static struct board *get_new_board(afb_req_t req)
                board->id = (rand() >> 2) % 1000;
        } while(board->id == 0 || search_board(board->id) != NULL);
        board->event = afb_daemon_make_event("board");
-       afb_req_subscribe(req, board->event);
 
        /* link */
        board->next = all_boards;
@@ -86,12 +85,6 @@ static struct board *get_new_board(afb_req_t req)
        return board;
 }
 
-static void *get_new_board_cb(void *closure)
-{
-       afb_req_t req = closure;
-       return get_new_board(req);
-}
-
 /*
  * Release a board
  */
@@ -112,12 +105,6 @@ static void release_board(struct board *board)
        }
 }
 
-static void release_board_cb(void *closure)
-{
-       struct board *board = closure;
-       return release_board(board);
-}
-
 /*
  * Checks who wins
  * Returns zero if there is no winner
@@ -317,6 +304,20 @@ static void changed(struct board *board, const char *reason)
        afb_event_push(board->event, json_object_new_string(reason));
 }
 
+static void *get_new_board_cb(void *closure)
+{
+       afb_req_t req = closure;
+       struct board *board = get_new_board();
+       afb_req_subscribe(req, board->event);
+       return board;
+}
+
+static void release_board_cb(void *closure)
+{
+       struct board *board = closure;
+       return release_board(board);
+}
+
 /*
  * retrieves the board of the request
  */
@@ -491,8 +492,9 @@ static void join(afb_req_t req)
        new_board->use_count++;
 setctx:
        /* set the new board (and leaves the previous one) */
-       afb_req_context(req, 1, NULL, release_board_cb, new_board);
        afb_req_unsubscribe(req, board->event);
+       afb_req_context(req, 1, NULL, release_board_cb, new_board);
+       afb_req_subscribe(req, new_board->event);
 
 success:
        /* replies */