Skip to content

Two dir_monitors on a single io_service #42

@GamePad64

Description

@GamePad64

Well, I have tried to create two different dir_monitor instances (for different folders) on a single dir_monitor with a code like this:

#include <dir_monitor/dir_monitor.hpp>
#include <iostream>

struct moni {
    moni(boost::asio::io_service& ios) : m1(ios), m2(ios) {}
    boost::asio::dir_monitor m1, m2;

    void m1_operation() {
        std::cout << 1 << std::endl;
            m1.async_monitor([this](boost::system::error_code ec, boost::asio::dir_monitor_event ev){
                    if(ec == boost::asio::error::operation_aborted) return;

                    std::cout << ev << std::endl;
                    m1_operation();
            });
    }

    void m2_operation() {
        std::cout << 2 << std::endl;
            m2.async_monitor([this](boost::system::error_code ec, boost::asio::dir_monitor_event ev){
                    if(ec == boost::asio::error::operation_aborted) return;

                    std::cout << ev << std::endl;
                    m2_operation();
            });
    }
};

int main() {
    boost::asio::io_service ios;
    moni m(ios);

    m.m1.add_directory("path_to_dir1");
    m.m2.add_directory("path_to_dir2");

    m.m1_operation();
    m.m2_operation();

    ios.run();
}

And I got something strange:

1
2
dir_monitor_event ADDED "/home/gamepad/Librevault/New Folder"
1
dir_monitor_event ADDED "/home/gamepad/Librevault2/New Folder (1)"
2
dir_monitor_event ADDED "/home/gamepad/Librevault/.librevault/librevault.db-journal"
1
dir_monitor_event ADDED "/home/gamepad/Librevault2/.librevault/librevault.db-journal"
2
dir_monitor_event MODIFIED "/home/gamepad/Librevault/.librevault/librevault.db-journal"
1
dir_monitor_event MODIFIED "/home/gamepad/Librevault2/.librevault/librevault.db-journal"
2
dir_monitor_event REMOVED "/home/gamepad/Librevault/.librevault/librevault.db-journal"
1
dir_monitor_event REMOVED "/home/gamepad/Librevault2/.librevault/librevault.db-journal"
2

The files were modified in a random order, but processed only in 1-2-1-2-1-2. If there were no changes in 1'st folder, then dir_monitor blocked and waited for changes in 1'st folder. 2'nd folder changes were processed only after the 1'st directory got some changes.

This is abnormal behavior for boost::asio. Btw, two dir_monitors on two separate io_services work fine.
Tested with inotify and fsevents backends. Reproducible in 100% cases.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions