libuv源码阅读(4)--atomic-ops.h与threadpool.h

2021-03-08 09:52:58 浏览数 (1)

代码语言:javascript复制
#ifndef UV_ATOMIC_OPS_H_
#define UV_ATOMIC_OPS_H_

#include "internal.h"  /* UV_UNUSED */

#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
#include <atomic.h>
#endif

UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval));
UV_UNUSED(static void cpu_relax(void));

/* Prefer hand-rolled assembly over the gcc builtins because the latter also
 * issue full memory barriers.
 */

//  如果 ptr 值和 old相等, 则将new赋值给ptr且返回old, 否则返回new。
UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)) {
#if defined(__i386__) || defined(__x86_64__)
  int out;
  __asm__ __volatile__ ("lock; cmpxchg %2, %1;"
                        : "=a" (out), " m" (*(volatile int*) ptr)
                        : "r" (newval), "0" (oldval)
                        : "memory");
  return out;
#elif defined(__MVS__)
  unsigned int op4;
  if (__plo_CSST(ptr, (unsigned int*) &oldval, newval,
                (unsigned int*) ptr, *ptr, &op4))
    return oldval;
  else
    return op4;
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
  return atomic_cas_uint((uint_t *)ptr, (uint_t)oldval, (uint_t)newval);
#else
  return __sync_val_compare_and_swap(ptr, oldval, newval);
#endif
}

// 提升 cpu 在等待 自旋锁释放时候的性能
UV_UNUSED(static void cpu_relax(void)) {
#if defined(__i386__) || defined(__x86_64__)
  __asm__ __volatile__ ("rep; nop");  /* a.k.a. PAUSE */
#elif (defined(__arm__) && __ARM_ARCH >= 7) || defined(__aarch64__)
  __asm__ volatile("yield");
#endif
}

#endif  /* UV_ATOMIC_OPS_H_ */

很简单的2个方法,主要用于 线程之间共享的一些 结构体属性状态的判断,例如 某个handler的状态是否处于某个状态,需要原子性比较。第二个方法主要用于提升CPU忙等时候的性能。

threadpool.h

代码语言:javascript复制
#ifndef UV_THREADPOOL_H_
#define UV_THREADPOOL_H_

struct uv__work {
  void (*work)(struct uv__work *w);
  void (*done)(struct uv__work *w, int status);
  struct uv_loop_s* loop;
  void* wq[2];
};

#endif /* UV_THREADPOOL_H_ */

线程池中工作线程每次取出和提交的工作任务的抽象类型。包含关键的 2个函数指针,work 和 done。

0 人点赞