This is pretty hackish! It would be nice to be able to switch to
meson, but TurboPFor makes that a bit tricky right now.
CPPFLAGS=-ITurboPFor-Integer-Compression/
INSTALL ?= install
PREFIX ?= /usr/local
CPPFLAGS=-ITurboPFor-Integer-Compression/
INSTALL ?= install
PREFIX ?= /usr/local
+URING_LIBS = $(shell pkg-config --libs liburing)
+
+ifeq ($(URING_LIBS),)
+ CPPFLAGS += -DWITHOUT_URING
+endif
all: plocate plocate-build
plocate: plocate.o io_uring_engine.o TurboPFor-Integer-Compression/libic.a
all: plocate plocate-build
plocate: plocate.o io_uring_engine.o TurboPFor-Integer-Compression/libic.a
- $(CXX) -o $@ $^ -lzstd $(shell pkg-config --libs liburing)
+ $(CXX) -o $@ $^ -lzstd $(URING_LIBS)
plocate-build: plocate-build.o TurboPFor-Integer-Compression/libic.a
$(CXX) -o $@ $^ -lzstd
plocate-build: plocate-build.o TurboPFor-Integer-Compression/libic.a
$(CXX) -o $@ $^ -lzstd
#include <stdint.h>
#include <unistd.h>
#include <memory>
#include <stdint.h>
#include <unistd.h>
#include <memory>
IOUringEngine::IOUringEngine()
{
IOUringEngine::IOUringEngine()
{
+#ifdef WITHOUT_URING
+ int ret = -1;
+#else
int ret = io_uring_queue_init(queue_depth, &ring, 0);
int ret = io_uring_queue_init(queue_depth, &ring, 0);
using_uring = (ret >= 0);
}
using_uring = (ret >= 0);
}
if (pending_reads < queue_depth) {
io_uring_sqe *sqe = io_uring_get_sqe(&ring);
if (sqe == nullptr) {
if (pending_reads < queue_depth) {
io_uring_sqe *sqe = io_uring_get_sqe(&ring);
if (sqe == nullptr) {
} else {
queued_reads.push(QueuedRead{ fd, len, offset, move(cb) });
}
} else {
queued_reads.push(QueuedRead{ fd, len, offset, move(cb) });
}
void IOUringEngine::submit_read_internal(io_uring_sqe *sqe, int fd, size_t len, off_t offset, function<void(string)> cb)
{
void *buf;
void IOUringEngine::submit_read_internal(io_uring_sqe *sqe, int fd, size_t len, off_t offset, function<void(string)> cb)
{
void *buf;
io_uring_sqe_set_data(sqe, pending);
++pending_reads;
}
io_uring_sqe_set_data(sqe, pending);
++pending_reads;
}
void IOUringEngine::finish()
{
void IOUringEngine::finish()
{
int ret = io_uring_submit(&ring);
if (ret < 0) {
fprintf(stderr, "io_uring_submit: %s\n", strerror(-ret));
int ret = io_uring_submit(&ring);
if (ret < 0) {
fprintf(stderr, "io_uring_submit: %s\n", strerror(-ret));
}
void complete_pread(int fd, void *ptr, size_t len, off_t offset)
}
void complete_pread(int fd, void *ptr, size_t len, off_t offset)
#include <queue>
#include <string>
#include <stdint.h>
#include <queue>
#include <string>
#include <stdint.h>
+#endif
+#include <sys/socket.h>
class IOUringEngine {
public:
class IOUringEngine {
public:
size_t get_waiting_reads() const { return pending_reads + queued_reads.size(); }
private:
size_t get_waiting_reads() const { return pending_reads + queued_reads.size(); }
private:
void submit_read_internal(io_uring_sqe *sqe, int fd, size_t len, off_t offset, std::function<void(std::string)> cb);
io_uring ring;
void submit_read_internal(io_uring_sqe *sqe, int fd, size_t len, off_t offset, std::function<void(std::string)> cb);
io_uring ring;
size_t pending_reads = 0; // Number of requests we have going in the ring.
bool using_uring;
size_t pending_reads = 0; // Number of requests we have going in the ring.
bool using_uring;