1/*
2 * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <camkes.h>
8#include <stdio.h>
9#include <string.h>
10#include <platsupport/sync/spinlock.h>
11
12int run(void) {
13    const char *name = get_instance_name();
14
15    printf("%s: Waiting for client init...\n", name);
16    setup_wait();
17
18    printf("%s: Initialising lock...\n", name);
19    sync_spinlock_init((sync_spinlock_t*)&outgoing->lock);
20
21    printf("%s: Notifying receiver...\n", name);
22    init_emit();
23
24    printf("%s: Waiting for data...\n", name);
25    int received = 0;
26    while (!received) {
27        sync_spinlock_lock((sync_spinlock_t*)&incoming->lock);
28        if (incoming->full) {
29            sync_spinlock_lock((sync_spinlock_t*)&outgoing->lock);
30            strcpy((char*)outgoing->data, (char*)incoming->data);
31            outgoing->full = 1;
32            sync_spinlock_unlock((sync_spinlock_t*)&outgoing->lock);
33            received = 1;
34        }
35        sync_spinlock_unlock((sync_spinlock_t*)&incoming->lock);
36    }
37
38    printf("%s: Done.\n", name);
39    return 0;
40}
41