test_objmgr_mem.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:10k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_objmgr_mem.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:47:17  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #include <ncbi_pch.hpp>
  10. #include <corelib/ncbiapp.hpp>
  11. #include <corelib/ncbienv.hpp>
  12. #include <corelib/ncbiargs.hpp>
  13. #include <corelib/ncbitime.hpp>
  14. #include <objmgr/object_manager.hpp>
  15. #include <objmgr/scope.hpp>
  16. #include <objmgr/bioseq_handle.hpp>
  17. #include <objmgr/seq_vector.hpp>
  18. #include <objmgr/seq_descr_ci.hpp>
  19. #include <objmgr/feat_ci.hpp>
  20. #include <objmgr/align_ci.hpp>
  21. #include <objtools/data_loaders/genbank/gbloader.hpp>
  22. #include <objects/seqset/Seq_entry.hpp>
  23. #include <objects/seqset/Bioseq_set.hpp>
  24. #include <objects/seq/Bioseq.hpp>
  25. #include <objects/seq/Seq_descr.hpp>
  26. #include <objects/seq/NCBI2na.hpp>
  27. #include <serial/object.hpp>
  28. #include <serial/objistr.hpp>
  29. #include <serial/objostr.hpp>
  30. #include <serial/objcopy.hpp>
  31. #include <serial/objectinfo.hpp>
  32. #include <serial/iterator.hpp>
  33. #include <serial/objectiter.hpp>
  34. #include <serial/serial.hpp>
  35. #include <memory>
  36. #include <fstream>
  37. USING_NCBI_SCOPE;
  38. using namespace objects;
  39. class CMemTestApp : public CNcbiApplication
  40. {
  41. public:
  42.     virtual void Init(void);
  43.     virtual int  Run (void);
  44. };
  45. void CMemTestApp::Init(void)
  46. {
  47.     // Prepare command line descriptions
  48.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  49.     arg_desc->AddOptionalKey("gi", "SeqEntryID",
  50.                              "GI id of the Seq-Entry to fetch",
  51.                              CArgDescriptions::eInteger);
  52.     arg_desc->AddOptionalKey("count", "Count", "Repeat count",
  53.                              CArgDescriptions::eInteger);
  54.     arg_desc->AddOptionalKey("file", "File", "File with Seq-entry",
  55.                              CArgDescriptions::eInputFile);
  56.     arg_desc->AddFlag("objmgr", "Add entries from file to object manager");
  57.     arg_desc->AddFlag("iterate", "Run CTypeConstIterator<CSeq_feat>");
  58.     string prog_description = "memtest";
  59.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  60.                               prog_description, false);
  61.     SetupArgDescriptions(arg_desc.release());
  62. }
  63. int CMemTestApp::Run(void)
  64. {
  65.     const CArgs& args = GetArgs();
  66.     int gi = args["gi"]? args["gi"].AsInteger(): -1;
  67.     string file = args["file"]? args["file"].AsString(): string();
  68.     int repeat_count = args["count"]?args["count"].AsInteger():100;
  69.     bool add_to_objmgr = args["objmgr"];
  70.     bool run_iter = args["iterate"];
  71.     vector< CRef<CSeq_entry> > entries;
  72.     if ( file.size() ) {
  73.         ifstream ifs(file.c_str());
  74.         auto_ptr<CObjectIStream> is(CObjectIStream::Open(eSerial_AsnText,
  75.                                                          ifs));
  76.         const CClassTypeInfo *seqSetInfo =
  77.             (const CClassTypeInfo*)CBioseq_set::GetTypeInfo();
  78.         is->SkipFileHeader(seqSetInfo);
  79.         is->BeginClass(seqSetInfo);
  80.         while (TMemberIndex i = is->BeginClassMember(seqSetInfo)) {
  81.             const CMemberInfo &mi = *seqSetInfo->GetMemberInfo(i);
  82.             const string &miId = mi.GetId().GetName();
  83.             if (miId.compare("seq-set") == 0) {
  84.                 int count = 0;
  85.                 for (CIStreamContainerIterator m(*is, mi.GetTypeInfo());
  86.                      m; ++m) {
  87.                     CRef<CSeq_entry> entry(new CSeq_entry);
  88.                     {
  89.                         NcbiCout << "Reading Seq-entry: " << &*entry << NcbiEndl;
  90.                         m >> *entry;
  91.                     }
  92.                     if ( ++count <= repeat_count ) {
  93.                         if ( add_to_objmgr ) {
  94.                             CRef<CObjectManager> objMgr(new CObjectManager);
  95.                             CRef<CScope> scope(new CScope(*objMgr));
  96.                             scope->AddTopLevelSeqEntry(*entry);
  97.                             if ( run_iter ) {
  98.                                 for ( CTypeConstIterator<CSeq_feat> it=ConstBegin(*entry);
  99.                                       it; ++it ) {
  100.                                 }
  101.                             }
  102.                         }
  103.                         else {
  104.                             if ( run_iter ) {
  105.                                 for ( CTypeConstIterator<CSeq_feat> it=ConstBegin(*entry);
  106.                                       it; ++it ) {
  107.                                 }
  108.                             }
  109.                         }
  110.                     }
  111.                     if ( entry->ReferencedOnlyOnce() ) {
  112.                         NcbiCout << "Unreferenced: " << &*entry << NcbiEndl;
  113.                     }
  114.                     else {
  115.                         NcbiCout << "Still referenced: " << &*entry << NcbiEndl;
  116.                         entries.push_back(entry);
  117.                     }
  118.                 }
  119.             }
  120.             else {
  121.                 is->SkipObject(mi.GetTypeInfo());
  122.             }
  123.         }
  124.     }
  125.     else if ( gi > 0 ) {
  126.         for ( int count = 0; count < repeat_count; ++count ) {
  127.             typedef CNCBI2na TObject;
  128.             typedef map<const CObject*, int> TCounterMap;
  129.             TCounterMap cnt;
  130.             {
  131.                 CRef<CObjectManager> objMgr(new CObjectManager);
  132.                 objMgr->RegisterDataLoader(*new CGBDataLoader("ID"),
  133.                                            CObjectManager::eDefault);
  134.                 CScope scope(*objMgr);
  135.                 scope.AddDefaults();
  136.                 CSeq_id id;
  137.                 id.SetGi(gi);
  138.                 CBioseq_Handle bh = scope.GetBioseqHandle(id);
  139.                 const CSeq_entry& entry = bh.GetTopLevelSeqEntry();
  140.                 {
  141.                     const CObject* obj = &entry;
  142.                     int c = reinterpret_cast<const int*>(obj)[1];
  143.                     cnt[obj] = c;
  144.                     NcbiCout << "Entry at " << obj << " have counter " << c << NcbiEndl;
  145.                 }
  146.                 {
  147.                     const CObject* obj = &entry;
  148.                     int c = reinterpret_cast<const int*>(obj)[1];
  149.                     NcbiCout << "Entry at " << obj << " last counter " << c << NcbiEndl;
  150.                 }
  151.             }
  152.             ITERATE ( TCounterMap, it, cnt ) {
  153.                 const CObject* obj = it->first;
  154.                 int c = reinterpret_cast<const int*>(obj)[1];
  155.                 NcbiCout << "Object at " << obj << " last counter " << c << NcbiEndl;
  156.             }
  157.         }
  158.     }
  159.     NON_CONST_ITERATE ( vector< CRef<CSeq_entry> >, i, entries ) {
  160.         CRef<CSeq_entry> entry = *i;
  161.         i->Reset();
  162.         if ( entry->ReferencedOnlyOnce() ) {
  163.             NcbiCout << "Unreferenced: " << &*entry << NcbiEndl;
  164.         }
  165.         else {
  166.             NcbiCout << "Still referenced: " << &*entry << NcbiEndl;
  167.         }
  168.     }
  169.     return 0;
  170. }
  171. int main(int argc, const char* argv[])
  172. {
  173.     return CMemTestApp().AppMain(argc, argv, 0, eDS_Default, 0);
  174. }
  175. /*  $Id: test_objmgr_mem.cpp,v 1000.1 2004/06/01 19:47:17 gouriano Exp $
  176. * ===========================================================================
  177. *
  178. *                            PUBLIC DOMAIN NOTICE
  179. *               National Center for Biotechnology Information
  180. *
  181. *  This software/database is a "United States Government Work" under the
  182. *  terms of the United States Copyright Act.  It was written as part of
  183. *  the author's official duties as a United States Government employee and
  184. *  thus cannot be copyrighted.  This software/database is freely available
  185. *  to the public for use. The National Library of Medicine and the U.S.
  186. *  Government have not placed any restriction on its use or reproduction.
  187. *
  188. *  Although all reasonable efforts have been taken to ensure the accuracy
  189. *  and reliability of the software and data, the NLM and the U.S.
  190. *  Government do not and cannot warrant the performance or results that
  191. *  may be obtained by using this software or data. The NLM and the U.S.
  192. *  Government disclaim all warranties, express or implied, including
  193. *  warranties of performance, merchantability or fitness for any particular
  194. *  purpose.
  195. *
  196. *  Please cite the author in any work or product based on this material.
  197. *
  198. * ===========================================================================
  199. *
  200. * Authors:  Eugene Vasilchenko
  201. *
  202. * File Description:
  203. *   Test memory leaks in C++ object manager
  204. *
  205. * ---------------------------------------------------------------------------
  206. * $Log: test_objmgr_mem.cpp,v $
  207. * Revision 1000.1  2004/06/01 19:47:17  gouriano
  208. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  209. *
  210. * Revision 1.4  2004/05/21 21:42:56  gorelenk
  211. * Added PCH ncbi_pch.hpp
  212. *
  213. * Revision 1.3  2004/02/17 18:17:19  gorelenk
  214. * #include <unistd> changed to <fstream>.
  215. *
  216. * Revision 1.2  2004/02/09 19:18:56  grichenk
  217. * Renamed CDesc_CI to CSeq_descr_CI. Redesigned CSeq_descr_CI
  218. * and CSeqdesc_CI to avoid using data directly.
  219. *
  220. * Revision 1.1  2003/12/16 17:51:21  kuznets
  221. * Code reorganization
  222. *
  223. * Revision 1.8  2003/10/21 13:48:50  grichenk
  224. * Redesigned type aliases in serialization library.
  225. * Fixed the code (removed CRef-s, added explicit
  226. * initializers etc.)
  227. *
  228. * Revision 1.7  2003/06/02 16:06:39  dicuccio
  229. * Rearranged src/objects/ subtree.  This includes the following shifts:
  230. *     - src/objects/asn2asn --> arc/app/asn2asn
  231. *     - src/objects/testmedline --> src/objects/ncbimime/test
  232. *     - src/objects/objmgr --> src/objmgr
  233. *     - src/objects/util --> src/objmgr/util
  234. *     - src/objects/alnmgr --> src/objtools/alnmgr
  235. *     - src/objects/flat --> src/objtools/flat
  236. *     - src/objects/validator --> src/objtools/validator
  237. *     - src/objects/cddalignview --> src/objtools/cddalignview
  238. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  239. * replaces the three libmmdb? libs.
  240. *
  241. * Revision 1.6  2003/04/24 16:12:39  vasilche
  242. * Object manager internal structures are splitted more straightforward.
  243. * Removed excessive header dependencies.
  244. *
  245. * Revision 1.5  2003/03/28 15:15:45  vasilche
  246. * Added file header comments.
  247. *
  248. * ===========================================================================
  249. */