libc-eventmachine 0.12.5.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. data/Rakefile +195 -0
  2. data/docs/COPYING +60 -0
  3. data/docs/ChangeLog +211 -0
  4. data/docs/DEFERRABLES +138 -0
  5. data/docs/EPOLL +141 -0
  6. data/docs/GNU +281 -0
  7. data/docs/INSTALL +15 -0
  8. data/docs/KEYBOARD +38 -0
  9. data/docs/LEGAL +25 -0
  10. data/docs/LIGHTWEIGHT_CONCURRENCY +72 -0
  11. data/docs/PURE_RUBY +77 -0
  12. data/docs/README +74 -0
  13. data/docs/RELEASE_NOTES +96 -0
  14. data/docs/SMTP +9 -0
  15. data/docs/SPAWNED_PROCESSES +93 -0
  16. data/docs/TODO +10 -0
  17. data/ext/binder.cpp +126 -0
  18. data/ext/binder.h +48 -0
  19. data/ext/cmain.cpp +582 -0
  20. data/ext/cplusplus.cpp +177 -0
  21. data/ext/ed.cpp +1522 -0
  22. data/ext/ed.h +380 -0
  23. data/ext/em.cpp +1947 -0
  24. data/ext/em.h +186 -0
  25. data/ext/emwin.cpp +300 -0
  26. data/ext/emwin.h +94 -0
  27. data/ext/epoll.cpp +26 -0
  28. data/ext/epoll.h +25 -0
  29. data/ext/eventmachine.h +98 -0
  30. data/ext/eventmachine_cpp.h +96 -0
  31. data/ext/extconf.rb +129 -0
  32. data/ext/fastfilereader/extconf.rb +77 -0
  33. data/ext/fastfilereader/mapper.cpp +214 -0
  34. data/ext/fastfilereader/mapper.h +59 -0
  35. data/ext/fastfilereader/rubymain.cpp +127 -0
  36. data/ext/files.cpp +94 -0
  37. data/ext/files.h +65 -0
  38. data/ext/kb.cpp +82 -0
  39. data/ext/page.cpp +107 -0
  40. data/ext/page.h +51 -0
  41. data/ext/pipe.cpp +351 -0
  42. data/ext/project.h +119 -0
  43. data/ext/rubymain.cpp +858 -0
  44. data/ext/sigs.cpp +89 -0
  45. data/ext/sigs.h +32 -0
  46. data/ext/ssl.cpp +423 -0
  47. data/ext/ssl.h +90 -0
  48. data/java/src/com/rubyeventmachine/Application.java +196 -0
  49. data/java/src/com/rubyeventmachine/Connection.java +74 -0
  50. data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
  51. data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
  52. data/java/src/com/rubyeventmachine/EmReactor.java +408 -0
  53. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  54. data/java/src/com/rubyeventmachine/EventableChannel.java +57 -0
  55. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +171 -0
  56. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +244 -0
  57. data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
  58. data/java/src/com/rubyeventmachine/Timer.java +54 -0
  59. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
  60. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +124 -0
  61. data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
  62. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
  63. data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
  64. data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
  65. data/lib/em/deferrable.rb +208 -0
  66. data/lib/em/eventable.rb +39 -0
  67. data/lib/em/future.rb +62 -0
  68. data/lib/em/messages.rb +66 -0
  69. data/lib/em/processes.rb +68 -0
  70. data/lib/em/spawnable.rb +88 -0
  71. data/lib/em/streamer.rb +112 -0
  72. data/lib/eventmachine.rb +1920 -0
  73. data/lib/eventmachine_version.rb +31 -0
  74. data/lib/evma/callback.rb +32 -0
  75. data/lib/evma/container.rb +75 -0
  76. data/lib/evma/factory.rb +77 -0
  77. data/lib/evma/protocol.rb +87 -0
  78. data/lib/evma/reactor.rb +48 -0
  79. data/lib/evma.rb +32 -0
  80. data/lib/jeventmachine.rb +140 -0
  81. data/lib/pr_eventmachine.rb +1017 -0
  82. data/lib/protocols/buftok.rb +127 -0
  83. data/lib/protocols/header_and_content.rb +129 -0
  84. data/lib/protocols/httpcli2.rb +803 -0
  85. data/lib/protocols/httpclient.rb +270 -0
  86. data/lib/protocols/line_and_text.rb +126 -0
  87. data/lib/protocols/linetext2.rb +161 -0
  88. data/lib/protocols/memcache.rb +293 -0
  89. data/lib/protocols/postgres.rb +261 -0
  90. data/lib/protocols/saslauth.rb +179 -0
  91. data/lib/protocols/smtpclient.rb +308 -0
  92. data/lib/protocols/smtpserver.rb +556 -0
  93. data/lib/protocols/stomp.rb +153 -0
  94. data/lib/protocols/tcptest.rb +57 -0
  95. data/tasks/cpp.rake +77 -0
  96. data/tasks/project.rake +78 -0
  97. data/tasks/tests.rake +193 -0
  98. data/tests/test_attach.rb +83 -0
  99. data/tests/test_basic.rb +231 -0
  100. data/tests/test_bind.rb +73 -0
  101. data/tests/test_connection_count.rb +35 -0
  102. data/tests/test_defer.rb +47 -0
  103. data/tests/test_epoll.rb +163 -0
  104. data/tests/test_error_handler.rb +32 -0
  105. data/tests/test_errors.rb +82 -0
  106. data/tests/test_eventables.rb +77 -0
  107. data/tests/test_exc.rb +58 -0
  108. data/tests/test_futures.rb +214 -0
  109. data/tests/test_handler_check.rb +37 -0
  110. data/tests/test_hc.rb +218 -0
  111. data/tests/test_httpclient.rb +215 -0
  112. data/tests/test_httpclient2.rb +155 -0
  113. data/tests/test_kb.rb +61 -0
  114. data/tests/test_ltp.rb +188 -0
  115. data/tests/test_ltp2.rb +320 -0
  116. data/tests/test_next_tick.rb +109 -0
  117. data/tests/test_processes.rb +56 -0
  118. data/tests/test_pure.rb +129 -0
  119. data/tests/test_running.rb +47 -0
  120. data/tests/test_sasl.rb +74 -0
  121. data/tests/test_send_file.rb +243 -0
  122. data/tests/test_servers.rb +80 -0
  123. data/tests/test_smtpclient.rb +83 -0
  124. data/tests/test_smtpserver.rb +93 -0
  125. data/tests/test_spawn.rb +329 -0
  126. data/tests/test_ssl_args.rb +68 -0
  127. data/tests/test_ssl_methods.rb +50 -0
  128. data/tests/test_timers.rb +148 -0
  129. data/tests/test_ud.rb +43 -0
  130. data/tests/testem.rb +31 -0
  131. metadata +230 -0
