Skip to content

Commit

Permalink
user: common: Rework msleep routine
Browse files Browse the repository at this point in the history
This introduces a "mft_msleep/mft_usleep"-api intended to suspend execution of the current thread for specified time.

Rationale for the change:
  Legacy code relies heavily on "msleep"-macro which is implemented as a wrapper around "usleep"-api.
  Apart from that, there are a number of places across the codebase where "usleep" is used directly.
  However "usleep" has been declared as obsolete since POSIX.1-2001 suggesting "nanosleep"-api instead.
  In POSIX.1-2008 it is removed.

Newly added implementation separates C and C++ cases.
  For C++ it utilizes "std::this_thread::sleep_for"-api which is part of the standard starting C++11.
  For C implementation is based on "nanosleep"-api (https://man7.org/linux/man-pages/man2/nanosleep.2.html)
  Separation is done in order to keep implementation in the header relying on compiler ability
  to inline it where it is possible (api is time sensitive so that extra function calls better
  to be avoided).
  • Loading branch information
AlexBlago committed Aug 4, 2024
1 parent bf776e4 commit b351d83
Show file tree
Hide file tree
Showing 27 changed files with 562 additions and 68 deletions.
82 changes: 82 additions & 0 deletions common/BUILD
Original file line number Diff line number Diff line change
@@ -1,3 +1,33 @@
# Copyright (c) 2023-2024 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
#
# This software is available to you under a choice of one of two
# licenses. You may choose to be licensed under the terms of the GNU
# General Public License (GPL) Version 2, available from the file
# COPYING in the main directory of this source tree, or the
# OpenIB.org BSD license below:
#
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met:
#
# - Redistributions of source code must retain the above
# copyright notice, this list of conditions and the following
# disclaimer.
#
# - Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")

package(
Expand Down Expand Up @@ -280,3 +310,55 @@ cc_test(
"@com_google_googletest//:gtest_main",
],
)

cc_library(
name = "tools-time",
srcs = [
"tools_time.c",
"tools_time.cpp",
],
hdrs = [
"tools_time.h",
],
copts = [
"-Wall",
"-Wextra",
"-Wpedantic",
],
)

cc_test(
name = "tools-time-test",
size = "small",
srcs = [
"tools_time_test.cpp",
],
copts = [
"-Wall",
"-Wextra",
"-Wpedantic",
],
deps = [
":tools-time",
"@com_google_googletest//:gtest_main",
],
)

cc_test(
name = "tools-time-c-test",
size = "small",
srcs = [
"tools_time_c_test.c",
"tools_time_c_test.cpp",
"tools_time_c_test.h",
],
copts = [
"-Wall",
"-Wextra",
"-Wpedantic",
],
deps = [
":tools-time",
"@com_google_googletest//:gtest_main",
],
)
16 changes: 12 additions & 4 deletions common/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
# Copyright (c) 2023-2024 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
#
# This software is available to you under a choice of one of two
# licenses. You may choose to be licensed under the terms of the GNU
Expand Down Expand Up @@ -30,12 +30,20 @@

# Makefile.am -- Process this file with automake to produce Makefile.in

noinst_HEADERS = compatibility.h bit_slice.h tools_utils.h tools_utils.h tools_version.h tools_filesystem.h tools_regex.h tools_algorithm.h

noinst_LTLIBRARIES = libcommon.la

libcommon_la_SOURCES = \
bit_slice.h \
compatibility.h \
tools_algorithm.h \
tools_filesystem.cpp \
tools_regex.cpp
tools_filesystem.h \
tools_regex.cpp \
tools_regex.h \
tools_time.h \
tools_utils.h \
tools_utils.h \
tools_version.h

commonincludedir = $(includedir)/mstflint/common/
commoninclude_HEADERS = compatibility.h
Expand Down
10 changes: 1 addition & 9 deletions common/compatibility.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* Copyright (C) Jan 2006 Mellanox Technologies Ltd. All rights reserved.
* Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
Expand Down Expand Up @@ -340,7 +340,6 @@ inline

typedef struct stat Stat;

#include <sys/time.h>
#include <strings.h>

#endif
Expand Down Expand Up @@ -402,13 +401,6 @@ typedef uint8_t u_int8_t;

#endif

/* define msleep(x) - sleeps for x milliseconds */
#if defined(_WIN32) || defined(_WIN64) || defined(__MINGW32__) || defined(__MINGW64__)
#define msleep(x) Sleep(x)
#else
#define msleep(x) usleep(((unsigned long)x) * 1000)
#endif

// Convert BYTES - DWORDS with MEMCPY BE
#define BYTES_TO_DWORD_BE(dw_dest, byte_src) \
do \
Expand Down
34 changes: 34 additions & 0 deletions common/tools_time.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
* General Public License (GPL) Version 2, available from the file
* COPYING in the main directory of this source tree, or the
* OpenIB.org BSD license below:
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

// purpose of this file is to verify compilation of tools time library against C code
#include "tools_time.h"
34 changes: 34 additions & 0 deletions common/tools_time.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
* General Public License (GPL) Version 2, available from the file
* COPYING in the main directory of this source tree, or the
* OpenIB.org BSD license below:
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

// purpose of this file is to verify compilation of tools time library against C++ code
#include "tools_time.h"
116 changes: 116 additions & 0 deletions common/tools_time.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/*
* Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
* General Public License (GPL) Version 2, available from the file
* COPYING in the main directory of this source tree, or the
* OpenIB.org BSD license below:
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

#pragma once

#if __cplusplus
#include <chrono>
#include <thread>
#else
#include <time.h>
#include <stdint.h>
#endif

#if __cplusplus
namespace nbu
{
namespace mft
{
namespace common
{
/**
* @brief Pauses the execution of the current thread for at least the specified number of milliseconds.
* @param msecs The number of milliseconds to sleep.
*
* The execution of the current thread is stopped until at least msecs milliseconds has
# passed from now. Other threads continue their execution.
*/
inline void mft_msleep(uint32_t msecs)
{
::std::this_thread::sleep_for(std::chrono::milliseconds(msecs));
}

/**
* @brief Pauses the execution of the current thread for at least the specified number of microseconds.
* @param msecs The number of microseconds to sleep.
*
* The execution of the current thread is stopped until at least msecs microseconds has
# passed from now. Other threads continue their execution.
*/
inline void mft_usleep(uint64_t usecs)
{
::std::this_thread::sleep_for(std::chrono::microseconds(usecs));
}

} // namespace common
} // namespace mft
} // namespace nbu

