/* */
This source file includes following definitions.
- createApplication
- main
1 /* -*- coding: utf-8; mode: c++; -*-
2 * Concordance to A. S. Pushkin's Works - Main
3 * $Id: ConcordanceMain.cpp 63 2014-06-21 11:11:33Z isao $
4 * Copyright (C) 2012, isao yasuda
5 */
6
7 #include "Concordance.hpp"
8 #include "ConcordanceConfig.hpp"
9
10 using namespace Wt;
11 using namespace boost::interprocess;
12
13 // 共有メモリオブジェクト
14 managed_shared_memory segment1(open_only, SHMCRPS); // Corpus, TitleDB
15 managed_shared_memory segment2(open_only, SHMTREE); // Word Tree
16 managed_shared_memory segment3(create_only, SHMWORK, SHMWKSZ); // work
17
18 // 共有メモリリソースアドレス
19 shmmap_type* corpus_map; // Corpus map アドレス
20 shmmap_type* tdb_map; // TitleDB アドレス
21 offset_ptr<tree> word_tree_l; // Word Tree Lemmatized form アドレス
22 offset_ptr<tree> word_tree_a; // Word Tree Appearance form アドレス
23
24 // Wt アプリケーションオブジェクト生成
25 WApplication* createApplication(const WEnvironment& env)
26 {
27 std::cerr << "Concordance createApplication called.\n";
28 return new Concordance(env);
29 }
30
31 // コンコーダンスメイン: 全セッションに共通する固定変数を設定する
32 int main(int argc, char** argv)
33 {
34 // 変数マップ
35 std::map<std::string, std::string> mp;
36 // 構成ファイル内容を変数マップにロード
37 config_load(CONFIG, mp);
38 std::cerr << "Concordance config: " << CONFIG << std::endl;
39
40 // map から共有メモリのハンドルを取得
41 std::string hc, hd, hl, ha;
42 hc = mp["CORPUSHDL"];
43 hd = mp["TITLDBHDL"];
44 hl = mp["WORDTLHDL"];
45 ha = mp["WORDTAHDL"];
46 if (hc.empty()) {
47 std::cerr << "Corpus Shared Memory Handle not found." << std::endl;
48 return 1;
49 }
50 if (hd.empty()) {
51 std::cerr << "Title DB Shared Memory Handle not found." << std::endl;
52 return 1;
53 }
54 if (hl.empty()) {
55 std::cerr << "WordTree Lem Shared Memory Handle not found." <<
56 std::endl;
57 return 1;
58 }
59 if (ha.empty()) {
60 std::cerr << "WordTree App Shared Memory Handle not found." <<
61 std::endl;
62 return 1;
63 }
64 // パラメータをエラー(httpd-error.log)出力
65 std::cerr << "Concordance Configuration parameters: " << std::endl;
66 for (std::map<std::string, std::string>::iterator it = mp.begin();
67 it != mp.end(); it++)
68 std::cerr << "- " << it->first << ":" << it->second << std::endl;
69
70 // locale をセット: ru_RU.UTF-8 でラテン文字の大文字化もできる
71 boost::locale::generator gen;
72 std::locale::global(gen("ru_RU.UTF-8"));
73
74 // ハンドルから共有メモリ・リソースのアドレスを取得し,グローバル変数にセット
75 managed_shared_memory::handle_t handle = 0; // 共有メモリアドレスハンドル
76 void* vp; // アドレス変換用ポインタ
77 // Corpus
78 handle = static_cast<managed_shared_memory::handle_t>
79 (std::atoi(hc.c_str()));
80 vp = segment1.get_address_from_handle(handle);
81 corpus_map = reinterpret_cast<shmmap_type*>(vp);
82 // TitleDB
83 handle = static_cast<managed_shared_memory::handle_t>
84 (std::atoi(hd.c_str()));
85 vp = segment1.get_address_from_handle(handle);
86 tdb_map = reinterpret_cast<shmmap_type*>(vp);
87 // Word Tree Lemmatized form
88 handle = static_cast<managed_shared_memory::handle_t>
89 (std::atoi(hl.c_str()));
90 vp = segment2.get_address_from_handle(handle);
91 word_tree_l = reinterpret_cast<tree*>(vp);
92 // Word Tree Appearance form
93 handle = static_cast<managed_shared_memory::handle_t>
94 (std::atoi(ha.c_str()));
95 vp = segment2.get_address_from_handle(handle);
96 word_tree_a = reinterpret_cast<tree*>(vp);
97
98 // 共有メモリを開始前と終了後に削除するリムーバ
99 shm_work_remove remover;
100
101 // ワーク共有メモリを確保し,そのオブジェクトを取得
102 std::cerr << "Concordance Shared Memory Construction." << std::endl;
103
104 // サービス開始
105 try {
106 WServer server(argv[0]);
107 server.setServerConfiguration(argc, argv, "wt_config.xml");
108 server.addEntryPoint(Application,
109 &createApplication,
110 "", "images/favicon.ico");
111 if (server.start()) {
112 WServer::waitForShutdown();
113 server.stop();
114 }
115 } catch (WServer::Exception& e) {
116 std::cerr << "WServer exception: " << e.what() << std::endl;
117 } catch (std::exception &e) {
118 std::cerr << "exception: " << e.what() << std::endl;
119 }
120 }
/* */