// This file contains debug specific implementation.
// This file is part of the aMule project.
//
// Copyright (c) 2003, Carlo Wood <carlo@alinoe.com>
//
// This program 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 2 of the License, or (at your option) any later version.
// 
// This program 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 this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//

#include "sys.h"
#include "Debug.h"

#ifdef CWDEBUG

// This lock is only used for libcwd so far, so put this here.
extern pthread_mutex_t cout_mutex;

namespace debug {
  namespace channels {	// namespace DEBUGCHANNELS
    namespace dc {

      // Add new debug channels here.
      //libcw::debug::channel_ct custom("CUSTOM");

    } // namespace dc
  } // namespace DEBUGCHANNELS

  // Initialize debugging code from new threads.
  void init_thread(void)
  {
    // Everything below needs to be repeated at the start of every
    // thread function, because every thread starts in a completely
    // reset state with all debug channels off etc.

    // Turn on all debug channels by default.
    ForAllDebugChannels( while (!debugChannel.is_on()) debugChannel.on() );
    // Turn off specific debug channels.
    Debug( dc::bfd.off() ); 
    Debug( dc::malloc.off() ); 

    // Turn on debug output.
    Debug( libcw_do.on() );
    Debug( libcw_do.set_ostream(&std::cout, &cout_mutex) );

    // Set the thread id in the margin.
    char margin[12];
    sprintf(margin, "%-10lu ", pthread_self());
    Debug( libcw_do.margin().assign(margin, 11) );

    // Write a list of all existing debug channels to the default debug device.
    Debug( list_channels_on(libcw_do) );
  }

  // Initialize debugging code from main().
  void init(void)
  {
    // You want this, unless you mix streams output with C output.
    // Read  http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#8 for an explanation.
    // We can't use it, because other code uses printf to write to the console.
    //std::ios::sync_with_stdio(false);

    // This will warn you when you are using header files that do not belong to the
    // shared libcwd object that you linked with.
    Debug( check_configuration() );

#if CWDEBUG_ALLOC
    // Remove all current (pre- main) allocations from the Allocated Memory Overview.
    libcw::debug::make_all_allocations_invisible_except(NULL);
#endif

    init_thread();

    Debug( read_rcfile() );
  }

} // namespace debug

#endif // CWDEBUG