#define msleep(x) nbu::mft::common::mft_msleep(x)

#else // C {

/**
* @brief Pauses the execution of the current thread for at least the specified number of milliseconds.
* @param msecs The number of milliseconds for which to pause the execution.
* @return 0 on success, -1 otherwise. If interrupted by a signal, `errno` is set to `EINTR`.
*
* The execution of the current thread is stopped until at least msecs milliseconds has passed from now.
* Other threads continue their execution. There no support for Windows platforms.
*/
static inline int mft_msleep(uint32_t msecs)
{
struct timespec req;
req.tv_sec = msecs / 1000;
req.tv_nsec = ((long int)msecs % 1000) * 1000000;
return nanosleep(&req, NULL);
}

/**
* @brief Pauses the execution of the current thread for at least the specified number of microseconds.
* @param msecs The number of microseconds for which to pause the execution.
* @return 0 on success, -1 otherwise. If interrupted by a signal, `errno` is set to `EINTR`.
*
* The execution of the current thread is stopped until at least msecs microseconds has passed from now.
* Other threads continue their execution. There no support for Windows platforms.
*/
static inline int mft_usleep(uint64_t usecs)
{
struct timespec req;
req.tv_sec = usecs / 1000000;
req.tv_nsec = ((long int)usecs % 1000000) * 1000;
return nanosleep(&req, NULL);
}

#define msleep(x) mft_msleep(x)

#endif // } C
53 changes: 53 additions & 0 deletions common/tools_time_c_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
* General Public License (GPL) Version 2, available from the file
* COPYING in the main directory of this source tree, or the
* OpenIB.org BSD license below:
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

/**
* @file tools_time_c_test.c
* @brief Provides integration between the googleest framework and the C implementation of the tools time library.
*
* This source file contains helper functions that bridge calls from C++ unit tests
* to the C implementation of the tools time library.
*/

#include "tools_time_c_test.h"

#include "tools_time.h"

int mft_msleep_cwrapper(uint32_t msecs)
{
return mft_msleep(msecs);
}

int mft_usleep_cwrapper(uint64_t usecs)
{
return mft_usleep(usecs);
}
Loading

0 comments on commit b351d83

Please sign in to comment.