mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'bugfix/fix_select_timeout_v4.4' into 'release/v4.4'
VFS: `select` function's timeout is now POSIX compliant (and fix eventfd example) (backport v4.4) See merge request espressif/esp-idf!16189
This commit is contained in:
commit
ff3922d217
@ -1,16 +1,8 @@
|
||||
// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef __ESP_VFS_H__
|
||||
#define __ESP_VFS_H__
|
||||
@ -410,7 +402,8 @@ int esp_vfs_utime(const char *path, const struct utimbuf *times);
|
||||
* @param timeout If not NULL, then points to timeval structure which
|
||||
* specifies the time period after which the functions should
|
||||
* time-out and return. If it is NULL, then the function will
|
||||
* not time-out.
|
||||
* not time-out. Note that the timeout period is rounded up to
|
||||
* the system tick and incremented by one.
|
||||
*
|
||||
* @return The number of descriptors set in the descriptor sets, or -1
|
||||
* when an error (specified by errno) have occurred.
|
||||
|
@ -1,16 +1,8 @@
|
||||
// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -1028,8 +1020,14 @@ int esp_vfs_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds
|
||||
|
||||
TickType_t ticks_to_wait = portMAX_DELAY;
|
||||
if (timeout) {
|
||||
uint32_t timeout_ms = timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
|
||||
ticks_to_wait = timeout_ms / portTICK_PERIOD_MS;
|
||||
uint32_t timeout_ms = (timeout->tv_sec * 1000) + (timeout->tv_usec / 1000);
|
||||
/* Round up the number of ticks.
|
||||
* Not only we need to round up the number of ticks, but we also need to add 1.
|
||||
* Indeed, `select` function shall wait for AT LEAST timeout, but on FreeRTOS,
|
||||
* if we specify a timeout of 1 tick to `xSemaphoreTake`, it will take AT MOST
|
||||
* 1 tick before triggering a timeout. Thus, we need to pass 2 ticks as a timeout
|
||||
* to `xSemaphoreTake`. */
|
||||
ticks_to_wait = ((timeout_ms + portTICK_PERIOD_MS - 1) / portTICK_PERIOD_MS) + 1;
|
||||
ESP_LOGD(TAG, "timeout is %dms", timeout_ms);
|
||||
}
|
||||
ESP_LOGD(TAG, "waiting without calling socket_select");
|
||||
|
@ -39,36 +39,36 @@ See the Getting Started Guide for full steps to configure and use ESP-IDF to bui
|
||||
The following log output should appear when the example runs (note that the bootloader log has been omitted).
|
||||
|
||||
```
|
||||
I (4310) eventfd_example: Time: 1.99s
|
||||
I (4310) eventfd_example: Select timeout
|
||||
I (4310) eventfd_example: =================================
|
||||
I (4310) eventfd_example: Select timeouted for 1 times
|
||||
I (4320) eventfd_example: Timer triggerred for 0 times
|
||||
I (4320) eventfd_example: Progress triggerred for 0 times
|
||||
I (4330) eventfd_example: =================================
|
||||
I (4810) eventfd_example: Time: 2.50s
|
||||
I (4810) eventfd_example: TimerEvent fd event triggered
|
||||
I (5810) eventfd_example: Time: 3.49s
|
||||
I (5810) eventfd_example: Progress fd event triggered
|
||||
I (7310) eventfd_example: Time: 5.00s
|
||||
I (7310) eventfd_example: TimerEvent fd event triggered
|
||||
I (9310) eventfd_example: Time: 6.99s
|
||||
I (9310) eventfd_example: Select timeout
|
||||
I (9310) eventfd_example: Time: 6.99s
|
||||
I (9310) eventfd_example: Progress fd event triggered
|
||||
I (9810) eventfd_example: Time: 7.50s
|
||||
I (9810) eventfd_example: TimerEvent fd event triggered
|
||||
I (11810) eventfd_example: Time: 9.49s
|
||||
I (11810) eventfd_example: Select timeout
|
||||
I (12310) eventfd_example: Time: 10.00s
|
||||
I (12310) eventfd_example: TimerEvent fd event triggered
|
||||
I (12810) eventfd_example: Time: 10.49s
|
||||
I (12810) eventfd_example: Progress fd event triggered
|
||||
I (14810) eventfd_example: Time: 12.49s
|
||||
I (14810) eventfd_example: Select timeout
|
||||
I (14810) eventfd_example: =================================
|
||||
I (14810) eventfd_example: Select timeouted for 4 times
|
||||
I (14820) eventfd_example: Timer triggerred for 4 times
|
||||
I (14820) eventfd_example: Progress triggerred for 3 times
|
||||
I (14830) eventfd_example: =================================
|
||||
I (4340) eventfd_example: Elapsed since test start: 2003 ms
|
||||
I (4340) eventfd_example: Select timeout
|
||||
I (4830) eventfd_example: Elapsed since test start: 2499 ms
|
||||
I (4830) eventfd_example: TimerEvent fd event triggered
|
||||
I (5830) eventfd_example: Elapsed since test start: 3493 ms
|
||||
I (5830) eventfd_example: Progress fd event triggered
|
||||
I (7330) eventfd_example: Elapsed since test start: 4999 ms
|
||||
I (7330) eventfd_example: TimerEvent fd event triggered
|
||||
I (7330) eventfd_example: =================================
|
||||
I (7340) eventfd_example: Select timeouted for 1 times
|
||||
I (7340) eventfd_example: Timer triggerred for 2 times
|
||||
I (7350) eventfd_example: Progress triggerred for 1 times
|
||||
I (7360) eventfd_example: =================================
|
||||
I (9330) eventfd_example: Elapsed since test start: 6993 ms
|
||||
I (9330) eventfd_example: Progress fd event triggered
|
||||
I (9830) eventfd_example: Elapsed since test start: 7499 ms
|
||||
I (9830) eventfd_example: TimerEvent fd event triggered
|
||||
I (11840) eventfd_example: Elapsed since test start: 9503 ms
|
||||
I (11840) eventfd_example: Select timeout
|
||||
I (12330) eventfd_example: Elapsed since test start: 9999 ms
|
||||
I (12330) eventfd_example: TimerEvent fd event triggered
|
||||
I (12330) eventfd_example: =================================
|
||||
I (12340) eventfd_example: Select timeouted for 2 times
|
||||
I (12340) eventfd_example: Timer triggerred for 4 times
|
||||
I (12350) eventfd_example: Progress triggerred for 2 times
|
||||
I (12360) eventfd_example: =================================
|
||||
```
|
||||
|
||||
## Diagram
|
||||
|
||||
The following diagram shows, with a timeline, the order of the events:
|
||||
|
||||
![Timeline](timeline.svg)
|
||||
|
@ -15,14 +15,23 @@ def test_examples_eventfd(env, extra_data):
|
||||
|
||||
dut.expect('cpu_start: Starting scheduler', timeout=30)
|
||||
|
||||
exp_list = [
|
||||
'eventfd_example: Select timeouted for 4 times',
|
||||
'eventfd_example: Timer triggerred for 4 times',
|
||||
'eventfd_example: Progress triggerred for 3 times',
|
||||
exp_list_5seconds = [
|
||||
'eventfd_example: Select timeouted for 1 times',
|
||||
'eventfd_example: Timer triggerred for 2 times',
|
||||
'eventfd_example: Progress triggerred for 1 times',
|
||||
]
|
||||
|
||||
Utility.console_log('Expecting:{}{}'.format(os.linesep, os.linesep.join(exp_list)))
|
||||
dut.expect_all(*exp_list, timeout=60)
|
||||
exp_list_10seconds = [
|
||||
'eventfd_example: Select timeouted for 2 times',
|
||||
'eventfd_example: Timer triggerred for 4 times',
|
||||
'eventfd_example: Progress triggerred for 2 times',
|
||||
]
|
||||
|
||||
Utility.console_log('Expecting:{}{}'.format(os.linesep, os.linesep.join(exp_list_5seconds)))
|
||||
dut.expect_all(*exp_list_5seconds, timeout=60)
|
||||
|
||||
Utility.console_log('Expecting:{}{}'.format(os.linesep, os.linesep.join(exp_list_10seconds)))
|
||||
dut.expect_all(*exp_list_10seconds, timeout=60)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
@ -28,11 +28,15 @@
|
||||
#define PROGRESS_INTERVAL_MS 3500
|
||||
#define TIMER_SIGNAL 1
|
||||
#define PROGRESS_SIGNAL 2
|
||||
/* Print the signals value a bit before 5 seconds, else, `select` would run again
|
||||
* and the following print may happen 2 seconds (timeout value) later. */
|
||||
#define PRINT_INTERVAL_MSEC 4990
|
||||
|
||||
static const char *TAG = "eventfd_example";
|
||||
|
||||
int s_timer_fd;
|
||||
int s_progress_fd;
|
||||
static int s_timer_fd;
|
||||
static int s_progress_fd;
|
||||
static TaskHandle_t s_worker_handle;
|
||||
|
||||
static bool eventfd_timer_isr_callback(void *arg)
|
||||
{
|
||||
@ -78,6 +82,9 @@ static void eventfd_timer_init(int timer_idx, double timer_interval_sec)
|
||||
|
||||
static void worker_task(void *arg)
|
||||
{
|
||||
/* Wait for the collector to be ready. */
|
||||
ulTaskNotifyTake(true, portMAX_DELAY);
|
||||
|
||||
while (true) {
|
||||
vTaskDelay(pdMS_TO_TICKS(PROGRESS_INTERVAL_MS));
|
||||
uint64_t signal = PROGRESS_SIGNAL;
|
||||
@ -102,7 +109,12 @@ static void collector_task(void *arg)
|
||||
int timer_trigger_count = 0;
|
||||
int progress_trigger_count = 0;
|
||||
|
||||
for (size_t i = 0; ; i++) {
|
||||
/* Notify the worker we are ready to catch the signals */
|
||||
assert( xTaskNotifyGive(s_worker_handle) == pdPASS );
|
||||
uint64_t start = esp_timer_get_time();
|
||||
uint64_t previous = start;
|
||||
|
||||
while (1) {
|
||||
struct timeval timeout;
|
||||
uint64_t signal;
|
||||
|
||||
@ -117,9 +129,7 @@ static void collector_task(void *arg)
|
||||
int num_triggered = select(maxFd + 1, &readfds, NULL, NULL, &timeout);
|
||||
assert(num_triggered >= 0);
|
||||
|
||||
uint64_t task_counter_value;
|
||||
timer_get_counter_value(TIMER_GROUP_0, TIMER_0, &task_counter_value);
|
||||
ESP_LOGI(TAG, "Time: %.2fs", (double)task_counter_value / TIMER_SCALE);
|
||||
ESP_LOGI(TAG, "Elapsed since test start: %lld ms", (esp_timer_get_time() - start) / 1000);
|
||||
|
||||
if (FD_ISSET(s_progress_fd, &readfds)) {
|
||||
ssize_t ret = read(s_progress_fd, &signal, sizeof(signal));
|
||||
@ -140,13 +150,16 @@ static void collector_task(void *arg)
|
||||
ESP_LOGI(TAG, "Select timeout");
|
||||
}
|
||||
|
||||
if (i % 10 == 0) {
|
||||
/* Print information about received events every PRINT_INTERVAL_MSEC milliseconds. */
|
||||
const uint64_t current = esp_timer_get_time();
|
||||
const uint64_t elapsed = current - previous;
|
||||
if (elapsed >= PRINT_INTERVAL_MSEC * 1000) {
|
||||
ESP_LOGI(TAG, "=================================");
|
||||
ESP_LOGI(TAG, "Select timeouted for %d times", select_timeout_count);
|
||||
ESP_LOGI(TAG, "Timer triggerred for %d times", timer_trigger_count);
|
||||
ESP_LOGI(TAG, "Progress triggerred for %d times", progress_trigger_count);
|
||||
ESP_LOGI(TAG, "=================================");
|
||||
|
||||
previous = current;
|
||||
}
|
||||
}
|
||||
|
||||
@ -160,6 +173,7 @@ static void collector_task(void *arg)
|
||||
void app_main(void)
|
||||
{
|
||||
eventfd_timer_init(TIMER_0, TIMER_INTERVAL_SEC);
|
||||
xTaskCreate(worker_task, "worker_task", 4 * 1024, NULL, 5, NULL);
|
||||
/* Save the handle for this task as we will need to notify it */
|
||||
xTaskCreate(worker_task, "worker_task", 4 * 1024, NULL, 5, &s_worker_handle);
|
||||
xTaskCreate(collector_task, "collector_task", 4 * 1024, NULL, 5, NULL);
|
||||
}
|
||||
|
657
examples/system/eventfd/timeline.svg
Normal file
657
examples/system/eventfd/timeline.svg
Normal file
@ -0,0 +1,657 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Do not edit this file with editors other than diagrams.net -->
|
||||
|
||||
<svg
|
||||
xmlns:xhtml="http://www.w3.org/1999/xhtml"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
width="4956px"
|
||||
height="1456px"
|
||||
viewBox="-0.5 -0.5 4956 1456"
|
||||
content="<mxfile host="app.diagrams.net" modified="2021-11-03T11:27:57.253Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 OPR/72.0.3815.211" etag="31FTqR3pTOimErZ8YlCm" version="15.3.8"><diagram id="Ny-u50C1Y_O5pEz-cxN1" name="Page-1">7ZxRc6I6FMc/jY87AwQQH7du9/blbjvT3dnnFKIyi8QJoer99DcpQYVjlzamEal9qZ7AHz2/nJBzEhyh6XLzD8Orxb80IdnIc5LNCH0beeIvcsQ/adlWljAIK8OcpUllcveGx/Q/oozqvHmZJqRoHMgpzXi6ahpjmuck5g0bZoyum4fNaNa86grPCTA8xjiD1t9pwhfKGjrOvuGOpPOFuvSkblji+mBlKBY4oesDE7odoSmjlFevlpspyaTzar9U531/pXX3wRjJ+VtOuJ8+bO7u7le/+Pge/8hnt1EWfQlRJfOMs1J9Y/Vp+bZ2AaNlnhCp4o7QzXqRcvK4wrFsXQvowrbgy0w14yyd5+J1RmbiU90odcI42bz6ud2dN0Q3InRJONuKQ9QJY+W/bfPtek9jMlG2xQEIrzZi1QPmO+W9k8QL5ad3+OwNLiN58lV2PvEuznBRpHHTS9UJJAF9r9MpB187OPKtaxsjGebpc1P+mCfUFR5oKi6887nrNJ3uhkFToqAli4k667DTASHUocQxmxMOlF7I7L63Piz/XbBympMmqVmaZVOaUfZyLJpFMYklzIIz+occtDxFgS+8X7fUg4V/CbSjFqOxLu22UGAXdnAi7N6DaoelNqi20BtBCdfh7cFhK3lA8f5xZM+9UjTaC0KzIZ8EJEr8YyEfeU8oDC8y5D1TPQkIWQ756Aq7EzYyBRsIWYY9ucLuhO2bgg2ELMOuM8Ar7b/QDkzRBkK2abtX2p20wzakSJM2ELKclbnelXYn7bGp2AZCtmP7fRWTz0k7MlVyAUK+ZdqGSy6DpD0xFdtAyHZsn1pz+Qy0Xcdg4ebMvE3nYJhEs6MF1TCOyNPsInmL3MkMbiBkmbZnOgcbIm3UrnrrzsqBkOVZuWc6Bxsi7cAzFNtAyHZsm87Bhkg7DA3RBkK2aZvOwYZIG6ROuiN5ZzL30bRN52BDpD0xNUsDQrZjG87JgwLw5mTDm5CbMFUnOCSvTPWenlhwI8J+I/fzpDHOvqqGZZok8jJHNwfttw85ZjYEee1pUp2DHnQb/0i3qe+35jcEGc6BtTaZxCV73m3SogJByqV/AucCIrFz4qs9g7Zc+0LjHvSEvtP2TW03AkKWx11kuBaiRfvCQr1z5Ul7CctyqNd3mGuo/20Jy1SoAyHLoe4bLo0MknZkijYQsk3b8BbCQdJu7+0Uwnq0gZBjmbbhSdtQl7CakHRLI0DI9gMBpneMDrE00oaEXFO0J5Zpwyn6I8nkg2Kew9MloSUH9E8vlKiHn85bJnHdV4bVgy7kHX1y6qPqJAGcMv8UDJg8T1aWWLn6PDRCSMMuDDijfWB0zkhRyKHpmeSfh8Xk3Cy8E+9Jfb+fgAcHtJfINbP+1x9cMv4MGlxoc50BV+NBEe7c1fjg1LWvvgcT2KqvG0xAqH/BBFdWhryyFfYulk4thPQ9lsDWeN1YAkL9iyVY5vCGfGMCRcSzB9OplYe+BxPYi64bTECod8EU9mE9QIbqfXP578JWA0F5qF3o164zIbt1phBmcD/r8pKTU/7iKhwvxADnOU8kxmVBpKZsSGXCXQ9/nlOuRvI3jmRf2hacLOW7NP7zAQN1P5NxBIdphMyM0+Lt/veWKvT7X61Ct/8D</diagram></mxfile>"
|
||||
style="background-color: rgb(255, 255, 255);"
|
||||
id="svg144"
|
||||
sodipodi:docname="timeline.svg"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
|
||||
<metadata
|
||||
id="metadata148">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="780"
|
||||
inkscape:window-height="480"
|
||||
id="namedview146"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.070016142"
|
||||
inkscape:cx="2478"
|
||||
inkscape:cy="728"
|
||||
inkscape:window-x="72"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg144" />
|
||||
<defs
|
||||
id="defs2" />
|
||||
<g
|
||||
id="g134">
|
||||
<rect
|
||||
x="0"
|
||||
y="0"
|
||||
width="4950"
|
||||
height="1450"
|
||||
rx="217.5"
|
||||
ry="217.5"
|
||||
fill="#ffffff"
|
||||
stroke="#000000"
|
||||
stroke-width="5"
|
||||
pointer-events="all"
|
||||
id="rect4" />
|
||||
<path
|
||||
d="M 150 475 L 4768.16 475"
|
||||
fill="none"
|
||||
stroke="#000000"
|
||||
stroke-width="5"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path6" />
|
||||
<path
|
||||
d="M 4794.41 475 L 4759.41 492.5 L 4768.16 475 L 4759.41 457.5 Z"
|
||||
fill="#000000"
|
||||
stroke="#000000"
|
||||
stroke-width="5"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="all"
|
||||
id="path8" />
|
||||
<path
|
||||
d="M 550 525 L 550 425"
|
||||
fill="none"
|
||||
stroke="#b85450"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path10" />
|
||||
<path
|
||||
d="M 150 525 L 150 500 Q 150 475 150 450 L 150 425"
|
||||
fill="none"
|
||||
stroke="#000000"
|
||||
stroke-width="5"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path12" />
|
||||
<path
|
||||
d="M 650 525 L 650 425"
|
||||
fill="none"
|
||||
stroke="#82b366"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path14" />
|
||||
<path
|
||||
d="M 1150 525 L 1150 425"
|
||||
fill="none"
|
||||
stroke="#82b366"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path16" />
|
||||
<path
|
||||
d="M 1650 525 L 1650 425"
|
||||
fill="none"
|
||||
stroke="#82b366"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path18" />
|
||||
<path
|
||||
d="M 2150 525 L 2150 425"
|
||||
fill="none"
|
||||
stroke="#82b366"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path20" />
|
||||
<path
|
||||
d="M 2650 575 L 2650 475"
|
||||
fill="none"
|
||||
stroke="#82b366"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path22" />
|
||||
<path
|
||||
d="M 3150 525 L 3150 425"
|
||||
fill="none"
|
||||
stroke="#82b366"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path24" />
|
||||
<path
|
||||
d="M 3650 475 L 3650 375"
|
||||
fill="none"
|
||||
stroke="#82b366"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path26" />
|
||||
<path
|
||||
d="M 4150 525 L 4150 425"
|
||||
fill="none"
|
||||
stroke="#82b366"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path28" />
|
||||
<path
|
||||
d="M 4650 525 L 4650 425"
|
||||
fill="none"
|
||||
stroke="#82b366"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path30" />
|
||||
<path
|
||||
d="M 850 525 L 850 425"
|
||||
fill="none"
|
||||
stroke="#6c8ebf"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path32" />
|
||||
<path
|
||||
d="M 1550 575 L 1550 475"
|
||||
fill="none"
|
||||
stroke="#6c8ebf"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path34" />
|
||||
<path
|
||||
d="M 2250 525 L 2250 425"
|
||||
fill="none"
|
||||
stroke="#6c8ebf"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path36" />
|
||||
<path
|
||||
d="M 2950 525 L 2950 425"
|
||||
fill="none"
|
||||
stroke="#6c8ebf"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path38" />
|
||||
<path
|
||||
d="M 3650 575 L 3650 475"
|
||||
fill="none"
|
||||
stroke="#6c8ebf"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path40" />
|
||||
<path
|
||||
d="M 4350 525 L 4350 425"
|
||||
fill="none"
|
||||
stroke="#6c8ebf"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path42" />
|
||||
<rect
|
||||
x="1050"
|
||||
y="225"
|
||||
width="200"
|
||||
height="100"
|
||||
fill="none"
|
||||
stroke="none"
|
||||
pointer-events="all"
|
||||
id="rect44" />
|
||||
<g
|
||||
transform="translate(-0.5 -0.5)scale(5)"
|
||||
id="g50">
|
||||
<switch
|
||||
id="switch48">
|
||||
<foreignObject
|
||||
pointer-events="none"
|
||||
width="100%"
|
||||
height="100%"
|
||||
requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"
|
||||
style="overflow: visible; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 55px; margin-left: 211px;">
|
||||
<xhtml:div
|
||||
style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<xhtml:div
|
||||
style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">5s</xhtml:div>
|
||||
</xhtml:div>
|
||||
</xhtml:div>
|
||||
</foreignObject>
|
||||
<text
|
||||
x="230"
|
||||
y="59"
|
||||
fill="#000000"
|
||||
font-family="Helvetica"
|
||||
font-size="12px"
|
||||
text-anchor="middle"
|
||||
id="text46">5s</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path
|
||||
d="M 1550 475 Q 1550 475 1550 375"
|
||||
fill="none"
|
||||
stroke="#b85450"
|
||||
stroke-opacity="0.5"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path52" />
|
||||
<path
|
||||
d="M 2050 525 L 2050 425"
|
||||
fill="none"
|
||||
stroke="#b85450"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path54" />
|
||||
<path
|
||||
d="M 2650 475 L 2650 375"
|
||||
fill="none"
|
||||
stroke="#b85450"
|
||||
stroke-opacity="0.5"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path56" />
|
||||
<path
|
||||
d="M 3550 525 L 3550 425"
|
||||
fill="none"
|
||||
stroke="#b85450"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path58" />
|
||||
<path
|
||||
d="M 4050 525 L 4050 425"
|
||||
fill="none"
|
||||
stroke="#b85450"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path60" />
|
||||
<path
|
||||
d="M 150 775 L 150 675"
|
||||
fill="none"
|
||||
stroke="#b85450"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path62" />
|
||||
<path
|
||||
d="M 150 1075 L 150 975"
|
||||
fill="none"
|
||||
stroke="#82b366"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path64" />
|
||||
<path
|
||||
d="M 150 1225 L 150 1125"
|
||||
fill="none"
|
||||
stroke="#6c8ebf"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path66" />
|
||||
<rect
|
||||
x="200"
|
||||
y="675"
|
||||
width="1450"
|
||||
height="100"
|
||||
fill="none"
|
||||
stroke="none"
|
||||
pointer-events="all"
|
||||
id="rect68" />
|
||||
<g
|
||||
transform="translate(-0.5 -0.5)scale(5)"
|
||||
id="g74">
|
||||
<switch
|
||||
id="switch72">
|
||||
<foreignObject
|
||||
pointer-events="none"
|
||||
width="100%"
|
||||
height="100%"
|
||||
requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"
|
||||
style="overflow: visible; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 288px; height: 1px; padding-top: 145px; margin-left: 42px;">
|
||||
<xhtml:div
|
||||
style="box-sizing: border-box; font-size: 0px; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Select timeout</xhtml:div>
|
||||
</xhtml:div>
|
||||
</xhtml:div>
|
||||
</foreignObject>
|
||||
<text
|
||||
x="42"
|
||||
y="149"
|
||||
fill="#000000"
|
||||
font-family="Helvetica"
|
||||
font-size="12px"
|
||||
id="text70">Select timeout</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect
|
||||
x="200"
|
||||
y="975"
|
||||
width="450"
|
||||
height="100"
|
||||
fill="none"
|
||||
stroke="none"
|
||||
pointer-events="all"
|
||||
id="rect76" />
|
||||
<g
|
||||
transform="translate(-0.5 -0.5)scale(5)"
|
||||
id="g82">
|
||||
<switch
|
||||
id="switch80">
|
||||
<foreignObject
|
||||
pointer-events="none"
|
||||
width="100%"
|
||||
height="100%"
|
||||
requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"
|
||||
style="overflow: visible; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 88px; height: 1px; padding-top: 205px; margin-left: 42px;">
|
||||
<xhtml:div
|
||||
style="box-sizing: border-box; font-size: 0px; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Timer interrupt</xhtml:div>
|
||||
</xhtml:div>
|
||||
</xhtml:div>
|
||||
</foreignObject>
|
||||
<text
|
||||
x="42"
|
||||
y="209"
|
||||
fill="#000000"
|
||||
font-family="Helvetica"
|
||||
font-size="12px"
|
||||
id="text78">Timer interrupt</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect
|
||||
x="200"
|
||||
y="1125"
|
||||
width="450"
|
||||
height="100"
|
||||
fill="none"
|
||||
stroke="none"
|
||||
pointer-events="all"
|
||||
id="rect84" />
|
||||
<g
|
||||
transform="translate(-0.5 -0.5)scale(5)"
|
||||
id="g90">
|
||||
<switch
|
||||
id="switch88">
|
||||
<foreignObject
|
||||
pointer-events="none"
|
||||
width="100%"
|
||||
height="100%"
|
||||
requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"
|
||||
style="overflow: visible; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 88px; height: 1px; padding-top: 235px; margin-left: 42px;">
|
||||
<xhtml:div
|
||||
style="box-sizing: border-box; font-size: 0px; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Progress event</xhtml:div>
|
||||
</xhtml:div>
|
||||
</xhtml:div>
|
||||
</foreignObject>
|
||||
<text
|
||||
x="42"
|
||||
y="239"
|
||||
fill="#000000"
|
||||
font-family="Helvetica"
|
||||
font-size="12px"
|
||||
id="text86">Progress event</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path
|
||||
d="M 1150 575 L 1150 375"
|
||||
fill="none"
|
||||
stroke="#000000"
|
||||
stroke-width="5"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path92" />
|
||||
<rect
|
||||
x="2050"
|
||||
y="225"
|
||||
width="200"
|
||||
height="100"
|
||||
fill="none"
|
||||
stroke="none"
|
||||
pointer-events="all"
|
||||
id="rect94" />
|
||||
<g
|
||||
transform="translate(-0.5 -0.5)scale(5)"
|
||||
id="g100">
|
||||
<switch
|
||||
id="switch98">
|
||||
<foreignObject
|
||||
pointer-events="none"
|
||||
width="100%"
|
||||
height="100%"
|
||||
requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"
|
||||
style="overflow: visible; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 55px; margin-left: 411px;">
|
||||
<xhtml:div
|
||||
style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<xhtml:div
|
||||
style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10s</xhtml:div>
|
||||
</xhtml:div>
|
||||
</xhtml:div>
|
||||
</foreignObject>
|
||||
<text
|
||||
x="430"
|
||||
y="59"
|
||||
fill="#000000"
|
||||
font-family="Helvetica"
|
||||
font-size="12px"
|
||||
text-anchor="middle"
|
||||
id="text96">10s</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path
|
||||
d="M 2150 575 L 2150 375"
|
||||
fill="none"
|
||||
stroke="#000000"
|
||||
stroke-width="5"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path102" />
|
||||
<rect
|
||||
x="3050"
|
||||
y="225"
|
||||
width="200"
|
||||
height="100"
|
||||
fill="none"
|
||||
stroke="none"
|
||||
pointer-events="all"
|
||||
id="rect104" />
|
||||
<g
|
||||
transform="translate(-0.5 -0.5)scale(5)"
|
||||
id="g110">
|
||||
<switch
|
||||
id="switch108">
|
||||
<foreignObject
|
||||
pointer-events="none"
|
||||
width="100%"
|
||||
height="100%"
|
||||
requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"
|
||||
style="overflow: visible; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 55px; margin-left: 611px;">
|
||||
<xhtml:div
|
||||
style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<xhtml:div
|
||||
style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">15s</xhtml:div>
|
||||
</xhtml:div>
|
||||
</xhtml:div>
|
||||
</foreignObject>
|
||||
<text
|
||||
x="630"
|
||||
y="59"
|
||||
fill="#000000"
|
||||
font-family="Helvetica"
|
||||
font-size="12px"
|
||||
text-anchor="middle"
|
||||
id="text106">15s</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path
|
||||
d="M 3150 575 L 3150 375"
|
||||
fill="none"
|
||||
stroke="#000000"
|
||||
stroke-width="5"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path112" />
|
||||
<rect
|
||||
x="4050"
|
||||
y="225"
|
||||
width="200"
|
||||
height="100"
|
||||
fill="none"
|
||||
stroke="none"
|
||||
pointer-events="all"
|
||||
id="rect114" />
|
||||
<g
|
||||
transform="translate(-0.5 -0.5)scale(5)"
|
||||
id="g120">
|
||||
<switch
|
||||
id="switch118">
|
||||
<foreignObject
|
||||
pointer-events="none"
|
||||
width="100%"
|
||||
height="100%"
|
||||
requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"
|
||||
style="overflow: visible; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 55px; margin-left: 811px;">
|
||||
<xhtml:div
|
||||
style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<xhtml:div
|
||||
style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">20s</xhtml:div>
|
||||
</xhtml:div>
|
||||
</xhtml:div>
|
||||
</foreignObject>
|
||||
<text
|
||||
x="830"
|
||||
y="59"
|
||||
fill="#000000"
|
||||
font-family="Helvetica"
|
||||
font-size="12px"
|
||||
text-anchor="middle"
|
||||
id="text116">20s</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path
|
||||
d="M 4150 575 L 4150 375"
|
||||
fill="none"
|
||||
stroke="#000000"
|
||||
stroke-width="5"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path122" />
|
||||
<path
|
||||
d="M 150 925 L 150 825"
|
||||
fill="none"
|
||||
stroke="#b85450"
|
||||
stroke-opacity="0.5"
|
||||
stroke-width="20"
|
||||
stroke-miterlimit="10"
|
||||
pointer-events="stroke"
|
||||
id="path124" />
|
||||
<rect
|
||||
x="200"
|
||||
y="825"
|
||||
width="1650"
|
||||
height="100"
|
||||
fill="none"
|
||||
stroke="none"
|
||||
pointer-events="all"
|
||||
id="rect126" />
|
||||
<g
|
||||
transform="translate(-0.5 -0.5)scale(5)"
|
||||
id="g132">
|
||||
<switch
|
||||
id="switch130">
|
||||
<foreignObject
|
||||
pointer-events="none"
|
||||
width="100%"
|
||||
height="100%"
|
||||
requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"
|
||||
style="overflow: visible; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 328px; height: 1px; padding-top: 175px; margin-left: 42px;">
|
||||
<xhtml:div
|
||||
style="box-sizing: border-box; font-size: 0px; text-align: left;">
|
||||
<xhtml:div
|
||||
style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Timeout not reached because it is rounded up to system tick</xhtml:div>
|
||||
</xhtml:div>
|
||||
</xhtml:div>
|
||||
</foreignObject>
|
||||
<text
|
||||
x="42"
|
||||
y="179"
|
||||
fill="#000000"
|
||||
font-family="Helvetica"
|
||||
font-size="12px"
|
||||
id="text128">Timeout not reached because it is rounded up to system tick</text>
|
||||
</switch>
|
||||
</g>
|
||||
</g>
|
||||
<switch
|
||||
id="switch142">
|
||||
<g
|
||||
requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"
|
||||
id="g136" />
|
||||
<a
|
||||
transform="translate(0,-5)"
|
||||
xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems"
|
||||
target="_blank"
|
||||
id="a140">
|
||||
<text
|
||||
text-anchor="middle"
|
||||
font-size="10px"
|
||||
x="50%"
|
||||
y="100%"
|
||||
id="text138">Viewer does not support full SVG 1.1</text>
|
||||
</a>
|
||||
</switch>
|
||||
</svg>
|
After Width: | Height: | Size: 21 KiB |
Loading…
x
Reference in New Issue
Block a user