journald-native 1.0.6 → 1.0.7
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.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/ext/journald_native/extconf.rb +1 -1
- data/ext/journald_native/journald_native.c +117 -0
- data/ext/journald_native/sd_journal.h +36 -26
- data/lib/journald/native/version.rb +1 -1
- metadata +4 -10
- data/ext/journald_native/CMakeLists.txt +0 -9
- data/ext/journald_native/cpp14shiv.h +0 -78
- data/ext/journald_native/extinit.cpp +0 -7
- data/ext/journald_native/journald_native.cpp +0 -100
- data/ext/journald_native/journald_native.h +0 -12
- data/ext/journald_native/ruby_exception_wrapper.cpp +0 -16
- data/ext/journald_native/ruby_exception_wrapper.h +0 -105
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4020a007bf01dcb53dde8935a7772ab71e28c882
|
4
|
+
data.tar.gz: b95b33ae4d6014cf76c0b1b6e138829274f3d433
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ab72f2d53e00b60be3489609ee7065e293bef46c13145c14cfae7eae4adddbb465e1a4a785ba05930a50f1b97fa5de809a20f0b2d628a9073d7655c82dd3f74
|
7
|
+
data.tar.gz: 3983b62b9f1dc7367013048cab266f2adc71b5c0ed14ae9ad77bafe214866d6310c5d7b70f672d10636319815d7d815b4cab5a1078cbf672909d69c8659ebbef
|
data/README.md
CHANGED
@@ -30,13 +30,13 @@ Journald::LOG_DEBUG # debug-level messages
|
|
30
30
|
```
|
31
31
|
|
32
32
|
systemd-journal uses syslog constants to denote level therefore they are equal to those of the Syslog module,
|
33
|
-
e.g. ```Journald::LOG_WARNING == Syslog::LOG_WARNING```.
|
33
|
+
e.g. ```Journald::LOG_WARNING == Syslog::LOG_WARNING```.
|
34
34
|
[See syslog man page for more info](http://man7.org/linux/man-pages/man3/syslog.3.html)
|
35
35
|
|
36
36
|
### Methods
|
37
37
|
|
38
|
-
Methods of Journald::Native class wrap systemd-journal calls.
|
39
|
-
[See sd-journal help for more info](http://www.freedesktop.org/software/systemd/man/sd_journal_print.html)
|
38
|
+
Methods of Journald::Native class wrap systemd-journal calls.
|
39
|
+
[See sd-journal help for more info](http://www.freedesktop.org/software/systemd/man/sd_journal_print.html)
|
40
40
|
|
41
41
|
```ruby
|
42
42
|
Journald::Native.send "MESSAGE=message", "PRIORITY=#{Journald::LOG_WARNING}"
|
@@ -0,0 +1,117 @@
|
|
1
|
+
/* Do not add C line and file to the log messages */
|
2
|
+
#define SD_JOURNAL_SUPPRESS_LOCATION
|
3
|
+
|
4
|
+
#include <ruby.h>
|
5
|
+
#include "sd_journal.h"
|
6
|
+
|
7
|
+
void Init_journald_native();
|
8
|
+
|
9
|
+
/* initializers */
|
10
|
+
static void jdl_init_modules();
|
11
|
+
static void jdl_init_constants();
|
12
|
+
static void jdl_init_methods();
|
13
|
+
|
14
|
+
/* methods */
|
15
|
+
static VALUE jdl_native_print(VALUE self, VALUE priority, VALUE message);
|
16
|
+
static VALUE jdl_native_send(int argc, VALUE* argv, VALUE self);
|
17
|
+
static VALUE jdl_native_perror(VALUE self, VALUE message);
|
18
|
+
static VALUE jdl_native_is_dummy();
|
19
|
+
|
20
|
+
/* globals */
|
21
|
+
static VALUE mJournald;
|
22
|
+
static VALUE mNative;
|
23
|
+
|
24
|
+
void Init_journald_native()
|
25
|
+
{
|
26
|
+
jdl_init_modules();
|
27
|
+
jdl_init_constants();
|
28
|
+
jdl_init_methods();
|
29
|
+
}
|
30
|
+
|
31
|
+
static void jdl_init_modules()
|
32
|
+
{
|
33
|
+
mJournald = rb_define_module("Journald");
|
34
|
+
mNative = rb_define_module_under(mJournald, "Native");
|
35
|
+
}
|
36
|
+
|
37
|
+
static void jdl_init_constants()
|
38
|
+
{
|
39
|
+
rb_define_const(mJournald, "LOG_EMERG", INT2NUM(LOG_EMERG)); /* system is unusable */
|
40
|
+
rb_define_const(mJournald, "LOG_ALERT", INT2NUM(LOG_ALERT)); /* action must be taken immediately */
|
41
|
+
rb_define_const(mJournald, "LOG_CRIT", INT2NUM(LOG_CRIT)); /* critical conditions */
|
42
|
+
rb_define_const(mJournald, "LOG_ERR", INT2NUM(LOG_ERR)); /* error conditions */
|
43
|
+
rb_define_const(mJournald, "LOG_WARNING", INT2NUM(LOG_WARNING)); /* warning conditions */
|
44
|
+
rb_define_const(mJournald, "LOG_NOTICE", INT2NUM(LOG_NOTICE)); /* normal but significant condition */
|
45
|
+
rb_define_const(mJournald, "LOG_INFO", INT2NUM(LOG_INFO)); /* informational */
|
46
|
+
rb_define_const(mJournald, "LOG_DEBUG", INT2NUM(LOG_DEBUG)); /* debug-level messages */
|
47
|
+
|
48
|
+
// dummy detection const
|
49
|
+
rb_define_const(mNative, "IS_DUMMY", jdl_native_is_dummy());
|
50
|
+
}
|
51
|
+
|
52
|
+
static void jdl_init_methods()
|
53
|
+
{
|
54
|
+
rb_define_singleton_method(mNative, "print", jdl_native_print, 2);
|
55
|
+
rb_define_singleton_method(mNative, "send", jdl_native_send, -1); /* -1 to pass as C array */
|
56
|
+
rb_define_singleton_method(mNative, "perror", jdl_native_perror, 1);
|
57
|
+
|
58
|
+
// dummy detection method
|
59
|
+
rb_define_singleton_method(mNative, "dummy?", jdl_native_is_dummy, 0);
|
60
|
+
}
|
61
|
+
|
62
|
+
static VALUE jdl_native_print(VALUE v_self, VALUE v_priority, VALUE v_message)
|
63
|
+
{
|
64
|
+
int priority, result;
|
65
|
+
char *message;
|
66
|
+
|
67
|
+
priority = NUM2INT(v_priority);
|
68
|
+
message = StringValueCStr(v_message);
|
69
|
+
|
70
|
+
result = sd_journal_print(priority, "%s", message);
|
71
|
+
|
72
|
+
return INT2NUM(result);
|
73
|
+
}
|
74
|
+
|
75
|
+
static VALUE jdl_native_send(int argc, VALUE* argv, VALUE self)
|
76
|
+
{
|
77
|
+
struct iovec *msgs;
|
78
|
+
int i;
|
79
|
+
int result;
|
80
|
+
|
81
|
+
/* first check everything is a string / convertable to string */
|
82
|
+
for (i = 0; i < argc; i++) {
|
83
|
+
StringValue(argv[i]); /* you may get a ruby exception here */
|
84
|
+
}
|
85
|
+
|
86
|
+
/* allocate memory after all checks to avoid possible memory leak */
|
87
|
+
msgs = calloc(argc, sizeof(struct iovec));
|
88
|
+
|
89
|
+
for (i = 0; i < argc; i++) {
|
90
|
+
VALUE v = argv[i];
|
91
|
+
msgs[i].iov_base = RSTRING_PTR(v);
|
92
|
+
msgs[i].iov_len = RSTRING_LEN(v);
|
93
|
+
}
|
94
|
+
|
95
|
+
result = sd_journal_sendv(msgs, argc);
|
96
|
+
|
97
|
+
free(msgs);
|
98
|
+
|
99
|
+
return INT2NUM(result);
|
100
|
+
}
|
101
|
+
|
102
|
+
static VALUE jdl_native_perror(VALUE v_self, VALUE v_message)
|
103
|
+
{
|
104
|
+
int result;
|
105
|
+
char *message;
|
106
|
+
|
107
|
+
message = StringValueCStr(v_message);
|
108
|
+
|
109
|
+
result = sd_journal_perror(message);
|
110
|
+
|
111
|
+
return INT2NUM(result);
|
112
|
+
}
|
113
|
+
|
114
|
+
static VALUE jdl_native_is_dummy()
|
115
|
+
{
|
116
|
+
return JOURNALD_NATIVE_SD_JOURNAL_DUMMY ? Qtrue : Qfalse;
|
117
|
+
}
|
@@ -1,45 +1,55 @@
|
|
1
|
+
#include <stdbool.h>
|
2
|
+
|
3
|
+
#ifdef __cplusplus
|
4
|
+
extern "C" {
|
5
|
+
#endif
|
6
|
+
|
1
7
|
#ifndef JOURNALD_NATIVE_SD_JOURNAL_H
|
2
|
-
#define JOURNALD_NATIVE_SD_JOURNAL_H
|
8
|
+
#define JOURNALD_NATIVE_SD_JOURNAL_H
|
3
9
|
|
4
|
-
#ifdef __linux__
|
10
|
+
#ifdef __linux__
|
5
11
|
|
6
|
-
|
12
|
+
#define JOURNALD_NATIVE_SD_JOURNAL_DUMMY false
|
7
13
|
|
8
|
-
|
14
|
+
/* do the real stuff */
|
9
15
|
|
10
|
-
|
16
|
+
#include "extconf.h"
|
11
17
|
|
12
|
-
|
18
|
+
/* check for extconf results */
|
13
19
|
|
14
|
-
|
15
|
-
|
16
|
-
|
20
|
+
#ifndef HAVE_SYSTEMD_SD_JOURNAL_H
|
21
|
+
#error Cannot include <systemd/sd-journal.h>. Please use linux version with systemd-journal installed
|
22
|
+
#endif
|
17
23
|
|
18
|
-
|
19
|
-
|
20
|
-
|
24
|
+
#ifndef HAVE_SD_JOURNAL_PRINT
|
25
|
+
#error Required function sd_journal_print is missing
|
26
|
+
#endif
|
21
27
|
|
22
|
-
|
23
|
-
|
24
|
-
|
28
|
+
#ifndef HAVE_SD_JOURNAL_SENDV
|
29
|
+
#error Required function sd_journal_sendv is missing
|
30
|
+
#endif
|
25
31
|
|
26
|
-
|
27
|
-
|
28
|
-
|
32
|
+
#ifndef HAVE_SD_JOURNAL_PERROR
|
33
|
+
#error Required function sd_journal_perror is missing
|
34
|
+
#endif
|
29
35
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
36
|
+
/* Do not add C line and file to the log messages */
|
37
|
+
#define SD_JOURNAL_SUPPRESS_LOCATION
|
38
|
+
/* include systemd-journal headers */
|
39
|
+
#include <systemd/sd-journal.h>
|
34
40
|
|
35
|
-
#else
|
41
|
+
#else
|
36
42
|
|
37
|
-
|
43
|
+
#define JOURNALD_NATIVE_SD_JOURNAL_DUMMY true
|
38
44
|
|
39
|
-
|
45
|
+
#warning Compiling dummy version of the gem for non-Linux OS
|
40
46
|
|
41
|
-
|
47
|
+
#include "sd_journal_dummy.h"
|
48
|
+
|
49
|
+
#endif
|
42
50
|
|
51
|
+
#ifdef __cplusplus
|
52
|
+
}
|
43
53
|
#endif
|
44
54
|
|
45
55
|
#endif // JOURNALD_NATIVE_SD_JOURNAL_H
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: journald-native
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anton Smirnov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -65,14 +65,8 @@ files:
|
|
65
65
|
- LICENSE.txt
|
66
66
|
- README.md
|
67
67
|
- Rakefile
|
68
|
-
- ext/journald_native/CMakeLists.txt
|
69
|
-
- ext/journald_native/cpp14shiv.h
|
70
68
|
- ext/journald_native/extconf.rb
|
71
|
-
- ext/journald_native/
|
72
|
-
- ext/journald_native/journald_native.cpp
|
73
|
-
- ext/journald_native/journald_native.h
|
74
|
-
- ext/journald_native/ruby_exception_wrapper.cpp
|
75
|
-
- ext/journald_native/ruby_exception_wrapper.h
|
69
|
+
- ext/journald_native/journald_native.c
|
76
70
|
- ext/journald_native/sd_journal.h
|
77
71
|
- ext/journald_native/sd_journal_dummy.h
|
78
72
|
- journald-native.gemspec
|
@@ -98,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
92
|
version: '0'
|
99
93
|
requirements: []
|
100
94
|
rubyforge_project:
|
101
|
-
rubygems_version: 2.4.
|
95
|
+
rubygems_version: 2.4.5
|
102
96
|
signing_key:
|
103
97
|
specification_version: 4
|
104
98
|
summary: systemd-journal logging native lib wrapper
|
@@ -1,9 +0,0 @@
|
|
1
|
-
# dummy cmake file for CLion
|
2
|
-
|
3
|
-
cmake_minimum_required(VERSION 2.8.4)
|
4
|
-
project(journald_native)
|
5
|
-
|
6
|
-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
7
|
-
|
8
|
-
set(SOURCE_FILES extinit.cpp journald_native.cpp ruby_exception_wrapper.cpp)
|
9
|
-
add_executable(journald_native ${SOURCE_FILES})
|
@@ -1,78 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
unique_ptr from http://isocpp.org/files/papers/N3656.txt
|
3
|
-
index sequence from gcc 4.9 sources
|
4
|
-
*/
|
5
|
-
|
6
|
-
#include <cstddef>
|
7
|
-
#include <memory>
|
8
|
-
#include <type_traits>
|
9
|
-
#include <utility>
|
10
|
-
|
11
|
-
namespace std {
|
12
|
-
template<class T> struct _Unique_if {
|
13
|
-
typedef unique_ptr<T> _Single_object;
|
14
|
-
};
|
15
|
-
|
16
|
-
template<class T> struct _Unique_if<T[]> {
|
17
|
-
typedef unique_ptr<T[]> _Unknown_bound;
|
18
|
-
};
|
19
|
-
|
20
|
-
template<class T, size_t N> struct _Unique_if<T[N]> {
|
21
|
-
typedef void _Known_bound;
|
22
|
-
};
|
23
|
-
|
24
|
-
template<class T, class... Args>
|
25
|
-
typename _Unique_if<T>::_Single_object
|
26
|
-
make_unique(Args&&... args) {
|
27
|
-
return unique_ptr<T>(new T(std::forward<Args>(args)...));
|
28
|
-
}
|
29
|
-
|
30
|
-
template<class T>
|
31
|
-
typename _Unique_if<T>::_Unknown_bound
|
32
|
-
make_unique(size_t n) {
|
33
|
-
typedef typename remove_extent<T>::type U;
|
34
|
-
return unique_ptr<T>(new U[n]());
|
35
|
-
}
|
36
|
-
|
37
|
-
template<class T, class... Args>
|
38
|
-
typename _Unique_if<T>::_Known_bound
|
39
|
-
make_unique(Args&&...) = delete;
|
40
|
-
|
41
|
-
/// Class template integer_sequence
|
42
|
-
template<typename _Tp, _Tp... _Idx>
|
43
|
-
struct integer_sequence
|
44
|
-
{
|
45
|
-
typedef _Tp value_type;
|
46
|
-
static constexpr size_t size() { return sizeof...(_Idx); }
|
47
|
-
};
|
48
|
-
|
49
|
-
template<typename _Tp, _Tp _Num,
|
50
|
-
typename _ISeq = typename _Build_index_tuple<_Num>::__type>
|
51
|
-
struct _Make_integer_sequence;
|
52
|
-
|
53
|
-
template<typename _Tp, _Tp _Num, size_t... _Idx>
|
54
|
-
struct _Make_integer_sequence<_Tp, _Num, _Index_tuple<_Idx...>>
|
55
|
-
{
|
56
|
-
static_assert( _Num >= 0,
|
57
|
-
"Cannot make integer sequence of negative length" );
|
58
|
-
|
59
|
-
typedef integer_sequence<_Tp, static_cast<_Tp>(_Idx)...> __type;
|
60
|
-
};
|
61
|
-
|
62
|
-
/// Alias template make_integer_sequence
|
63
|
-
template<typename _Tp, _Tp _Num>
|
64
|
-
using make_integer_sequence
|
65
|
-
= typename _Make_integer_sequence<_Tp, _Num>::__type;
|
66
|
-
|
67
|
-
/// Alias template index_sequence
|
68
|
-
template<size_t... _Idx>
|
69
|
-
using index_sequence = integer_sequence<size_t, _Idx...>;
|
70
|
-
|
71
|
-
/// Alias template make_index_sequence
|
72
|
-
template<size_t _Num>
|
73
|
-
using make_index_sequence = make_integer_sequence<size_t, _Num>;
|
74
|
-
|
75
|
-
/// Alias template index_sequence_for
|
76
|
-
template<typename... _Types>
|
77
|
-
using index_sequence_for = make_index_sequence<sizeof...(_Types)>;
|
78
|
-
}
|
@@ -1,100 +0,0 @@
|
|
1
|
-
#include "journald_native.h"
|
2
|
-
#include "sd_journal.h"
|
3
|
-
|
4
|
-
#include <memory>
|
5
|
-
|
6
|
-
#include "ruby_exception_wrapper.h"
|
7
|
-
|
8
|
-
namespace journald_native {
|
9
|
-
|
10
|
-
namespace {
|
11
|
-
|
12
|
-
/* aux */
|
13
|
-
// just a short alias for ruby_raisable_call()
|
14
|
-
template <typename Func, typename... Args>
|
15
|
-
inline auto r(Func f, Args... args) -> decltype(f(args...))
|
16
|
-
{
|
17
|
-
return ruby_exception_wrapper::ruby_raisable_call(f, args...);
|
18
|
-
}
|
19
|
-
|
20
|
-
/* methods */
|
21
|
-
inline VALUE native_print(VALUE v_self, VALUE v_priority, VALUE v_message)
|
22
|
-
{
|
23
|
-
int priority = NUM2INT(v_priority);
|
24
|
-
std::string message = r(rb_string_value_cstr, &v_message);
|
25
|
-
|
26
|
-
int result = sd_journal_print(priority, "%s", message.c_str());
|
27
|
-
|
28
|
-
return INT2NUM(result);
|
29
|
-
}
|
30
|
-
|
31
|
-
inline VALUE native_send(int argc, VALUE* argv, VALUE v_self)
|
32
|
-
{
|
33
|
-
auto msgs = std::make_unique<iovec[]>((size_t)argc);
|
34
|
-
|
35
|
-
for (int i = 0; i < argc; i++) {
|
36
|
-
VALUE v = r(rb_string_value, &argv[i]);
|
37
|
-
|
38
|
-
msgs[i].iov_base = (char *)RSTRING_PTR(v);
|
39
|
-
msgs[i].iov_len = (size_t)RSTRING_LEN(v);
|
40
|
-
}
|
41
|
-
|
42
|
-
int result = sd_journal_sendv(msgs.get(), argc);
|
43
|
-
|
44
|
-
return INT2NUM(result);
|
45
|
-
}
|
46
|
-
|
47
|
-
inline VALUE native_perror(VALUE v_self, VALUE v_message)
|
48
|
-
{
|
49
|
-
std::string message = r(rb_string_value_cstr, &v_message);
|
50
|
-
|
51
|
-
int result = sd_journal_perror(message.c_str());
|
52
|
-
|
53
|
-
return INT2NUM(result);
|
54
|
-
}
|
55
|
-
|
56
|
-
VALUE is_dummy(VALUE v_self = Qnil)
|
57
|
-
{
|
58
|
-
constexpr VALUE dummy = JOURNALD_NATIVE_SD_JOURNAL_DUMMY ? Qtrue : Qfalse;
|
59
|
-
return dummy;
|
60
|
-
}
|
61
|
-
|
62
|
-
/* initializers */
|
63
|
-
inline void init_journald(VALUE module)
|
64
|
-
{
|
65
|
-
rb_define_const(module, "LOG_EMERG", INT2NUM(LOG_EMERG)); /* system is unusable */
|
66
|
-
rb_define_const(module, "LOG_ALERT", INT2NUM(LOG_ALERT)); /* action must be taken immediately */
|
67
|
-
rb_define_const(module, "LOG_CRIT", INT2NUM(LOG_CRIT)); /* critical conditions */
|
68
|
-
rb_define_const(module, "LOG_ERR", INT2NUM(LOG_ERR)); /* error conditions */
|
69
|
-
rb_define_const(module, "LOG_WARNING", INT2NUM(LOG_WARNING)); /* warning conditions */
|
70
|
-
rb_define_const(module, "LOG_NOTICE", INT2NUM(LOG_NOTICE)); /* normal but significant condition */
|
71
|
-
rb_define_const(module, "LOG_INFO", INT2NUM(LOG_INFO)); /* informational */
|
72
|
-
rb_define_const(module, "LOG_DEBUG", INT2NUM(LOG_DEBUG)); /* debug-level messages */
|
73
|
-
}
|
74
|
-
|
75
|
-
inline void init_native(VALUE module)
|
76
|
-
{
|
77
|
-
// methods
|
78
|
-
rb_define_singleton_method(module, "print", RXW_WRAPPED_METHOD_FUNC(native_print, VALUE, VALUE, VALUE), 2);
|
79
|
-
rb_define_singleton_method(module, "send", RXW_WRAPPED_METHOD_FUNC(native_send, int, VALUE*, VALUE), -1); /* -1 to pass as C array */
|
80
|
-
rb_define_singleton_method(module, "perror", RXW_WRAPPED_METHOD_FUNC(native_perror, VALUE, VALUE), 1);
|
81
|
-
|
82
|
-
// dummy detection
|
83
|
-
rb_define_const(module, "IS_DUMMY", is_dummy());
|
84
|
-
rb_define_singleton_method(module, "dummy?", RUBY_METHOD_FUNC(is_dummy), 0);
|
85
|
-
}
|
86
|
-
|
87
|
-
} // private namespace
|
88
|
-
|
89
|
-
void init_modules()
|
90
|
-
{
|
91
|
-
// no nontrivial destructors during initialization, no need for ruby catch
|
92
|
-
|
93
|
-
VALUE mJournald = rb_define_module("Journald");
|
94
|
-
VALUE mNative = rb_define_module_under(mJournald, "Native");
|
95
|
-
|
96
|
-
init_journald(mJournald); // add constants to Journald
|
97
|
-
init_native(mNative); // add methods to Journald::Native
|
98
|
-
}
|
99
|
-
|
100
|
-
}
|
@@ -1,12 +0,0 @@
|
|
1
|
-
#ifndef JOURNALD_NATIVE_JOURNALD_NATIVE_H
|
2
|
-
#define JOURNALD_NATIVE_JOURNALD_NATIVE_H
|
3
|
-
|
4
|
-
#include <string>
|
5
|
-
#include <ruby.h>
|
6
|
-
|
7
|
-
namespace journald_native {
|
8
|
-
/* initializers */
|
9
|
-
void init_modules();
|
10
|
-
}
|
11
|
-
|
12
|
-
#endif // JOURNALD_NATIVE_JOURNALD_NATIVE_H
|
@@ -1,16 +0,0 @@
|
|
1
|
-
#include "ruby_exception_wrapper.h"
|
2
|
-
|
3
|
-
namespace ruby_exception_wrapper {
|
4
|
-
|
5
|
-
// callback for rb_rescue2 to catch ruby exception and wrap it by RbWrappedException
|
6
|
-
VALUE rethrow_as_cpp(VALUE put_exception_here_ptr, VALUE exception)
|
7
|
-
{
|
8
|
-
// cannot actually throw here, just pass the exception
|
9
|
-
VALUE* excptr = reinterpret_cast<VALUE*>(put_exception_here_ptr);
|
10
|
-
|
11
|
-
*excptr = exception;
|
12
|
-
|
13
|
-
return exception;
|
14
|
-
}
|
15
|
-
|
16
|
-
}
|
@@ -1,105 +0,0 @@
|
|
1
|
-
#ifndef RUBY_EXCEPTION_WRAPPER_H
|
2
|
-
#define RUBY_EXCEPTION_WRAPPER_H
|
3
|
-
|
4
|
-
#include <ruby.h>
|
5
|
-
|
6
|
-
#include <functional>
|
7
|
-
#include <type_traits>
|
8
|
-
#include <utility>
|
9
|
-
|
10
|
-
#include "cpp14shiv.h" // make this c++14 code c++11 compatible; remove for c++14
|
11
|
-
|
12
|
-
// wrap functions, prototype required, i.e. RXW_WRAPPED_METHOD_FUNC(native_send, int, VALUE*, VALUE)
|
13
|
-
// functions can be inline
|
14
|
-
#define RXW_WRAPPED_METHOD_FUNC(method, ...) ((VALUE (*)(ANYARGS))::ruby_exception_wrapper::method_wrapper_call<decltype(&method), method, __VA_ARGS__>)
|
15
|
-
|
16
|
-
namespace ruby_exception_wrapper {
|
17
|
-
|
18
|
-
class RbWrappedException: public std::exception {
|
19
|
-
VALUE ruby_exception;
|
20
|
-
public:
|
21
|
-
RbWrappedException(VALUE e): ruby_exception(e) {};
|
22
|
-
VALUE getRubyException() { return ruby_exception; }
|
23
|
-
};
|
24
|
-
|
25
|
-
// callback for rb_rescue2 to catch ruby exception and wrap it by RbWrappedException
|
26
|
-
VALUE rethrow_as_cpp(VALUE put_exception_here_ptr, VALUE exception);
|
27
|
-
|
28
|
-
namespace {
|
29
|
-
// do real call of function from template
|
30
|
-
template <typename FuncPointer, typename... Args>
|
31
|
-
inline VALUE call_wrapper_tuple_impl(FuncPointer& fp, Args... args)
|
32
|
-
{
|
33
|
-
// only pointers and VALUE permitted
|
34
|
-
// VALUE guaranteed to be able to contain pointer
|
35
|
-
return reinterpret_cast<VALUE>(fp(args...));
|
36
|
-
}
|
37
|
-
|
38
|
-
// unpack params to do real call
|
39
|
-
template <typename CallTuple, std::size_t... Is>
|
40
|
-
inline VALUE call_wrapper_tuple_unpack(CallTuple& call_tuple, std::index_sequence<Is...>)
|
41
|
-
{
|
42
|
-
return call_wrapper_tuple_impl(std::get<Is>(call_tuple)...);
|
43
|
-
}
|
44
|
-
|
45
|
-
// callback for rb_rescue2 for no exceptions
|
46
|
-
template <typename CallTuple>
|
47
|
-
VALUE call_wrapper_tuple(VALUE v_ct) {
|
48
|
-
CallTuple call_tuple = std::move(*reinterpret_cast<CallTuple*>(v_ct));
|
49
|
-
|
50
|
-
return call_wrapper_tuple_unpack(call_tuple, std::make_index_sequence<std::tuple_size<CallTuple>::value> {});
|
51
|
-
};
|
52
|
-
|
53
|
-
// safely call function
|
54
|
-
template <typename Func, typename... Args>
|
55
|
-
inline auto do_raisable_call(Func f, Args... args) -> decltype(f(args...))
|
56
|
-
{
|
57
|
-
typedef std::function<typename std::remove_pointer<Func>::type> FuncPointer;
|
58
|
-
typedef std::tuple<FuncPointer, Args...> CallTuple;
|
59
|
-
|
60
|
-
FuncPointer fp = f;
|
61
|
-
|
62
|
-
CallTuple call_tuple = std::make_tuple(fp, args...);
|
63
|
-
|
64
|
-
VALUE exception = 0; // get raised exception if any
|
65
|
-
|
66
|
-
VALUE result = rb_rescue2(
|
67
|
-
RUBY_METHOD_FUNC(call_wrapper_tuple<CallTuple>), reinterpret_cast<VALUE>(&call_tuple),
|
68
|
-
RUBY_METHOD_FUNC(rethrow_as_cpp), reinterpret_cast<VALUE>(&exception),
|
69
|
-
rb_eException, Qfalse
|
70
|
-
);
|
71
|
-
|
72
|
-
if (exception) { // nonzero here if rescue called unless some pervert throws Qfalse
|
73
|
-
throw RbWrappedException(exception);
|
74
|
-
}
|
75
|
-
|
76
|
-
return reinterpret_cast<decltype(f(args...))>(result);
|
77
|
-
}
|
78
|
-
}
|
79
|
-
|
80
|
-
template <typename Func, typename... Args>
|
81
|
-
inline auto ruby_raisable_call(Func f, Args... args) -> decltype(f(args...))
|
82
|
-
{
|
83
|
-
static_assert(
|
84
|
-
std::is_same<decltype(f(args...)), VALUE>::value || std::is_pointer<decltype(f(args...))>::value,
|
85
|
-
"Only for funcs returning VALUE or pointer"
|
86
|
-
);
|
87
|
-
|
88
|
-
auto result = do_raisable_call(f, args...);
|
89
|
-
|
90
|
-
return result;
|
91
|
-
}
|
92
|
-
|
93
|
-
template <typename Func, Func func, typename... Args>
|
94
|
-
VALUE method_wrapper_call(Args... args)
|
95
|
-
{
|
96
|
-
try {
|
97
|
-
return func(args...);
|
98
|
-
} catch(RbWrappedException &e) {
|
99
|
-
rb_exc_raise(e.getRubyException());
|
100
|
-
}
|
101
|
-
}
|
102
|
-
|
103
|
-
}
|
104
|
-
|
105
|
-
#endif
|