add python ffi example wrapper code

pull/1/head
Jeff Becker 6 years ago
parent 3f21cc5865
commit e58bd10b23
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -59,6 +59,7 @@ add_library(${SHARED_LIB} SHARED ${LIB_SRC})
add_executable(${EXE} ${EXE_SRC}) add_executable(${EXE} ${EXE_SRC})
target_link_libraries(${EXE} ${STATIC_LIB} ${LIBS}) target_link_libraries(${EXE} ${STATIC_LIB} ${LIBS})
target_link_libraries(${SHARED_LIB} ${LIBS})
add_executable(rcutil daemon/rcutil.cpp) add_executable(rcutil daemon/rcutil.cpp)
target_link_libraries(rcutil ${STATIC_LIB} ${LIBS}) target_link_libraries(rcutil ${STATIC_LIB} ${LIBS})

@ -0,0 +1,41 @@
#!/usr/bin/env python3
from ctypes import *
import signal
import time
import threading
class LLARP(threading.Thread):
lib = None
ctx = None
def signal(self, sig):
if self.ctx and self.lib:
self.lib.llarp_main_signal(self.ctx, int(sig))
def run(self):
code = self.lib.llarp_main_run(self.ctx)
print ("llarp_main_run exited with status {}".format(code))
def main():
llarp = LLARP()
llarp.lib = CDLL("./libllarp.so")
llarp.ctx = llarp.lib.llarp_main_init(b'daemon.ini')
if llarp.ctx:
llarp.start()
try:
while True:
print("busy loop")
time.sleep(1)
except KeyboardInterrupt:
llarp.signal(signal.SIGINT)
finally:
llarp.lib.llarp_main_free(llarp.ctx)
return
if __name__ == '__main__':
main()

@ -17,10 +17,13 @@ main(int argc, char *argv[])
const char *conffname = "daemon.ini"; const char *conffname = "daemon.ini";
if(argc > 1) if(argc > 1)
conffname = argv[1]; conffname = argv[1];
ctx = llarp_main_init(conffname);
if(llarp_main_init(&ctx, conffname)) int code = 1;
if(ctx)
{ {
signal(SIGINT, handle_signal); signal(SIGINT, handle_signal);
return llarp_main_run(ctx); code = llarp_main_run(ctx);
llarp_main_free(ctx);
} }
return code;
} }

@ -15,8 +15,8 @@ extern "C" {
struct llarp_main; struct llarp_main;
/** initialize application context and load config */ /** initialize application context and load config */
bool struct llarp_main *
llarp_main_init(struct llarp_main **ptr, const char *fname); llarp_main_init(const char *fname);
/** handle signal for main context */ /** handle signal for main context */
void void
@ -27,7 +27,7 @@ int
llarp_main_run(struct llarp_main *ptr); llarp_main_run(struct llarp_main *ptr);
void void
llarp_main_free(struct llarp_main **ptr); llarp_main_free(struct llarp_main *ptr);
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -211,11 +211,11 @@ struct llarp_main
std::unique_ptr< llarp::Context > ctx; std::unique_ptr< llarp::Context > ctx;
}; };
bool struct llarp_main *
llarp_main_init(struct llarp_main **ptr, const char *fname) llarp_main_init(const char *fname)
{ {
if(!fname) if(!fname)
return false; return nullptr;
llarp_main *m = new llarp_main; llarp_main *m = new llarp_main;
m->ctx.reset(new llarp::Context(std::cout)); m->ctx.reset(new llarp::Context(std::cout));
@ -223,10 +223,9 @@ llarp_main_init(struct llarp_main **ptr, const char *fname)
{ {
m->ctx->Close(); m->ctx->Close();
delete m; delete m;
return false; return nullptr;
} }
*ptr = m; return m;
return true;
} }
void void
@ -238,16 +237,13 @@ llarp_main_signal(struct llarp_main *ptr, int sig)
int int
llarp_main_run(struct llarp_main *ptr) llarp_main_run(struct llarp_main *ptr)
{ {
auto code = ptr->ctx->Run(); return ptr->ctx->Run();
ptr->ctx->Close();
return code;
} }
void void
llarp_main_free(struct llarp_main **ptr) llarp_main_free(struct llarp_main *ptr)
{ {
if(*ptr) ptr->ctx->Close();
delete *ptr; delete ptr;
*ptr = nullptr;
} }
} }

Loading…
Cancel
Save