mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-02 08:25:40 +02:00
Forking and waitpid()-ing for the -C/-c shell filters used to happen directly in the multi-threaded tiling threads, which made fork() expensive (full COW of the parent's address space) and unsafe (other threads could hold libc/malloc locks at fork time). Now we pre-fork a small pool of single-threaded worker processes once, before any tiling or reader threads are spawned, and the tiling threads ask a worker to fork+exec the shell child on their behalf, receiving the input/output pipe fds back via SCM_RIGHTS. The fork() and waitpid() happen entirely inside the single-threaded worker, where they are cheap and only block that worker. Co-authored-by: Cursor <cursoragent@cursor.com>
18 lines
1.1 KiB
C++
18 lines
1.1 KiB
C++
struct key_pool;
|
|
|
|
// Identifies which worker process is currently running a filter on this
|
|
// thread's behalf. Returned by setup_filter and consumed by wait_filter.
|
|
struct filter_handle {
|
|
ssize_t worker_idx = -1;
|
|
};
|
|
|
|
std::vector<mvt_layer> filter_layers(const char *filter, std::vector<mvt_layer> &layer, unsigned z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps, int extent);
|
|
void setup_filter(const char *filter, int *write_to, int *read_from, filter_handle *handle, unsigned z, unsigned x, unsigned y);
|
|
void wait_filter(filter_handle handle);
|
|
serial_feature parse_feature(json_pull *jp, int z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps, bool filters, key_pool &key_pool);
|
|
|
|
// Pre-fork the pool of single-threaded filter worker processes used by
|
|
// setup_filter / wait_filter. Must be called from a single-threaded context
|
|
// (i.e. before any reader or tiling threads are spawned).
|
|
void filter_workers_init(size_t n);
|