@@ -0,0 +1,98 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: eventmachine.h
6
+ Date: 15Apr06
7
+
8
+ Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
9
+ Gmail: blackhedd
10
+
11
+ This program is free software; you can redistribute it and/or modify
12
+ it under the terms of either: 1) the GNU General Public License
13
+ as published by the Free Software Foundation; either version 2 of the
14
+ License, or (at your option) any later version; or 2) Ruby's License.
15
+
16
+ See the file COPYING for complete licensing information.
17
+
18
+ *****************************************************************************/
19
+
20
+ #ifndef __EVMA_EventMachine__H_
21
+ #define __EVMA_EventMachine__H_
22
+
23
+ #if __cplusplus
24
+ extern "C" {
25
+ #endif
26
+
27
+ enum { // Event names
28
+ EM_TIMER_FIRED = 100,
29
+ EM_CONNECTION_READ = 101,
30
+ EM_CONNECTION_UNBOUND = 102,
31
+ EM_CONNECTION_ACCEPTED = 103,
32
+ EM_CONNECTION_COMPLETED = 104,
33
+ EM_LOOPBREAK_SIGNAL = 105,
34
+ EM_CONNECTION_NOTIFY_READABLE = 106,
35
+ EM_CONNECTION_NOTIFY_WRITABLE = 107,
36
+ EM_SSL_HANDSHAKE_COMPLETED = 108
37
+
38
+ };
39
+
40
+ void evma_initialize_library (void(*)(const char*, int, const char*, int));
41
+ void evma_run_machine();
42
+ void evma_release_library();
43
+ const char *evma_install_oneshot_timer (int seconds);
44
+ const char *evma_connect_to_server (const char *server, int port, const char * bind_host);
45
+ const char *evma_connect_to_unix_server (const char *server);
46
+
47
+ const char *evma_attach_fd (int file_descriptor, int read_mode, int write_mode);
48
+ int evma_detach_fd (const char *binding);
49
+
50
+ void evma_stop_tcp_server (const char *signature);
51
+ const char *evma_create_tcp_server (const char *address, int port);
52
+ const char *evma_create_unix_domain_server (const char *filename);
53
+ const char *evma_open_datagram_socket (const char *server, int port);
54
+ const char *evma_open_keyboard();
55
+ void evma_set_tls_parms (const char *binding, const char *privatekey_filename, const char *certchain_filenane);
56
+ void evma_start_tls (const char *binding);
57
+
58
+ #ifdef WITH_SSL
59
+ X509 *evma_get_peer_cert (const char *binding);
60
+ #endif
61
+
62
+ int evma_get_peername (const char *binding, struct sockaddr*);
63
+ int evma_get_sockname (const char *binding, struct sockaddr*);
64
+ int evma_get_subprocess_pid (const char *binding, pid_t*);
65
+ int evma_get_subprocess_status (const char *binding, int*);
66
+ int evma_get_connection_count();
67
+ int evma_send_data_to_connection (const char *binding, const char *data, int data_length);
68
+ int evma_send_datagram (const char *binding, const char *data, int data_length, const char *address, int port);
69
+ int evma_get_comm_inactivity_timeout (const char *binding, /*out*/int *value);
70
+ int evma_set_comm_inactivity_timeout (const char *binding, /*in,out*/int *value);
71
+ int evma_get_outbound_data_size (const char *binding);
72
+ int evma_send_file_data_to_connection (const char *binding, const char *filename);
73
+
74
+ void evma_close_connection (const char *binding, int after_writing);
75
+ int evma_report_connection_error_status (const char *binding);
76
+ void evma_signal_loopbreak();
77
+ void evma_set_timer_quantum (int);
78
+ int evma_get_max_timer_count();
79
+ void evma_set_max_timer_count (int);
80
+ void evma_setuid_string (const char *username);
81
+ void evma_stop_machine();
82
+
83
+ const char *evma__write_file (const char *filename);
84
+ const char *evma_popen (char * const*cmd_strings);
85
+
86
+ int evma_set_rlimit_nofile (int n_files);
87
+
88
+ // Temporary:
89
+ void evma__epoll();
90
+ void evma__kqueue();
91
+
92
+ #if __cplusplus
93
+ }
94
+ #endif
95
+
96
+
97
+ #endif // __EventMachine__H_
98
+
@@ -0,0 +1,96 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: eventmachine_cpp.h
6
+ Date: 27Jul07
7
+
8
+ Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
9
+ Gmail: blackhedd
10
+
11
+ This program is free software; you can redistribute it and/or modify
12
+ it under the terms of either: 1) the GNU General Public License
13
+ as published by the Free Software Foundation; either version 2 of the
14
+ License, or (at your option) any later version; or 2) Ruby's License.
15
+
16
+ See the file COPYING for complete licensing information.
17
+
18
+ *****************************************************************************/
19
+
20
+
21
+ #ifndef __EVMA_EventmachineCpp__H_
22
+ #define __EVMA_EventmachineCpp__H_
23
+
24
+
25
+ // This material is only for directly integrating EM into C++ programs.
26
+
27
+ namespace EM {
28
+
29
+ void Callback (const char *sig, int event, const char *data, int length);
30
+ void Run (void(*)(void));
31
+ void AddTimer (int, void(*)());
32
+ void StopReactor();
33
+
34
+ /***************
35
+ class Eventable
36
+ ***************/
37
+
38
+ class Eventable {
39
+ public:
40
+ Eventable() {}
41
+ virtual ~Eventable() {}
42
+
43
+ std::string Signature;
44
+
45
+ // Called by the framework
46
+ virtual void ReceiveData (const char *data, int length) {}
47
+ virtual void ConnectionCompleted() {}
48
+ virtual void Accept (const char*) {}
49
+ virtual void Unbind() {}
50
+ virtual void PostInit() {}
51
+ virtual void SslHandshakeCompleted() {}
52
+
53
+ void StopReactor() {EM::StopReactor();}
54
+ };
55
+
56
+ /****************
57
+ class Connection
58
+ ****************/
59
+
60
+ class Connection: public Eventable {
61
+ public:
62
+ Connection() {}
63
+ virtual ~Connection() {}
64
+
65
+ virtual void Connect (const char* host, int port) { Connect(host, port, 0); }
66
+ virtual void Connect (const char*, int, const char * bind_host);
67
+
68
+ void SendData (const char *data);
69
+ void SendData (const char *data, int length);
70
+ void Close (bool afterWriting);
71
+ };
72
+
73
+
74
+ /**************
75
+ class Acceptor
76
+ **************/
77
+
78
+ class Acceptor: public Eventable {
79
+ public:
80
+ Acceptor() {PostInit();}
81
+ virtual ~Acceptor() {}
82
+
83
+ void Start (const char*, int);
84
+ void Accept (const char*);
85
+
86
+ virtual Connection *MakeConnection() {return new Connection();}
87
+ };
88
+
89
+
90
+ };
91
+
92
+
93
+
94
+
95
+
96
+ #endif // __EVMA_EventmachineCpp__H_
data/ext/extconf.rb ADDED
@@ -0,0 +1,129 @@
1
+ require 'mkmf'
2
+
3
+ def check_libs libs = [], fatal = false
4
+ libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) }
5
+ end
6
+
7
+ def check_heads heads = [], fatal = false
8
+ heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)}
9
+ end
10
+
11
+ def add_define(name)
12
+ $defs.push("-D#{name}")
13
+ end
14
+
15
+ add_define 'BUILD_FOR_RUBY'
16
+ add_define 'HAVE_RBTRAP' if have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h'])
17
+ add_define "HAVE_TBR" if have_func('rb_thread_blocking_region')# and have_macro('RUBY_UBF_IO', 'ruby.h')
18
+
19
+ # Minor platform details between *nix and Windows:
20
+
21
+ if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/
22
+ GNU_CHAIN = $1 == 'mingw'
23
+ OS_WIN32 = true
24
+ add_define "OS_WIN32"
25
+ else
26
+ GNU_CHAIN = true
27
+ OS_UNIX = true
28
+ add_define 'OS_UNIX'
29
+
30
+ add_define "HAVE_KQUEUE" if have_header("sys/event.h") and have_header("sys/queue.h")
31
+ end
32
+
33
+ # Main platform invariances:
34
+
35
+ case RUBY_PLATFORM
36
+ when /mswin32/, /mingw32/, /bccwin32/
37
+ check_heads(%w[windows.h winsock.h], true)
38
+ check_libs(%w[kernel32 rpcrt4 gdi32], true)
39
+
40
+ if GNU_CHAIN
41
+ CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
42
+ else
43
+ $defs.push "-EHs"
44
+ $defs.push "-GR"
45
+ end
46
+
47
+ when /solaris/
48
+ check_libs(%w[nsl socket], true)
49
+
50
+ add_define 'OS_SOLARIS8'
51
+
52
+ # Patch by Tim Pease, fixes SUNWspro compile problems.
53
+ if CONFIG['CC'] == 'cc'
54
+ # SUN CHAIN
55
+ $CFLAGS = CONFIG['CFLAGS'] = "-KPIC -G"
56
+ CONFIG['CCDLFLAGS'] = "-KPIC"
57
+ else
58
+ # GNU CHAIN
59
+ # on Unix we need a g++ link, not gcc.
60
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
61
+ end
62
+ when /openbsd/
63
+ # OpenBSD branch contributed by Guillaume Sellier.
64
+
65
+ # on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
66
+ CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
67
+
68
+ when /darwin/
69
+
70
+ # on Unix we need a g++ link, not gcc.
71
+ # Ff line contributed by Daniel Harple.
72
+ CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ')
73
+
74
+ when /linux/
75
+
76
+ # Original epoll test is inadequate because 2.4 kernels have the header
77
+ # but not the code.
78
+ # add_define 'HAVE_EPOLL' if have_header('sys/epoll.h')
79
+ if have_header('sys/epoll.h')
80
+ File.open("hasEpollTest.c", "w") {|f|
81
+ f.puts "#include <sys/epoll.h>"
82
+ f.puts "int main() { epoll_create(1024); return 0;}"
83
+ }
84
+ (e = system( "gcc hasEpollTest.c -o hasEpollTest " )) and (e = $?.to_i)
85
+ `rm -f hasEpollTest.c hasEpollTest`
86
+ add_define 'HAVE_EPOLL' if e == 0
87
+ end
88
+
89
+ # on Unix we need a g++ link, not gcc.
90
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
91
+ else
92
+ # on Unix we need a g++ link, not gcc.
93
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
94
+ end
95
+
96
+ # OpenSSL:
97
+
98
+ def manual_ssl_config
99
+ ssl_libs_heads_args = {
100
+ :unix => [%w[ssl crypto], %w[openssl/ssl.h openssl/err.h]],
101
+ :darwin => [%w[ssl crypto C], %w[openssl/ssl.h openssl/err.h]],
102
+ # openbsd and linux:
103
+ :crypto_hack => [%w[crypto ssl crypto], %w[openssl/ssl.h openssl/err.h]],
104
+ :mswin => [%w[ssleay32 libeay32], %w[openssl/ssl.h openssl/err.h]],
105
+ }
106
+
107
+ dc_flags = ['ssl']
108
+ dc_flags += ["#{ENV['OPENSSL']}/include", ENV['OPENSSL']] if /linux/ =~ RUBY_PLATFORM
109
+
110
+ libs, heads = case RUBY_PLATFORM
111
+ when /mswin/ ; ssl_libs_heads_args[:mswin]
112
+ when /mingw/ ; ssl_libs_heads_args[:unix]
113
+ when /darwin/ ; ssl_libs_heads_args[:darwin]
114
+ when /openbsd/ ; ssl_libs_heads_args[:crypto_hack]
115
+ when /linux/ ; ssl_libs_heads_args[:crypto_hack]
116
+ else ssl_libs_heads_args[:unix]
117
+ end
118
+ dir_config(*dc_flags)
119
+ check_libs(libs) and check_heads(heads)
120
+ end
121
+
122
+ # Try to use pkg_config first, fixes #73
123
+ if pkg_config('openssl') || manual_ssl_config
124
+ add_define "WITH_SSL"
125
+ else
126
+ add_define "WITHOUT_SSL"
127
+ end
128
+
129
+ create_makefile "rubyeventmachine"
@@ -0,0 +1,77 @@
1
+ require 'mkmf'
2
+
3
+ def check_libs libs = [], fatal = false
4
+ libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) }
5
+ end
6
+
7
+ def check_heads heads = [], fatal = false
8
+ heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)}
9
+ end
10
+
11
+ def add_define(name)
12
+ $defs.push("-D#{name}")
13
+ end
14
+
15
+ add_define 'BUILD_FOR_RUBY'
16
+
17
+ # Minor platform details between *nix and Windows:
18
+
19
+ if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/
20
+ GNU_CHAIN = $1 == 'mingw'
21
+ OS_WIN32 = true
22
+ add_define "OS_WIN32"
23
+ else
24
+ GNU_CHAIN = true
25
+ OS_UNIX = true
26
+ add_define 'OS_UNIX'
27
+ end
28
+
29
+
30
+
31
+ case RUBY_PLATFORM
32
+ when /mswin32/, /mingw32/, /bccwin32/
33
+ check_heads(%w[windows.h winsock.h], true)
34
+ check_libs(%w[kernel32 rpcrt4 gdi32], true)
35
+
36
+ if GNU_CHAIN
37
+ CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
38
+ else
39
+ $defs.push "-EHs"
40
+ $defs.push "-GR"
41
+ end
42
+
43
+ when /solaris/
44
+ check_libs(%w[nsl socket], true)
45
+
46
+ add_define 'OS_SOLARIS8'
47
+
48
+ # Patch by Tim Pease, fixes SUNWspro compile problems.
49
+ if CONFIG['CC'] == 'cc'
50
+ # SUN CHAIN
51
+ $CFLAGS = CONFIG['CFLAGS'] = "-KPIC -G"
52
+ CONFIG['CCDLFLAGS'] = "-KPIC"
53
+ else
54
+ # GNU CHAIN
55
+ # on Unix we need a g++ link, not gcc.
56
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
57
+ end
58
+ when /openbsd/
59
+ # OpenBSD branch contributed by Guillaume Sellier.
60
+
61
+ # on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
62
+ CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
63
+ when /darwin/
64
+ # on Unix we need a g++ link, not gcc.
65
+ # Ff line contributed by Daniel Harple.
66
+ CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ')
67
+
68
+ when /linux/
69
+
70
+ # on Unix we need a g++ link, not gcc.
71
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
72
+ else
73
+ # on Unix we need a g++ link, not gcc.
74
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
75
+ end
76
+
77
+ create_makefile "fastfilereaderext"
@@ -0,0 +1,214 @@
1
+ /*****************************************************************************
2
+
3
+ $Id: mapper.cpp 4527 2007-07-04 10:21:34Z francis $
4
+
5
+ File: mapper.cpp
6
+ Date: 02Jul07
7
+
8
+ Copyright (C) 2007 by Francis Cianfrocca. All Rights Reserved.
9
+ Gmail: garbagecat10
10
+
11
+ This program is free software; you can redistribute it and/or modify
12
+ it under the terms of either: 1) the GNU General Public License
13
+ as published by the Free Software Foundation; either version 2 of the
14
+ License, or (at your option) any later version; or 2) Ruby's License.
15
+
16
+ See the file COPYING for complete licensing information.
17
+
18
+ *****************************************************************************/
19
+
20
+
21
+ //////////////////////////////////////////////////////////////////////
22
+ // UNIX implementation
23
+ //////////////////////////////////////////////////////////////////////
24
+
25
+
26
+ #ifdef OS_UNIX
27
+
28
+ #include <sys/types.h>
29
+ #include <sys/stat.h>
30
+ #include <sys/mman.h>
31
+ #include <fcntl.h>
32
+ #include <errno.h>
33
+
34
+ #include <iostream>
35
+ #include "unistd.h"
36
+ #include <string>
37
+ #include <cstring>
38
+ #include <stdexcept>
39
+ using namespace std;
40
+
41
+ #include "mapper.h"
42
+
43
+ /******************
44
+ Mapper_t::Mapper_t
45
+ ******************/
46
+
47
+ Mapper_t::Mapper_t (const string &filename)
48
+ {
49
+ /* We ASSUME we can open the file.
50
+ * (More precisely, we assume someone else checked before we got here.)
51
+ */
52
+
53
+ Fd = open (filename.c_str(), O_RDONLY);
54
+ if (Fd < 0)
55
+ throw runtime_error (strerror (errno));
56
+
57
+ struct stat st;
58
+ if (fstat (Fd, &st))
59
+ throw runtime_error (strerror (errno));
60
+ FileSize = st.st_size;
61
+
62
+ #ifdef OS_WIN32
63
+ MapPoint = (char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0);
64
+ #else
65
+ MapPoint = (const char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0);
66
+ #endif
67
+ if (MapPoint == MAP_FAILED)
68
+ throw runtime_error (strerror (errno));
69
+ }
70
+
71
+
72
+ /*******************
73
+ Mapper_t::~Mapper_t
74
+ *******************/
75
+
76
+ Mapper_t::~Mapper_t()
77
+ {
78
+ Close();
79
+ }
80
+
81
+
82
+ /***************
83
+ Mapper_t::Close
84
+ ***************/
85
+
86
+ void Mapper_t::Close()
87
+ {
88
+ // Can be called multiple times.
89
+ // Calls to GetChunk are invalid after a call to Close.
90
+ if (MapPoint) {
91
+ #ifdef OS_SOLARIS8
92
+ munmap ((char*)MapPoint, FileSize);
93
+ #else
94
+ munmap ((void*)MapPoint, FileSize);
95
+ #endif
96
+ MapPoint = NULL;
97
+ }
98
+ if (Fd >= 0) {
99
+ close (Fd);
100
+ Fd = -1;
101
+ }
102
+ }
103
+
104
+ /******************
105
+ Mapper_t::GetChunk
106
+ ******************/
107
+
108
+ const char *Mapper_t::GetChunk (unsigned start)
109
+ {
110
+ return MapPoint + start;
111
+ }
112
+
113
+
114
+
115
+ #endif // OS_UNIX
116
+
117
+
118
+ //////////////////////////////////////////////////////////////////////
119
+ // WINDOWS implementation
120
+ //////////////////////////////////////////////////////////////////////
121
+
122
+ #ifdef OS_WIN32
123
+
124
+ #include <windows.h>
125
+
126
+ #include <iostream>
127
+ #include <string>
128
+ #include <stdexcept>
129
+ using namespace std;
130
+
131
+ #include "mapper.h"
132
+
133
+ /******************
134
+ Mapper_t::Mapper_t
135
+ ******************/
136
+
137
+ Mapper_t::Mapper_t (const string &filename)
138
+ {
139
+ /* We ASSUME we can open the file.
140
+ * (More precisely, we assume someone else checked before we got here.)
141
+ */
142
+
143
+ hFile = INVALID_HANDLE_VALUE;
144
+ hMapping = NULL;
145
+ MapPoint = NULL;
146
+ FileSize = 0;
147
+
148
+ hFile = CreateFile (filename.c_str(), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
149
+
150
+ if (hFile == INVALID_HANDLE_VALUE)
151
+ throw runtime_error ("File not found");
152
+
153
+ BY_HANDLE_FILE_INFORMATION i;
154
+ if (GetFileInformationByHandle (hFile, &i))
155
+ FileSize = i.nFileSizeLow;
156
+
157
+ hMapping = CreateFileMapping (hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
158
+ if (!hMapping)
159
+ throw runtime_error ("File not mapped");
160
+
161
+ #ifdef OS_WIN32
162
+ MapPoint = (char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0);
163
+ #else
164
+ MapPoint = (const char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0);
165
+ #endif
166
+ if (!MapPoint)
167
+ throw runtime_error ("Mappoint not read");
168
+ }
169
+
170
+
171
+ /*******************
172
+ Mapper_t::~Mapper_t
173
+ *******************/
174
+
175
+ Mapper_t::~Mapper_t()
176
+ {
177
+ Close();
178
+ }
179
+
180
+ /***************
181
+ Mapper_t::Close
182
+ ***************/
183
+
184
+ void Mapper_t::Close()
185
+ {
186
+ // Can be called multiple times.
187
+ // Calls to GetChunk are invalid after a call to Close.
188
+ if (MapPoint) {
189
+ UnmapViewOfFile (MapPoint);
190
+ MapPoint = NULL;
191
+ }
192
+ if (hMapping != NULL) {
193
+ CloseHandle (hMapping);
194
+ hMapping = NULL;
195
+ }
196
+ if (hFile != INVALID_HANDLE_VALUE) {
197
+ CloseHandle (hFile);
198
+ hMapping = INVALID_HANDLE_VALUE;
199
+ }
200
+ }
201
+
202
+
203
+ /******************
204
+ Mapper_t::GetChunk
205
+ ******************/
206
+
207
+ const char *Mapper_t::GetChunk (unsigned start)
208
+ {
209
+ return MapPoint + start;
210
+ }
211
+
212
+
213
+
214
+ #endif // OS_WINDOWS
@@ -0,0 +1,59 @@
1
+ /*****************************************************************************
2
+
3
+ $Id: mapper.h 4529 2007-07-04 11:32:22Z francis $
4
+
5
+ File: mapper.h
6
+ Date: 02Jul07
7
+
8
+ Copyright (C) 2007 by Francis Cianfrocca. All Rights Reserved.
9
+ Gmail: garbagecat10
10
+
11
+ This program is free software; you can redistribute it and/or modify
12
+ it under the terms of either: 1) the GNU General Public License
13
+ as published by the Free Software Foundation; either version 2 of the
14
+ License, or (at your option) any later version; or 2) Ruby's License.
15
+
16
+ See the file COPYING for complete licensing information.
17
+
18
+ *****************************************************************************/
19
+
20
+
21
+ #ifndef __Mapper__H_
22
+ #define __Mapper__H_
23
+
24
+
25
+ /**************
26
+ class Mapper_t
27
+ **************/
28
+
29
+ class Mapper_t
30
+ {
31
+ public:
32
+ Mapper_t (const string&);
33
+ virtual ~Mapper_t();
34
+
35
+ const char *GetChunk (unsigned);
36
+ void Close();
37
+ size_t GetFileSize() {return FileSize;}
38
+
39
+ private:
40
+ size_t FileSize;
41
+
42
+ #ifdef OS_UNIX
43
+ private:
44
+ int Fd;
45
+ const char *MapPoint;
46
+ #endif // OS_UNIX
47
+
48
+ #ifdef OS_WIN32
49
+ private:
50
+ HANDLE hFile;
51
+ HANDLE hMapping;
52
+ char *MapPoint;
53
+ #endif // OS_WIN32
54
+
55
+ };
56
+
57
+
58
+ #endif // __Mapper__H_
59
+