import os
import signal
import tempfile
import gc

from datetime import datetime
from meliae import scanner


def dump_memory(signum, frame):
    """
    Dump memory stats for the current process to a temp directory.
    Uses the meliae output format.
    """

    timestamp = datetime.now().isoformat()
    format_str = '{}/meliae.{}.{}.{{}}.dump'.format(
        tempfile.gettempdir(),
        timestamp,
        os.getpid(),
    )

    scanner.dump_all_objects(format_str.format('pre-gc'))

    # force garbarge collection
    for gen in xrange(3):
        gc.collect(gen)
        scanner.dump_all_objects(
            format_str.format("gc-gen-{}".format(gen))
        )


def install_memory_dumper(dump_signal=signal.SIGPROF):
    """
    Install a signal handler on `signal` to dump memory stats for the current process.
    """
    signal.signal(dump_signal, dump_memory)
