summaryrefslogtreecommitdiff
path: root/test/tx/regression/threadx_event_flag_zero_request_test.c
blob: b4929f78f1539feb79691d6071cb3aef1c2f6a13 (plain)
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/***************************************************************************
 * Copyright (c) 2026 Eclipse ThreadX contributors
 *
 * This program and the accompanying materials are made available under the
 * terms of the MIT License which is available at
 * https://opensource.org/licenses/MIT.
 *
 * AI Disclosure: This file was largely AI-generated by Claude Code (Opus 5).
 * The AI-generated portions may be considered public domain (CC0-1.0)
 * and not subject to the project's licence. The human contributor has
 * reviewed and verified that the code is correct.
 *
 * SPDX-License-Identifier: MIT and CC0-1.0
 **************************************************************************/

/* This test asks an event flags group for no flags at all, with a wait option.

   A request of zero flags is never satisfied, whichever option carries it: an
   OR request finds none of the flags it asked for present, and an AND request
   has its empty result rejected for not matching the empty set it asked for. A
   thread that suspended on such a request would therefore never be resumed, so
   the get service refuses the suspension and reports that no events are
   available.  */

#include   <stdio.h>
#include   "tx_api.h"


static unsigned long   thread_0_counter =  0;
static TX_THREAD       thread_0;

static TX_EVENT_FLAGS_GROUP  group_0;


/* Define thread prototypes.  */

static void    thread_0_entry(ULONG thread_input);


/* Prototype for test control return.  */

void  test_control_return(UINT status);


/* Define what the initial system looks like.  */

#ifdef CTEST
void test_application_define(void *first_unused_memory)
#else
void    threadx_event_flag_zero_request_application_define(void *first_unused_memory)
#endif
{

UINT    status;
CHAR    *pointer;


    /* Put first available memory address into a character pointer.  */
    pointer =  (CHAR *) first_unused_memory;

    /* Put system definition stuff in here, e.g. thread creates and other assorted
       create information.  */
    status =  tx_thread_create(&thread_0, "thread 0", thread_0_entry, 1,
            pointer, TEST_STACK_SIZE_PRINTF,
            16, 16, TX_NO_TIME_SLICE, TX_AUTO_START);
    pointer =  pointer + TEST_STACK_SIZE_PRINTF;

    /* Check for status.  */
    if (status != TX_SUCCESS)
    {

        printf("Running Event Flag Zero Request Test............................... ERROR #1\n");
        test_control_return(1);
    }

    /* Create the group the test asks for no flags from.  */
    status =  tx_event_flags_create(&group_0, "group 0");

    /* Check for status.  */
    if (status != TX_SUCCESS)
    {

        printf("Running Event Flag Zero Request Test............................... ERROR #2\n");
        test_control_return(1);
    }
}


/* Define the test thread.  */

static void    thread_0_entry(ULONG thread_input)
{

UINT    status;
ULONG   actual_flags;


    /* Increment thread 0 counter.  */
    thread_0_counter++;

    /* Inform user of success getting to this test.  */
    printf("Running Event Flag Zero Request Test............................... ");

    /* Raise a flag, so that every request below is refused for asking for
       nothing rather than for finding the group empty.  */
    status =  tx_event_flags_set(&group_0, 0x1, TX_OR);

    if (status != TX_SUCCESS)
    {

        printf("ERROR #3\n");
        test_control_return(1);
    }

    /* Ask for no flags under TX_OR, prepared to wait forever. Nothing can ever
       satisfy the request, so the service returns rather than suspending.  */
    status =  tx_event_flags_get(&group_0, 0, TX_OR, &actual_flags, TX_WAIT_FOREVER);

    if (status != TX_NO_EVENTS)
    {

        printf("ERROR #4\n");
        test_control_return(1);
    }

    /* The same under TX_AND, where the empty result is rejected for not
       matching the empty request.  */
    status =  tx_event_flags_get(&group_0, 0, TX_AND, &actual_flags, TX_WAIT_FOREVER);

    if (status != TX_NO_EVENTS)
    {

        printf("ERROR #5\n");
        test_control_return(1);
    }

    /* The consuming options are refused in the same place, so neither of them
       reaches the code that would clear anything.  */
    status =  tx_event_flags_get(&group_0, 0, TX_OR_CLEAR, &actual_flags, TX_WAIT_FOREVER);

    if (status != TX_NO_EVENTS)
    {

        printf("ERROR #6\n");
        test_control_return(1);
    }

    status =  tx_event_flags_get(&group_0, 0, TX_AND_CLEAR, &actual_flags, TX_WAIT_FOREVER);

    if (status != TX_NO_EVENTS)
    {

        printf("ERROR #7\n");
        test_control_return(1);
    }

    /* The flag raised at the start is still set, so no refused request
       consumed anything.  */
    status =  tx_event_flags_get(&group_0, 0x1, TX_OR_CLEAR, &actual_flags, TX_NO_WAIT);

    if ((status != TX_SUCCESS) || (actual_flags != 0x1))
    {

        printf("ERROR #8\n");
        test_control_return(1);
    }

    printf("SUCCESS!\n");
    test_control_return(0);
}