FRR的ATOMIC 利用GCC的实现,后续项目可以参考

/** Copyright (c) 2015-16  David Lamparter, for NetDEF, Inc.** Permission to use, copy, modify, and distribute this software for any* purpose with or without fee is hereby granted, provided that the above* copyright notice and this permission notice appear in all copies.** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/#ifndef _FRRATOMIC_H
#define _FRRATOMIC_H#ifdef HAVE_CONFIG_H
#include "config.h"
#endif#ifndef FRR_AUTOCONF_ATOMIC
#error autoconf checks for atomic functions were not properly run
#endif/* ISO C11 */
#ifdef HAVE_STDATOMIC_H
#include <stdatomic.h>/* These are available in gcc, but not in stdatomic */
#define atomic_add_fetch_explicit __atomic_add_fetch
#define atomic_sub_fetch_explicit __atomic_sub_fetch
#define atomic_and_fetch_explicit __atomic_and_fetch
#define atomic_or_fetch_explicit __atomic_or_fetch/* gcc 4.7 and newer */
#elif defined(HAVE___ATOMIC)#define _Atomic volatile#define memory_order_relaxed __ATOMIC_RELAXED
#define memory_order_consume __ATOMIC_CONSUME
#define memory_order_acquire __ATOMIC_ACQUIRE
#define memory_order_release __ATOMIC_RELEASE
#define memory_order_acq_rel __ATOMIC_ACQ_REL
#define memory_order_seq_cst __ATOMIC_SEQ_CST#define atomic_load_explicit __atomic_load_n
#define atomic_store_explicit __atomic_store_n
#define atomic_exchange_explicit __atomic_exchange_n
#define atomic_fetch_add_explicit __atomic_fetch_add
#define atomic_fetch_sub_explicit __atomic_fetch_sub
#define atomic_fetch_and_explicit __atomic_fetch_and
#define atomic_fetch_or_explicit __atomic_fetch_or#define atomic_add_fetch_explicit __atomic_add_fetch
#define atomic_sub_fetch_explicit __atomic_sub_fetch
#define atomic_and_fetch_explicit __atomic_and_fetch
#define atomic_or_fetch_explicit __atomic_or_fetch#define atomic_compare_exchange_weak_explicit(atom, expect, desire, mem1,      \mem2)                            \__atomic_compare_exchange_n(atom, expect, desire, 1, mem1, mem2)/* gcc 4.1 and newer,* clang 3.3 (possibly older)** __sync_swap isn't in gcc's documentation, but clang has it** note __sync_synchronize()*/
#elif defined(HAVE___SYNC)#define _Atomic volatile#define memory_order_relaxed 0
#define memory_order_consume 0
#define memory_order_acquire 0
#define memory_order_release 0
#define memory_order_acq_rel 0
#define memory_order_seq_cst 0#define atomic_load_explicit(ptr, mem)                                         \({                                                                     \__sync_synchronize();                                          \typeof(*ptr) rval = __sync_fetch_and_add((ptr), 0);            \__sync_synchronize();                                          \rval;                                                          \})
#define atomic_store_explicit(ptr, val, mem)                                   \({                                                                     \__sync_synchronize();                                          \*(ptr) = (val);                                                \__sync_synchronize();                                          \(void)0;                                                       \})
#ifdef HAVE___SYNC_SWAP
#define atomic_exchange_explicit(ptr, val, mem)                                \({                                                                     \__sync_synchronize();                                          \typeof(*ptr) rval = __sync_swap((ptr, val), 0);                \__sync_synchronize();                                          \rval;                                                          \})
#else /* !HAVE___SYNC_SWAP */
#define atomic_exchange_explicit(ptr, val, mem)                                \({                                                                     \typeof(ptr) _ptr = (ptr);                                      \typeof(val) _val = (val);                                      \__sync_synchronize();                                          \typeof(*ptr) old1, old2 = __sync_fetch_and_add(_ptr, 0);       \do {                                                           \old1 = old2;                                           \old2 = __sync_val_compare_and_swap(_ptr, old1, _val);  \} while (old1 != old2);                                        \__sync_synchronize();                                          \old2;                                                          \})
#endif /* !HAVE___SYNC_SWAP */
#define atomic_fetch_add_explicit(ptr, val, mem)                               \({                                                                     \__sync_synchronize();                                          \typeof(*ptr) rval = __sync_fetch_and_add((ptr), (val));        \__sync_synchronize();                                          \rval;                                                          \})
#define atomic_fetch_sub_explicit(ptr, val, mem)                               \({                                                                     \__sync_synchronize();                                          \typeof(*ptr) rval = __sync_fetch_and_sub((ptr), (val));        \__sync_synchronize();                                          \rval;                                                          \})#define atomic_compare_exchange_weak_explicit(atom, expect, desire, mem1,      \mem2)                            \({                                                                     \typeof(atom) _atom = (atom);                                   \typeof(expect) _expect = (expect);                             \typeof(desire) _desire = (desire);                             \__sync_synchronize();                                          \typeof(*atom) rval =                                           \__sync_val_compare_and_swap(_atom, *_expect, _desire); \__sync_synchronize();                                          \bool ret = (rval == *_expect);                                 \*_expect = rval;                                               \ret;                                                           \})#define atomic_fetch_and_explicit(ptr, val, mem)                               \({                                                                     \__sync_synchronize();                                          \typeof(*ptr) rval = __sync_fetch_and_and(ptr, val);            \__sync_synchronize();                                          \rval;                                                          \})
#define atomic_fetch_or_explicit(ptr, val, mem)                                \({                                                                     \__sync_synchronize();                                          \typeof(*ptr) rval = __sync_fetch_and_or(ptr, val);             \__sync_synchronize();                                          \rval;                                                          \})#define atomic_add_fetch_explicit(ptr, val, mem)                               \({                                                                     \__sync_synchronize();                                          \typeof(*ptr) rval = __sync_add_and_fetch((ptr), (val));        \__sync_synchronize();                                          \rval;                                                          \})
#define atomic_sub_fetch_explicit(ptr, val, mem)                               \({                                                                     \__sync_synchronize();                                          \typeof(*ptr) rval = __sync_sub_and_fetch((ptr), (val));        \__sync_synchronize();                                          \rval;                                                          \})#define atomic_and_fetch_explicit(ptr, val, mem)                               \({                                                                     \__sync_synchronize();                                          \typeof(*ptr) rval = __sync_and_and_fetch(ptr, val);            \__sync_synchronize();                                          \rval;                                                          \})
#define atomic_or_fetch_explicit(ptr, val, mem)                                \({                                                                     \__sync_synchronize();                                          \typeof(*ptr) rval = __sync_or_and_fetch(ptr, val);             \__sync_synchronize();                                          \rval;                                                          \})#else /* !HAVE___ATOMIC && !HAVE_STDATOMIC_H */
#error no atomic functions...
#endif#endif /* _FRRATOMIC_H */

