Skip to content

Commit

Permalink
1. fix missing unit test for new feature detection
Browse files Browse the repository at this point in the history
2. codes optimization for some new compiler
  • Loading branch information
owent committed Aug 17, 2019
1 parent 1275c93 commit 7193739
Show file tree
Hide file tree
Showing 26 changed files with 468 additions and 231 deletions.
27 changes: 22 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ if (LIBCOTASK_ENABLE)
set(LIBCOTASK_MACRO_ENABLED 1)
endif ()

if (LIBCOTASK_AUTO_CLEANUP_MANAGER)
set(LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER 1)
endif ()

find_package(Threads)
if (CMAKE_USE_PTHREADS_INIT)
list(APPEND PROJECT_LIBCOPP_SYSLIB_LINK_NAMES pthread)
Expand All @@ -75,12 +79,25 @@ configure_file(
@ONLY
)

if (COMPILER_STRICT_EXTRA_CFLAGS)
add_definitions(${COMPILER_STRICT_EXTRA_CFLAGS})
endif ()
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
get_filename_component(CMAKE_CXX_COMPILER_WE ${CMAKE_CXX_COMPILER} NAME_WE CACHE)
if (NOT ${CMAKE_CXX_COMPILER_WE} STREQUAL "clang-cl")
if (COMPILER_STRICT_EXTRA_CFLAGS)
add_definitions(${COMPILER_STRICT_EXTRA_CFLAGS})
endif ()

if (COMPILER_STRICT_CFLAGS)
add_definitions(${COMPILER_STRICT_CFLAGS})
if (COMPILER_STRICT_CFLAGS)
add_definitions(${COMPILER_STRICT_CFLAGS})
endif ()
endif ()
else ()
if (COMPILER_STRICT_EXTRA_CFLAGS)
add_definitions(${COMPILER_STRICT_EXTRA_CFLAGS})
endif ()

if (COMPILER_STRICT_CFLAGS)
add_definitions(${COMPILER_STRICT_CFLAGS})
endif ()
endif ()

## 导入所有工程项目
Expand Down
1 change: 1 addition & 0 deletions include/libcopp/utils/config/build_feature.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#endif

#cmakedefine LIBCOTASK_MACRO_ENABLED @LIBCOTASK_MACRO_ENABLED@
#cmakedefine LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER @LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER@

#ifndef THREAD_TLS_USE_PTHREAD
#cmakedefine THREAD_TLS_USE_PTHREAD @THREAD_TLS_USE_PTHREAD@
Expand Down
19 changes: 6 additions & 13 deletions include/libcopp/utils/config/compiler_features.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,14 @@
# define UTIL_CONFIG_COMPILER_IS_Cray 0
# define UTIL_CONFIG_COMPILER_IS_TI 0
# define UTIL_CONFIG_COMPILER_IS_Fujitsu 0
# define UTIL_CONFIG_COMPILER_IS_GHS 0
# define UTIL_CONFIG_COMPILER_IS_SCO 0
# define UTIL_CONFIG_COMPILER_IS_ARMCC 0
# define UTIL_CONFIG_COMPILER_IS_AppleClang 0
# define UTIL_CONFIG_COMPILER_IS_Clang 0
# define UTIL_CONFIG_COMPILER_IS_GNU 0
# define UTIL_CONFIG_COMPILER_IS_MSVC 0
# define UTIL_CONFIG_COMPILER_IS_ADSP 0
# define UTIL_CONFIG_COMPILER_IS_IAR 0
# define UTIL_CONFIG_COMPILER_IS_ARMCC 0
# define UTIL_CONFIG_COMPILER_IS_MIPSpro 0

#if defined(__COMO__)
Expand Down Expand Up @@ -77,7 +76,7 @@
# undef UTIL_CONFIG_COMPILER_IS_zOS
# define UTIL_CONFIG_COMPILER_IS_zOS 1

