← Back to team overview

mosquitto-users team mailing list archive

Re: using libmosquitto in an external event loop

 

Hi Andy^2,

My use case includes listening on multiple sockets/pipes/devs simultaneously, processing and then passing on the message. mqtt_lua is not evented AFAIK. You need to call mqtt_client:handler() every second or so, much like mosquitto_loop.

I like the fact that libmosquitto allows loop polling, integration with an external event loop and a threaded approach with internal event loop.

Cheers
/Bart


On 12/12/2012 10:43 PM, andypiperuk@xxxxxxxxx wrote:
You know that the Eclipse Paho project has a Lua client due to hit Git
within days, right?

On Wednesday, December 12, 2012, Bart Van Der Meerssche wrote:

    Hello list,

    I'm currently writing Lua bindings for libmosquitto [1]. Since Lua
    does not support preemptive multithreading, using
    mosquitto_loop_start is not an option. As suggested in the
    libmosquitto documentation, I'm integrating
    mosquitto_loop_read/write/misc into a Lua event loop instead. The
    basic functionality works ok. However, when a network error occurs
    or the broker shuts down, the event loop starts busy looping. strace
    output:

    poll([{fd=5, events=POLLIN}, {fd=6, events=POLLIN}], 2, -1) = 1
    ([{fd=6, revents=POLLIN}])
    read(6, "", 1)                          = 0
    poll([{fd=5, events=POLLIN}, {fd=6, events=POLLIN}], 2, -1) = 1
    ([{fd=6, revents=POLLIN}])
    read(6, "", 1)                          = 0

    ...

    stracing the libmosquitto event loop:
    [pid 12721] select(4, [3], [], NULL, {1, 0}) = 1 (in [3], left {0,
    332713})
    [pid 12721] read(3, "", 1)              = 0
    [pid 12721] close(3)                    = 0

    Looking at the mosquitto_loop code shows that if a read or write
    error occurs, the socket is closed with the private
    _mosquitto_socket_close function, which updates the internal mosq
    state as well. This means that the current libmosquitto API doesn't
    allow a proper implementation in an external event loop. Making
    _mosquitto_socket_close public would be a start. Integrating the rc
    handling of:
    * rc = mosquitto_loop_read(mosq, max_packets)
    * rc = mosquitto_loop_write(mosq, max_packets)
    inside these public functions could be an even cleaner approach.

    Would such a code change be an option?

    [1]
    https://github.com/flukso/__flm02/tree/rfm12/openwrt/__package/lua-mosquitto/src
    <https://github.com/flukso/flm02/tree/rfm12/openwrt/package/lua-mosquitto/src>


    Cheers
    /Bart

    --
    Mailing list: https://launchpad.net/~__mosquitto-users
    <https://launchpad.net/~mosquitto-users>
    Post to     : mosquitto-users@xxxxxxxxxxxxxxxxxxx
    Unsubscribe : https://launchpad.net/~__mosquitto-users
    <https://launchpad.net/~mosquitto-users>
    More help   : https://help.launchpad.net/__ListHelp
    <https://help.launchpad.net/ListHelp>



--
Sent from Gmail Mobile


Follow ups

References