FRR的ATOMIC 利用GCC的实现相关推荐

  1. 利用gcc的-finstrument-functions获取函数轨迹跟踪

    在软件系统的性能及架构考量中,将特定运行顺序的函数按照运行顺序进行编译,有利于提高软件的运行效率. 在一个已有的大型软件系统中,获取软件相关函数的运行顺序,可以利用gcc自动的-finstrume ...

  2. 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】

    转自:https://my.oschina.net/u/180497/blog/177206 gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性.这里讨论section子项的 ...

  3. 利用gcc自带的功能-fstack-protector检测栈溢出及其实现

    最近又遇到了一个崩溃,栈回溯非常怪异. /lib/i386-linux-gnu/libc.so.6(gsignal+0x4f) [0xb2b751df] /lib/i386-linux-gnu/lib ...

  4. 利用gcc自带的功能-fstack-protector检测栈溢出及其实现【转】

    转自:https://www.cnblogs.com/leo0000/p/5719186.html 最近又遇到了一个崩溃,栈回溯非常怪异. /lib/i386-linux-gnu/libc.so.6( ...

  5. C语言 intel架构处理器下利用gcc内联汇编 fcos 指令 实现三角函数计算小程序

    Intel提供了丰富的浮点运算指令,fcos就是其中之一.下面就来实际试试看吧. #include <stdio.h>int main(int argc, char** argv) {if ...

  6. Linux 内核中的 GCC 特性(zz)

    from:http://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/ GCC 和 Linux 是出色的组合.尽管它们是独立的软件,但是 Linux ...

  7. GCC 在 Linux、Windows 系统安装

    1. GCC 简介 谈到 GCC,就不得不提 GNU 计划.GNU 全称 GNU's Not UNIX,又被称为"革奴计划",由理查德·斯托曼于 1983 年发起.GNU 计划的最 ...

  8. GCC 参数列举及解释

    GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器.它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分. gcc 与 g++ 分 ...

  9. GCC中的内嵌汇编语言

    一.声明   虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇编语言写成的.有些汇编语言代码是直接写在汇编源程序中的,特别是Linux的启动代码部分:还有一些则是利 ...

  10. linux gcc编译c文件头文件,使用GCC编译器编译C语言

    GCC编译C源代码有四个步骤:预处理-->编译-->汇编-->链接. 可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的过程. 下面将通过对一个程序的编译来演示 ...

最新文章

  1. C++11中shared_ptr的使用
  2. Unity网络多玩家游戏开发教程(上册)
  3. threadlocals_如何使用ThreadLocals射击自己
  4. python使用spark-sql读取数据并可视化_使用Spark SQL读取HBase上的数据
  5. LeetCode003-无重复字符的最长子串(Length of longest substring)-Rust语言实现
  6. 1.1 Python 安装
  7. 根据两个日期字符串,格式为(YYYY-MM-DD),获取年龄,保留两位小数但不四舍五入...
  8. python基础3-运算符总结_位操作符_优先级问题
  9. 设计模式---简单工厂模式(c++实现)
  10. IOS 模拟器 在iPhone5和iPhone5s显示不全,不能全屏显示
  11. 快进php,【插件推荐】视频速度控制器,网页视频加速/减速播放
  12. QQ揭秘:如何实现窗体靠边隐藏?【低调赠送:QQ高仿版GG 4.2 最新源码】
  13. OSError: [WinError 127] 找不到指定的程序。 Error loading “C:\Anaconda3\envs\Machine_Learning\lib\site-package
  14. NodeJS学习:环境变量
  15. 零基础入门小程序,实战经验分享
  16. 旧电脑装什么系统最快_老电脑装什么系统好(不同配置不同系统推荐)
  17. 虚拟机启动时,提示找不到ISO映像文件
  18. 数字平原cg场景制作流程
  19. 计算机统计学作业,浙江科技學院计算机专业统计学原理复习题参考答案.doc
  20. Android端密钥安全存储

热门文章

  1. 关于模板类中,子类无法访问父类成员问题的解决方法
  2. JavaScript里的数组转化新方法Array.From
  3. Java设计模式-Builder生成器模式
  4. linux常用命令技巧
  5. 指针 多维数组 数组指针 指针数组
  6. 使用VS开发基于Oracle程序的严重问题
  7. ios 通知接收两次_苹果健康体系又进一步,iOS 14.3支持有氧适能通知
  8. 现代化编程 -- 在 Swoole 上开发 Laravel 框架的应用
  9. 使用Telnet客户端测试Exchange邮件收发
  10. plusgantt的项目管理系统实战开发最全课程