gri_logger.cc

来自「这是用python语言写的一个数字广播的信号处理工具包。利用它」· CC 代码 · 共 175 行

CC
175
字号
/* -*- c++ -*- *//* * Copyright 2006 Free Software Foundation, Inc. *  * This file is part of GNU Radio *  * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. *  * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING.  If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, * Boston, MA 02110-1301, USA. */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <gri_logger.h>#include <stdio.h>#include <stdarg.h>#include <stdexcept>#include <boost/weak_ptr.hpp>#include <string.h>/* * This class creates the thread that reads from the ringbuffer and * and writes to the file.  This is opaque to the user. */class gri_log_poster : public omni_thread{  FILE		       *d_fp;  gr_buffer_sptr	d_writer;  gr_buffer_reader_sptr	d_reader;  omni_semaphore	d_ringbuffer_ready;  volatile bool		d_time_to_die;  volatile bool		d_writer_overrun;  virtual void* run_undetached(void * arg);public:  gri_log_poster(const char *filename);  ~gri_log_poster();  void kill() { d_time_to_die = true; post(); }  gr_buffer_sptr writer() const { return d_writer; }  void post() { d_ringbuffer_ready.post(); }  void note_writer_overrun() { d_writer_overrun = true; }};gri_log_poster::gri_log_poster(const char *filename)  : omni_thread(),    d_ringbuffer_ready(1, 1),		// binary semaphore    d_time_to_die(false),    d_writer_overrun(false){  if ((d_fp = fopen(filename, "w")) == 0){    perror (filename);    throw std::runtime_error("can't open file");  }  // Create a 1MB buffer.  d_writer = gr_make_buffer(1 * 1024 * 1024, sizeof(unsigned char));  d_reader = gr_buffer_add_reader(d_writer, 0);  start_undetached();  // start the thread}gri_log_poster::~gri_log_poster(){  if (d_fp != 0){    fclose(d_fp);    d_fp = 0;  }}/* * This is the body of the logging thread. */void *gri_log_poster::run_undetached(void *arg){  int nbytes;  //fprintf(stderr, "Enter: run_undetached!\n");  while (!d_time_to_die){    while ((nbytes = d_reader->items_available()) > 0){      fwrite(d_reader->read_pointer(), 1, nbytes, d_fp);      d_reader->update_read_pointer(nbytes);    }    fflush(d_fp);    d_ringbuffer_ready.wait();    if (d_writer_overrun){      fputs(">>>>> gri_logger: writer overrun.  Info lost <<<<<\n", d_fp);      d_writer_overrun = false;    }  }  // fprintf(stderr, "Exit: run_undetached!\n");  return 0;}// ------------------------------------------------------------------------static boost::weak_ptr<gri_logger> s_singleton;  // weak pointer IQ test ;-)static omni_mutex s_singleton_mutex;gri_logger_sptrgri_logger::singleton(){  omni_mutex_lock l(s_singleton_mutex);  gri_logger_sptr r;  if (r = s_singleton.lock())    return r;  r = gri_logger_sptr(new gri_logger("gri_logger.log"));  s_singleton = r;  return r;}  gri_logger::gri_logger(const char *filename){  d_poster = new gri_log_poster(filename);}gri_logger::~gri_logger(){  d_poster->kill();  d_poster->join(NULL);}voidgri_logger::write(const void *buf, size_t count){  omni_mutex_lock l(d_write_mutex);  gr_buffer_sptr writer = d_poster->writer();    // either write it all, or drop it on the ground  if (count <= (size_t) writer->space_available()){    memcpy(writer->write_pointer(), buf, count);    writer->update_write_pointer(count);    d_poster->post();  }  else {    d_poster->note_writer_overrun();  }}voidgri_logger::printf(const char *format, ...){  va_list	ap;  char		buf[4096];  int		n;    va_start(ap, format);  n = vsnprintf(buf, sizeof(buf), format, ap);  va_end(ap);  if (n > -1 && n < (ssize_t) sizeof(buf))    write(buf, n);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?