xref: /dpdk/lib/eal/windows/eal_thread.c (revision 57ecf14806c52d6efcfe7bcfb30ae8293e0f159c)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2019 Intel Corporation
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #include <io.h>
699a2dd95SBruce Richardson 
799a2dd95SBruce Richardson #include <rte_atomic.h>
899a2dd95SBruce Richardson #include <rte_debug.h>
999a2dd95SBruce Richardson #include <rte_launch.h>
1099a2dd95SBruce Richardson #include <rte_lcore.h>
1199a2dd95SBruce Richardson #include <rte_per_lcore.h>
1299a2dd95SBruce Richardson #include <rte_common.h>
1399a2dd95SBruce Richardson #include <rte_memory.h>
1499a2dd95SBruce Richardson 
1599a2dd95SBruce Richardson #include "eal_private.h"
16a95d7054SDavid Marchand #include "eal_thread.h"
1799a2dd95SBruce Richardson #include "eal_windows.h"
1899a2dd95SBruce Richardson 
19*9856af40SBruce Richardson int
eal_thread_wake_worker(unsigned int worker_id)20a95d7054SDavid Marchand eal_thread_wake_worker(unsigned int worker_id)
2199a2dd95SBruce Richardson {
2299a2dd95SBruce Richardson 	int m2w = lcore_config[worker_id].pipe_main2worker[1];
2399a2dd95SBruce Richardson 	int w2m = lcore_config[worker_id].pipe_worker2main[0];
24a95d7054SDavid Marchand 	char c = 0;
25a95d7054SDavid Marchand 	int n;
2699a2dd95SBruce Richardson 
27a95d7054SDavid Marchand 	do {
2899a2dd95SBruce Richardson 		n = _write(m2w, &c, 1);
29a95d7054SDavid Marchand 	} while (n == 0 || (n < 0 && errno == EINTR));
3099a2dd95SBruce Richardson 	if (n < 0)
31*9856af40SBruce Richardson 		return -EPIPE;
3299a2dd95SBruce Richardson 
3399a2dd95SBruce Richardson 	do {
3499a2dd95SBruce Richardson 		n = _read(w2m, &c, 1);
3599a2dd95SBruce Richardson 	} while (n < 0 && errno == EINTR);
3699a2dd95SBruce Richardson 	if (n <= 0)
37*9856af40SBruce Richardson 		return -EPIPE;
38*9856af40SBruce Richardson 	return 0;
3999a2dd95SBruce Richardson }
4099a2dd95SBruce Richardson 
41a95d7054SDavid Marchand void
eal_thread_wait_command(void)42a95d7054SDavid Marchand eal_thread_wait_command(void)
4399a2dd95SBruce Richardson {
44a95d7054SDavid Marchand 	unsigned int lcore_id = rte_lcore_id();
45a95d7054SDavid Marchand 	int m2w;
4699a2dd95SBruce Richardson 	char c;
47a95d7054SDavid Marchand 	int n;
4899a2dd95SBruce Richardson 
4999a2dd95SBruce Richardson 	m2w = lcore_config[lcore_id].pipe_main2worker[0];
5099a2dd95SBruce Richardson 	do {
5199a2dd95SBruce Richardson 		n = _read(m2w, &c, 1);
5299a2dd95SBruce Richardson 	} while (n < 0 && errno == EINTR);
5399a2dd95SBruce Richardson 	if (n <= 0)
5499a2dd95SBruce Richardson 		rte_panic("cannot read on configuration pipe\n");
55a95d7054SDavid Marchand }
5699a2dd95SBruce Richardson 
57a95d7054SDavid Marchand void
eal_thread_ack_command(void)58a95d7054SDavid Marchand eal_thread_ack_command(void)
59a95d7054SDavid Marchand {
60a95d7054SDavid Marchand 	unsigned int lcore_id = rte_lcore_id();
61a95d7054SDavid Marchand 	char c = 0;
62a95d7054SDavid Marchand 	int w2m;
63a95d7054SDavid Marchand 	int n;
6499a2dd95SBruce Richardson 
65a95d7054SDavid Marchand 	w2m = lcore_config[lcore_id].pipe_worker2main[1];
66a95d7054SDavid Marchand 	do {
6799a2dd95SBruce Richardson 		n = _write(w2m, &c, 1);
68a95d7054SDavid Marchand 	} while (n == 0 || (n < 0 && errno == EINTR));
6999a2dd95SBruce Richardson 	if (n < 0)
7099a2dd95SBruce Richardson 		rte_panic("cannot write on configuration pipe\n");
7199a2dd95SBruce Richardson }
7299a2dd95SBruce Richardson 
7399a2dd95SBruce Richardson /* get current thread ID */
7499a2dd95SBruce Richardson int
rte_sys_gettid(void)7599a2dd95SBruce Richardson rte_sys_gettid(void)
7699a2dd95SBruce Richardson {
7799a2dd95SBruce Richardson 	return GetCurrentThreadId();
7899a2dd95SBruce Richardson }
79