runtime/dyninst/transport.h - systemtap

Data types defined

Macros defined

Source code

// stapdyn transport functions
// Copyright (C) 2013 Red Hat Inc.
//
// This file is part of systemtap, and is free software.  You can
// redistribute it and/or modify it under the terms of the GNU General
// Public License (GPL); either version 2, or (at your option) any
// later version.

#ifndef TRANSPORT_H
#define TRANSPORT_H

#define STP_DYN_EXIT        0x0001
#define STP_DYN_NORMAL_DATA    0x0002
#define STP_DYN_OOB_DATA    0x0004
#define STP_DYN_SYSTEM        0x0008
#define STP_DYN_REQUEST_EXIT    0x0010

#define STP_DYN_OOB_DATA_MASK (STP_DYN_OOB_DATA | STP_DYN_SYSTEM)

// The size of print buffers. This limits the maximum amount of data a
// print can send. Note that it must be a power of 2 (which is why
// we're using a bit shift). For reference sake, here are the
// resulting sizes with various shifts: 13 (8kB), 14 (16kB), 15 (32kB),
// 16 (64kB), 17 (128kB), 18 (256kB), 19 (512kB), and 20 (1MB).
#ifndef STP_BUFFER_SIZE_SHIFT
#define STP_BUFFER_SIZE_SHIFT 20
#endif
#define _STP_DYNINST_BUFFER_SIZE (1 << STP_BUFFER_SIZE_SHIFT)

// The size of an individual log message.
#ifndef STP_LOG_BUF_LEN
#define STP_LOG_BUF_LEN 256
#endif
#if (STP_LOG_BUF_LEN < 10) /* sizeof(WARN_STRING) */
#error "STP_LOG_BUF_LEN is too short"
#endif

// The maximum number of log messages the buffer can hold. Note that
// it must be a power of 2 (which is why we're using a bit shift).
#ifndef STP_LOG_BUF_ENTRIES_SHIFT
#define STP_LOG_BUF_ENTRIES_SHIFT 4
#endif
#define _STP_LOG_BUF_ENTRIES (1 << STP_LOG_BUF_ENTRIES_SHIFT)

// The total size of the log buffer
#define _STP_DYNINST_LOG_BUF_LEN (STP_LOG_BUF_LEN * _STP_LOG_BUF_ENTRIES)

// The maximum number of queue items each transport queue can
// hold.
#ifndef STP_DYNINST_QUEUE_ITEMS
#define STP_DYNINST_QUEUE_ITEMS 64
#endif

struct _stp_transport_queue_item {
    // The type variable lets the thread know what it needs to do.
    unsigned type;

    // 'data_index' indicates which context structure we're
    // working on. */
    int data_index;

    // When 'type' indicates that normal or oob data needs to be
    // output, this is the data offset.
    size_t offset;

    // When 'type' indicates that normal or oob data needs to be
    // output, this is the number of bytes to output.
    size_t bytes;
};

struct _stp_transport_queue {
    size_t items;
    struct _stp_transport_queue_item queue[STP_DYNINST_QUEUE_ITEMS];
};

// This structure is stored in the session data.
struct _stp_transport_session_data {
    unsigned write_queue;
    struct _stp_transport_queue queues[2];
    pthread_mutex_t queue_mutex;
    pthread_cond_t queue_space_avail;
    pthread_cond_t queue_data_avail;
};

// This structure is stored in every context structure.
struct _stp_transport_context_data {
    /* The buffer and variables used for print messages */
    size_t read_offset;
    size_t write_offset;
    size_t write_bytes;
    char print_buf[_STP_DYNINST_BUFFER_SIZE];
    /* The condition variable is used to signal our thread. */
    pthread_cond_t print_space_avail;
    /* The lock for this print state. */
    pthread_mutex_t print_mutex;

    /*
     * The buffer and variables used for log (warn/error)
     * messages. Note that 'log_buf' is a true circular buffer
     * (unlike print_buf). Also note that 'log_start' and
     * 'log_end' are entry numbers (not offsets).
     */
    size_t log_start;        /* index of oldest entry */
    size_t log_end;            /* where to write new entry */
    char log_buf[_STP_DYNINST_LOG_BUF_LEN];
    /* The condition variable is used to signal space available. */
    pthread_cond_t log_space_avail;
    /* The lock for 'log_space_avail'. */
    pthread_mutex_t log_mutex;
};

static int _stp_dyninst_transport_session_init(void);

static int _stp_dyninst_transport_session_start(void);

static int _stp_dyninst_transport_write_oob_data(char *buffer, size_t bytes);

static int _stp_dyninst_transport_write(void);

static char *_stp_dyninst_transport_log_buffer(void);

static void _stp_dyninst_transport_shutdown(void);

static void _stp_dyninst_transport_request_exit(void);

#endif // TRANSPORT_H