I have 3rd party library, which is nonblocking and has its own event loop, it accepts pointer of callback function and executes it in same thread. What I want is to post event from this thread to nginx main thread, something like ngx_add_timer but without time option, to safely add event to nginx main event loop.
Related Questions in MULTITHREADING
- How can I outsource worker processes within a for loop?
- OpenMP & oneTbb difference
- Receiving Notifications for Individual Task Completion OmniThreadLibrary Parallel.ForEach
- C++ error: no matching member function for call to 'enqueue' futures.emplace_back(TP.enqueue(sum_plus_one, x, &M));
- How can I create a thread in Haskell that will restart if it gets killed due to any reason?
- Qt: running callback in the main thread from the worker thread
- Using `static` on a AVX2 counter function increases performance ~10x in MT environment without any change in Compiler optimizations
- Heap sort with multithreading
- windows multithreading CreateMutex
- The problem of "fine-grained locks and two-phase locking algorithm"
- OpenMP multi-threading not working if OpenMPI set to use one or two MPI processor
- WPF Windows Initializing is locking the separated thread in .Net 8
- TCP Client Losing Connection When Writing Data
- vc++ thread constructor throwing compiler error c2672
- ASP.NET Core 6 Web API : best way to pause before resending email
Related Questions in NGINX
- Nginx reverse proxy with query parameters not working
- Root path analogue in uWSGI as in Uvicorn
- Keycloak: How to override Welcome Screen redirect behavior (to custom realm, instead of master realn/admin)
- nginx set up reverse proxy from subfolder to a port
- Nginx Not Correctly Redirecting Users To Custom Page
- How to connect to ssh server with domain name
- Nginx configuration file and SSL certificate errors in Docker
- Invalid Host header not being rejected by nginx
- Nginx only caches file endpoints
- How to configure Nginx for a VPS?
- Problem with changing default NGINX 404 error page
- My VPS does not accept HTTPS requests on a port other than 443
- NGINX Configuration Issue with Next.js and Strapi Project
- Openshift nginx proxy_pass not redirecting from current host to another
- Adonis.js in production : ENOENT: no such file or directory, open '/public/assets/.vite/manifest.json'
Related Questions in EVENT-HANDLING
- WinForms, event unable to subscribe from a custom class
- Removing the beforeunload event does not work in React
- Why won't drag event trigger on first attempt?
- Terminating turbolinks:click event listener once a user has navigated away from a form
- event handling for overlapping polygons in google maps
- Global event monitoring with WPF
- nodejs EventsEmitter, replace the last event handler with a new one
- What is the difference between "Action<object?, EventArgs>" and "EventHandler(object? sender, EventArgs e)"?
- React vs JS event handlers for clicking outside the component, which one is best practice?
- Event Handler removing subscribed function not affected
- Can I prevent enter key press from calling change event of Input tag?
- scrolling problem with combobox inside datagrid inside scrollviewer
- Powershell - Nested loops seeming to ignore if statement
- Trouble with 'keydown' Event in Chrome Extension: Capturing Backspace Action
- Why doesn't preventDefault() of an input event stop changes to the value of a form element
Related Questions in NGINX-MODULE
- Error building dynamic Module ngx_brotli on Ubuntu 20.04 Raspberry Pi 4
- NGINX Module while Handling subrequest callback expected behvior when rc is NGX_AGAIN
- NGINX module with array command results in segmentation fault
- Nginx: install dynamic module on the server
- r.requestBody/r.requestText/r.requestBuffer is undefined (NJS - JavaScript Modules on NGINX)
- When writing a module in C, how to correctly reference header files upon which the module is built?
- Which phase of request processing does the ngx_http_proxy_module register itself?
- nginx mod_zip does not calculate checksum for upstream files
- NGINX module to edit request body
- add Nginx 1.20.1 GeoIP2 module
- nginx - njs - ngx_http_auth_request_module how to return 302 to user?
- 'connection reset by peer' for large response body by nginx mirror module
- nginx: [emerg] invalid port in url "https://x.x.x.x./live/rtmp/auth"?
- How to install nginx without the modules in RedHat
- Wordpress nginx map value not working in cloudpanel.io
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
So very late to the party here, but I found this thread in my research and wanted to post the solution I came up with
Nginx has a mechanism to post from a worker thread - one that is perhaps running another event loop - to the main thread of the nginx worker process. That is 'ngx_post_event' which lets you post an event handler which will be invoked at some point in the future by the main thread.
You have to choose an event queue to post it on, but whatever you're doing, the answer is certainly &ngx_posted_events.
Here we come to the problem (and a solution): if you do this, your event handler will not get invoked in a timely manner because the main nginx worker process thread is waiting on i/o. It won't even deign to look at the posted events queue until it has some 'real' work to do from i/o.
The solution that's working for me currently (and bear in mind this is only on Linux), is to send the main thread a signal which will wake it up from its epoll_wait reverie so it can get to work on the pipeline coming from the other thread.
So here's what worked:
First grab the id of the worker process main thread and hold it in some process-global state:
// In you 'c' source:
static pthread_t nginx_thread;
// In some code that runs once at nginx startup (in my case the module's preconfiguration step)
Now when to post your callback you use the ngx_post_event call I mentioned earlier, then send a SIGIO signal to the main thread to wake up the epoll_wait operation
The SIGIO event is handled in the main Nginx signal handler - and is ignored (well that's what the log says), but crucially, causes the posted events to be processed immediately.
That's it - and it seems to be working so far... please do point out anything stupid I've done.
To complete the story, you'll need the following #includes:
#include <pthread.h>
#include <signal.h>