summaryrefslogtreecommitdiffstats
path: root/testsuites/libtests/block08/bdbuf_test1_5.c
blob: 11ad87a09736f9be0abf395076e74b407d2c17bc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*! @file
 * @brief Check how rtems_bdbuf_read() handles read request
 * for a buffer that is owned by an application.
 *
 * Test sequence:
 * -# Call rtems_bdbuf_read() function in thread #1 and 
 *    provide successful read complete notification for this operation.
 *    As the result rtems_bdbuf_read() returns RTEMS_SUCCESSFUL
 *    in thread #1.
 * -# In thread #2 call rtems_bdbuf_read() function for the same
 *    block number. A buffer for this block is owned by an application
 *    and as the result thread #2 block on this function.
 * -# Call rtems_bdbuf_release() function in thread #1 in order to give
 *    it back under control of bdbuf library.
 * -# Buffer now is ready to be returned for another application and
 *    as the result rtems_bdbuf_read() unblocks and returns 
 *    RTEMS_SUCCESSFUL in thread #2.
 * -# Call rtems_bdbuf_release() function in thread #2.
 *
 * Copyright (C) 2010 OKTET Labs, St.-Petersburg, Russia
 * Author: Oleg Kravtsov <Oleg.Kravtsov@oktetlabs.ru>
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.com/license/LICENSE.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <bdbuf_tests.h>

static rtems_task bdbuf_test1_5_thread1(rtems_task_argument arg);
static rtems_task bdbuf_test1_5_thread2(rtems_task_argument arg);

#define TEST_BLK_NUM 50

void
bdbuf_test1_5_main()
{
    bdbuf_test_msg msg;

    TEST_START("Test 1.5");

    START_THREAD(1, bdbuf_test1_5_thread1);
    START_THREAD(2, bdbuf_test1_5_thread2);

    /*
     * Step 1:
     * Thread #1 calls rtems_bdbuf_read() and successfully
     * get requested buffer.
     */
    WAIT_DRV_MSG(&msg);
    SEND_DRV_MSG(0, 0, RTEMS_SUCCESSFUL, 0);

    WAIT_THREAD_SYNC(1);
    TEST_CHECK_RESULT("1");
    
    /*
     * Step 2:
     * Thread #2 calls rtems_bdbuf_read() and blocks
     * on this call because thread #1 owns a buffer.
     */
    CONTINUE_THREAD(2);

    /* Make sure thread #2 managed to block on a read request. */
    CHECK_THREAD_BLOCKED(2);

    /*
     * Step 3:
     * Now thread #1 releases a buffer.
     */
    CONTINUE_THREAD(1);

    /*
     * Step 4:
     * Thread #2 should unblock now and get the buffer.
     */
    WAIT_THREAD_SYNC(2);
    TEST_CHECK_RESULT("4");

    /*
     * Step 5:
     * Thread #2 release buffer.
     */
    CONTINUE_THREAD(2);
    
    TEST_END();
}

static rtems_task
bdbuf_test1_5_thread1(rtems_task_argument arg)
{
    rtems_status_code   rc;
    rtems_bdbuf_buffer *bd = NULL;

    /*
     * Step 1:
     * read blk #N on thread #1
     */
    rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
    if (rc != RTEMS_SUCCESSFUL)
    {
        TEST_FAILED();
    }
    CONTINUE_MAIN(1);

    /*
     * Step 3:
     * Release buffer returned on step 1.
     */
    rc = rtems_bdbuf_release(bd);
    if (rc != RTEMS_SUCCESSFUL)
    {
        TEST_FAILED();
    }
    THREAD_END();
}

static rtems_task
bdbuf_test1_5_thread2(rtems_task_argument arg)
{
    rtems_status_code   rc;
    rtems_bdbuf_buffer *bd = NULL;

    WAIT_MAIN_SYNC(2);

    /*
     * Step 2:
     * Try to read block #N. Right now thread #1 owns
     * this buffer, so we will block waiting for buffer.
     */
    rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
    if (rc != RTEMS_SUCCESSFUL)
    {
        TEST_FAILED();
    }
    CONTINUE_MAIN(2);

    rc = rtems_bdbuf_release(bd);
    if (rc != RTEMS_SUCCESSFUL)
    {
        TEST_FAILED();
    }
    THREAD_END();
}