>> To best plugin for starting is plugins/emperor_pg (the postgresql one).
>>
>> Basically you "register" an "imperial monitor" and it will be triggered
>> at
>> the right moment.
>
> In this case, the emperor doesn't know the right moment. My plugin will
> be notified via a socket when it needs to do something. So I don't want
> to add/stop/respawn the vassals when the emperor loops through my plugin.
>
> I only need to add vassals on startup. How do I do that? A flag in
> _init, and then clear the flag in the monitor func?
>
>> Only the emperor process has access to the "ui" pointer, while the
>> init()
>> hook is called on startup (before it is available as you have already
>> noted)
>
> That simple change seemd to work still
>
> --
> дамјан
> _______________________________________________
> uWSGI mailing list
> [email protected]
> http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi
>


You can register a uwsgi_thread (is a funny abstraction that gives you a
thread and a communication channel) in the imperial monitor and just call
the various emperor_add() on the first round and after that you simply
wait for events.

In pseudo-code:

// this run continuously from a thread waiting for your socket
my_loop(ut) {
  for(;;) {
    wait_for_event_on_your_socket();
    // write a message to the thread communication channel
    write(ut->pipe[0], "message", msg_len);
  }
}


// this function is called by the emperor whenever the thread send a message
void foobar_event(ues) {
    char msg[4096];
    ssize_t len = read(ues->fd, msg, 4096);

    ...do something with the message...
}

the imperial monitor
yourplugin_imperial_cycle(ues) {
 // on the first round you create the thread
 // and you spawns the static vassals
 // on the second round you start monitoring events from your thread
 int round = 0;
 if (round == 0) {
   uwsgi_thread *ut = uwsgi_thread_new(my_loop);
   emperor_add()
   emperor_add()
   emperor_add()
   round++;
 }
 else if (round == 1) {
   // this set the function to call whenever a message
   //is generated on the thread
   ues->event_func = foobar_event;
   // here we start waiting for thread events
   event_queue_add_fd_read(uwsgi.emperor_queue, ut->pipe[1]);
   round++;
 }
}


-- 
Roberto De Ioris
http://unbit.it
_______________________________________________
uWSGI mailing list
[email protected]
http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi

Reply via email to