braft icon indicating copy to clipboard operation
braft copied to clipboard

Rust/C binding可行吗

Open marsqing opened this issue 6 years ago • 4 comments

我们的项目是Rust语言,braft特别适合我们的很多场景,Rust可以无缝调用C的类库,查过一些资料,说符合"某些"要求的C++库是可以提供C binding的,比如snappy是C++的,但是提供了C binding,想问下技术上给braft增加一个Rust或者说C binding是可行的吗?谢谢!

marsqing avatar Jun 17 '19 04:06 marsqing

可能比较难,raft得接口较多,直接提供c-binding的话工作量还是不小的

chenzhangyi avatar Jun 17 '19 08:06 chenzhangyi

如果技术上可行的话我们可以投入人力做,这边没有熟悉C++的同学,想问下写这个c-binding的大概方法是什么?是像snappy那样通过snappy-c.cc做一个C到C++的wrap层吗?

marsqing avatar Jun 17 '19 09:06 marsqing

c-binding理论上可行,就是接口看起来会比较恶心 braft的C++接口主要就是StateMachine那堆虚函数,加上Node里面一些功能。基本思路就是,每个虚函数对应一个函数指针,Node里的每个成员函数变成一个函数调用,大概长这个样子:

//==================
// c wrapper
typedef void(BraftIterator*) OnApplyFunction;

class BraftStateMachineForC : public StateMachine {
public:
    void set_on_apply(OnApplyFunction on_apply_function) {
        on_apply_func_ = on_apply_function;
    }

    void Start() { ... }
protected:
    void on_apply(Iterator& it) {
        on_apply_func_(&it);
    }
private:
    OnApplyFunction on_apply_func_;
};

extern "C" 
{
typedef void* BraftStateMachinePtr;

BraftStateMachinePtr create_state_machine(...) {
    return new BraftStateMachine(...);
}

void set_on_apply_function(BraftStateMachinePtr* sm, OnApplyFunction func) {
    ((BraftStateMachine*)sm) -> set_on_apply(func);
}

void start_state_machine(BraftStateMachinePtr* sm) {
    ((BraftStateMachine*)sm) ->Start();
}
}
//==================
// c code example
BraftStateMachinePtr state_machine = create_state_machine(...);
set_on_apply_function(state_machine, func);
// ... 这里还需要set一大堆 on_xxx 函数
start_state_machine(state_machine);
// ....

hjk41 avatar Jun 19 '19 09:06 hjk41

请问下这个有计划弄吗?

JiaRG avatar Feb 01 '23 01:02 JiaRG