84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * Copyright (c) 2021 OceanBase
 | 
						|
 * OceanBase CE is licensed under Mulan PubL v2.
 | 
						|
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | 
						|
 * You may obtain a copy of Mulan PubL v2 at:
 | 
						|
 *          http://license.coscl.org.cn/MulanPubL-2.0
 | 
						|
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
						|
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
						|
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
						|
 * See the Mulan PubL v2 for more details.
 | 
						|
 */
 | 
						|
 | 
						|
#include <gtest/gtest.h>
 | 
						|
#include "lib/thread/ob_simple_thread_pool.h"
 | 
						|
#include "lib/coro/testing.h"
 | 
						|
 | 
						|
using namespace oceanbase::common;
 | 
						|
 | 
						|
TEST(DISABLED_TestSimpleThreadPool, Basic)
 | 
						|
{
 | 
						|
  class : public ObSimpleThreadPool {
 | 
						|
    void handle(void *task) {
 | 
						|
      UNUSED(task);
 | 
						|
      ATOMIC_INC(&handle_cnt_);
 | 
						|
    }
 | 
						|
  public:
 | 
						|
    int handle_cnt_ = 0;
 | 
						|
  } pool;
 | 
						|
  EXPECT_NE(OB_SUCCESS, pool.init(0, 10));
 | 
						|
  EXPECT_NE(OB_SUCCESS, pool.init(-1, 10));
 | 
						|
  EXPECT_NE(OB_SUCCESS, pool.init(-1234567, 10));
 | 
						|
  EXPECT_NE(OB_SUCCESS, pool.init(1, 0));
 | 
						|
  EXPECT_NE(OB_SUCCESS, pool.init(1, -1));
 | 
						|
 | 
						|
  // When routine without coro push items into this pool, there may be
 | 
						|
  // at most 100ms(default timeout) before a item to be processing.
 | 
						|
  //
 | 
						|
  // Update: ob_futex has fixed problem of thread waking up co-routine
 | 
						|
  TIME_LESS(10000, [&pool] {
 | 
						|
    pool.handle_cnt_ = 0;
 | 
						|
    ASSERT_EQ(OB_SUCCESS, pool.init(1, 10));
 | 
						|
    ::usleep(1000);  // wait for handler waiting for queue
 | 
						|
    ASSERT_EQ(OB_SUCCESS, pool.push((void*)1));
 | 
						|
    ASSERT_EQ(OB_SUCCESS, pool.push((void*)1));
 | 
						|
    ASSERT_EQ(OB_SUCCESS, pool.push((void*)1));
 | 
						|
    for (int i = 0; i < 1000; i++) {
 | 
						|
      if (pool.handle_cnt_ == 3) {
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      ::usleep(1000);
 | 
						|
    }
 | 
						|
    ASSERT_EQ(3, pool.handle_cnt_);
 | 
						|
  });
 | 
						|
  pool.destroy();
 | 
						|
 | 
						|
  // When routine with coro push items into this pool, it would be
 | 
						|
  // processed ASAP.
 | 
						|
  TIME_LESS(10000, [&pool] {
 | 
						|
    cotesting::FlexPool([&pool] {
 | 
						|
      pool.handle_cnt_ = 0;
 | 
						|
      ASSERT_EQ(OB_SUCCESS, pool.init(1, 10));
 | 
						|
      ::usleep(1000);  // wait for handler waiting for queue
 | 
						|
      ASSERT_EQ(OB_SUCCESS, pool.push((void*)1));
 | 
						|
      ASSERT_EQ(OB_SUCCESS, pool.push((void*)1));
 | 
						|
      ASSERT_EQ(OB_SUCCESS, pool.push((void*)1));
 | 
						|
      for (int i = 0; i < 1000; i++) {
 | 
						|
        if (pool.handle_cnt_ == 3) {
 | 
						|
          break;
 | 
						|
        }
 | 
						|
        ::usleep(1000);
 | 
						|
      }
 | 
						|
      ASSERT_EQ(3, pool.handle_cnt_);
 | 
						|
    }, 1).start();
 | 
						|
  });
 | 
						|
  pool.destroy();
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char *argv[])
 | 
						|
{
 | 
						|
  ::testing::InitGoogleTest(&argc, argv);
 | 
						|
  return RUN_ALL_TESTS();
 | 
						|
}
 |