#elif defined(__ibmxl__) || (defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800)
#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800
# undef UTIL_CONFIG_COMPILER_IS_XL
# define UTIL_CONFIG_COMPILER_IS_XL 1

Expand All @@ -101,18 +100,10 @@
# undef UTIL_CONFIG_COMPILER_IS_Fujitsu
# define UTIL_CONFIG_COMPILER_IS_Fujitsu 1

#elif defined(__ghs__)
# undef UTIL_CONFIG_COMPILER_IS_GHS
# define UTIL_CONFIG_COMPILER_IS_GHS 1

#elif defined(__SCO_VERSION__)
# undef UTIL_CONFIG_COMPILER_IS_SCO
# define UTIL_CONFIG_COMPILER_IS_SCO 1

#elif defined(__ARMCC_VERSION) && !defined(__clang__)
# undef UTIL_CONFIG_COMPILER_IS_ARMCC
# define UTIL_CONFIG_COMPILER_IS_ARMCC 1

#elif defined(__clang__) && defined(__apple_build_version__)
# undef UTIL_CONFIG_COMPILER_IS_AppleClang
# define UTIL_CONFIG_COMPILER_IS_AppleClang 1
Expand All @@ -137,6 +128,10 @@
# undef UTIL_CONFIG_COMPILER_IS_IAR
# define UTIL_CONFIG_COMPILER_IS_IAR 1

#elif defined(__ARMCC_VERSION)
# undef UTIL_CONFIG_COMPILER_IS_ARMCC
# define UTIL_CONFIG_COMPILER_IS_ARMCC 1

#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
# undef UTIL_CONFIG_COMPILER_IS_MIPSpro
# define UTIL_CONFIG_COMPILER_IS_MIPSpro 1
Expand Down Expand Up @@ -642,8 +637,6 @@

# if defined(UTIL_CONFIG_COMPILER_CXX_NULLPTR) && UTIL_CONFIG_COMPILER_CXX_NULLPTR
# define UTIL_CONFIG_NULLPTR nullptr
# elif UTIL_CONFIG_COMPILER_IS_GNU
# define UTIL_CONFIG_NULLPTR __null
# else
# define UTIL_CONFIG_NULLPTR 0
# endif
Expand Down
9 changes: 5 additions & 4 deletions include/libcopp/utils/errno.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,11 @@ namespace copp {

COPP_EC_FCONTEXT_MAKE_FAILED = -2001, //!< COPP_EC_FCONTEXT_MAKE_FAILED

COPP_EC_TASK_CAN_NOT_WAIT_SELF = -3001, //!< COPP_EC_TASK_CAN_NOT_WAIT_SELF
COPP_EC_TASK_IS_EXITING = -3002, //!< COPP_EC_TASK_IS_EXITING
COPP_EC_TASK_ADD_NEXT_FAILED = -3003, //!< COPP_EC_TASK_ADD_NEXT_FAILED
COPP_EC_TASK_NOT_IN_ACTION = -3004, //!< COPP_EC_TASK_NOT_IN_ACTION
COPP_EC_TASK_CAN_NOT_WAIT_SELF = -3001, //!< COPP_EC_TASK_CAN_NOT_WAIT_SELF
COPP_EC_TASK_IS_EXITING = -3002, //!< COPP_EC_TASK_IS_EXITING
COPP_EC_TASK_ADD_NEXT_FAILED = -3003, //!< COPP_EC_TASK_ADD_NEXT_FAILED
COPP_EC_TASK_NOT_IN_ACTION = -3004, //!< COPP_EC_TASK_NOT_IN_ACTION
COPP_EC_TASK_ALREADY_IN_ANOTHER_MANAGER = -3005, //!< COPP_EC_TASK_ALREADY_IN_ANOTHER_MANAGER
};
} // namespace copp

Expand Down
14 changes: 0 additions & 14 deletions include/libcopp/utils/features.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,20 +50,6 @@
#endif
// ---------------- select platform ----------------

