# This "test" is used by autotest_lib.server.standalone_profilers to start
# and stop profilers on a collection of hosts at approximately the same
# time by synchronizing using barriers.

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import barrier

class profiler_sync(test.test):
    version = 1


    def execute(self, timeout_sync, timeout_start, timeout_stop,
                hostid, mainid, all_ids):
        """
        @param timeout_sync: Seconds to wait for the synchronization of all
                hosts that will be launching profilers. (local_sync_profilers)
        @param timeout_start: Seconds to wait for each of the initial
                sync_profilers and start_profilers barriers between this
                host and the main to be reached.
        @param timeout_stop: Seconds to wait for this host and the main to
                reach each of the stop_profilers and finish_profilers barriers.
        @param hostid: This host's id (typically the hostname).
        @param mainid: The main barrier host id where autoserv is running.
        @param all_ids: A list of all hosts to synchronize profilers on.
        """
        profilers = self.job.profilers

        barrier_server = barrier.listen_server(port=11920)
        b0 = self.job.barrier(hostid, "sync_profilers", timeout_start,
                              listen_server=barrier_server)
        b0.rendezvous_servers(mainid, hostid)

        b1 = self.job.barrier(hostid, "start_profilers", timeout_start,
                              listen_server=barrier_server)
        b1.rendezvous_servers(mainid, hostid)

        b2 = self.job.barrier(hostid, "local_sync_profilers", timeout_sync)
        b2.rendezvous(*all_ids)

        profilers.start(self)

        b3 = self.job.barrier(hostid, "stop_profilers", timeout_stop,
                              listen_server=barrier_server)
        b3.rendezvous_servers(mainid, hostid)

        profilers.stop(self)
        profilers.report(self)

        b4 = self.job.barrier(hostid, "finish_profilers", timeout_stop,
                              listen_server=barrier_server)
        b4.rendezvous_servers(mainid, hostid)

        barrier_server.close()