// ================ c extern ================
#if !defined(__BEGIN_DECLS) && !defined(__END_DECLS)
#if defined(__cplusplus)
#define __BEGIN_DECLS extern "C" {
#define __END_DECLS }
#else
#define __BEGIN_DECLS
#define __END_DECLS
#endif
#endif

#if !defined(__THROW)
#define __THROW
#endif
// ---------------- c extern ----------------
#if defined(UTIL_CONFIG_NOEXCEPT)
#define COPP_MACRO_NOEXCEPT UTIL_CONFIG_NOEXCEPT
Expand Down
18 changes: 9 additions & 9 deletions include/libcotask/impl/task_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,13 @@ namespace cotask {
struct ext_coroutine_flag_t {
enum type {
EN_ECFT_UNKNOWN = 0,
EN_ECFT_COTASK = 0x0100,
EN_ECFT_MASK = 0xFF00,
EN_ECFT_COTASK = 0x0100,
EN_ECFT_MASK = 0xFF00,
};
};

private:
task_impl(const task_impl &);
task_impl(const task_impl &) UTIL_CONFIG_DELETED_FUNCTION;

public:
task_impl();
Expand Down Expand Up @@ -81,12 +81,12 @@ namespace cotask {
public:
virtual int get_ret_code() const = 0;

virtual int start(void *priv_data, EN_TASK_STATUS expected_status = EN_TS_CREATED) = 0;
virtual int start(void *priv_data, EN_TASK_STATUS expected_status = EN_TS_CREATED) = 0;
virtual int resume(void *priv_data, EN_TASK_STATUS expected_status = EN_TS_WAITING) = 0;
virtual int yield(void **priv_data) = 0;
virtual int cancel(void *priv_data) = 0;
virtual int kill(enum EN_TASK_STATUS status, void *priv_data) = 0;
inline int kill(void *priv_data) { return kill(EN_TS_KILLED, priv_data); }
virtual int yield(void **priv_data) = 0;
virtual int cancel(void *priv_data) = 0;
virtual int kill(enum EN_TASK_STATUS status, void *priv_data) = 0;
inline int kill(void *priv_data) { return kill(EN_TS_KILLED, priv_data); }

inline int start() { return start(UTIL_CONFIG_NULLPTR); };
inline int resume() { return resume(UTIL_CONFIG_NULLPTR); };
Expand All @@ -111,7 +111,7 @@ namespace cotask {
inline action_ptr_t get_raw_action() const UTIL_CONFIG_NOEXCEPT { return action_; }

protected:
void _set_action(action_ptr_t action);
void _set_action(action_ptr_t action);
action_ptr_t _get_action();

bool _cas_status(EN_TASK_STATUS &expected, EN_TASK_STATUS desired);
Expand Down
73 changes: 68 additions & 5 deletions include/libcotask/task.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#pragma once

#include <algorithm>
#include <cstddef>
#include <stdint.h>

#include <libcopp/stack/stack_traits.h>
Expand Down Expand Up @@ -50,7 +51,13 @@ namespace cotask {
* @brief constuctor
* @note should not be called directly
*/
task(size_t stack_sz) : stack_size_(stack_sz), action_destroy_fn_(UTIL_CONFIG_NULLPTR) {
task(size_t stack_sz)
: id_(0), stack_size_(stack_sz), action_destroy_fn_(UTIL_CONFIG_NULLPTR)
#if defined(LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER) && LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER
,
binding_manager_ptr_(UTIL_CONFIG_NULLPTR), binding_manager_fn_(UTIL_CONFIG_NULLPTR)
#endif
{
id_allocator_t id_alloc_;
id_ = id_alloc_.allocate();
ref_count_.store(0);
Expand Down Expand Up @@ -248,7 +255,7 @@ namespace cotask {
}

#if !defined(PROJECT_DISABLE_MT) || !(PROJECT_DISABLE_MT)
util::lock::lock_holder<util::lock::spin_lock> lock_guard(next_list_lock_);
util::lock::lock_holder<util::lock::spin_lock> lock_guard(inner_action_lock_);
#endif

next_list_.member_list_.push_back(std::make_pair(next_task, priv_data));
Expand Down Expand Up @@ -611,13 +618,22 @@ namespace cotask {

void active_next_tasks() {
std::list<std::pair<ptr_t, void *> > next_list;

#if defined(LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER) && LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER
void *manager_ptr;
void (*manager_fn)(void *, self_t &);
#endif
// first, lock and swap container
{
#if !defined(PROJECT_DISABLE_MT) || !(PROJECT_DISABLE_MT)
util::lock::lock_holder<util::lock::spin_lock> lock_guard(next_list_lock_);
util::lock::lock_holder<util::lock::spin_lock> lock_guard(inner_action_lock_);
#endif
next_list.swap(next_list_.member_list_);
#if defined(LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER) && LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER
manager_ptr = binding_manager_ptr_;
manager_fn = binding_manager_fn_;
binding_manager_ptr_ = UTIL_CONFIG_NULLPTR;
binding_manager_fn_ = UTIL_CONFIG_NULLPTR;
#endif
}

// then, do all the pending tasks
Expand All @@ -632,6 +648,13 @@ namespace cotask {
iter->first->resume(iter->second);
}
}

// finally, notify manager to cleanup(maybe start or resume with task's API but not task_manager's)
#if defined(LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER) && LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER
if (UTIL_CONFIG_NULLPTR != manager_ptr && UTIL_CONFIG_NULLPTR != manager_fn) {
(*manager_fn)(manager_ptr, *this);
}
#endif
}

int _notify_finished(void *priv_data) {
Expand Down Expand Up @@ -683,6 +706,40 @@ namespace cotask {
}
}

#if defined(LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER) && LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER
public:
class task_manager_helper {
private:
template <typename, typename>
friend class task_manager;
static bool setup_task_manager(self_t &task_inst, void *manager_ptr, void (*fn)(void *, self_t &)) {
#if !defined(PROJECT_DISABLE_MT) || !(PROJECT_DISABLE_MT)
util::lock::lock_holder<util::lock::spin_lock> lock_guard(task_inst.inner_action_lock_);
#endif
if (task_inst.binding_manager_ptr_ != UTIL_CONFIG_NULLPTR) {
return false;
}

task_inst.binding_manager_ptr_ = manager_ptr;
task_inst.binding_manager_fn_ = fn;
return true;
}

static bool cleanup_task_manager(self_t &task_inst, void *manager_ptr) {
#if !defined(PROJECT_DISABLE_MT) || !(PROJECT_DISABLE_MT)
util::lock::lock_holder<util::lock::spin_lock> lock_guard(task_inst.inner_action_lock_);
#endif
if (task_inst.binding_manager_ptr_ != manager_ptr) {
return false;
}

task_inst.binding_manager_ptr_ = UTIL_CONFIG_NULLPTR;
task_inst.binding_manager_fn_ = UTIL_CONFIG_NULLPTR;
return true;
}
};
#endif

private:
id_t id_;
size_t stack_size_;
Expand All @@ -694,10 +751,16 @@ namespace cotask {

#if !defined(PROJECT_DISABLE_MT) || !(PROJECT_DISABLE_MT)
util::lock::atomic_int_type<size_t> ref_count_; /** ref_count **/
util::lock::spin_lock next_list_lock_;
util::lock::spin_lock inner_action_lock_;
#else
util::lock::atomic_int_type<util::lock::unsafe_int_type<size_t> > ref_count_; /** ref_count **/
#endif

// ============== binding to task manager ==============
#if defined(LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER) && LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER
void *binding_manager_ptr_;
void (*binding_manager_fn_)(void *, self_t &);
#endif
};
} // namespace cotask

Expand Down
Loading

0 comments on commit 7193739

Please sign in to comment.