slyphon-zookeeper 0.8.4-java → 0.9.0-java

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.
data/CHANGELOG CHANGED
@@ -1,8 +1,18 @@
1
- v0.8.4 fix NameError, require 'forwardable'
2
-
3
- * Really not sure why this didn't come up in tests
1
+ v0.9.0 RELEASE THE KRAK..er, GIL!!
2
+
3
+ * In >= 1.9.2 the ruby interpreter allows you to release the GIL when
4
+ calling into native code, sounds like a good idea.
5
+
6
+ This release makes use of that code by parsing the zookeeper.h header file
7
+ and extracting the method signatures of all relevant zoo_* functions, then
8
+ generating boilerplate that allows us to call those functions via the
9
+ rb_thread_blocking_region function.
10
+
11
+ 1.8.7 compatibility is maintained by stubbing out that functionality if built
12
+ under 1.8.7.
4
13
 
5
- * issue here https://github.com/slyphon/zk/issues/22
14
+ * 1.8.7 is deprecated! I will continue to support 1.8.7 for the near future
15
+ but sometime soon, you're gonna have to upgrade.
6
16
 
7
17
  v0.8.3 fix NonLocalJump exception in event delivery thread shutdown code
8
18
 
data/Rakefile CHANGED
@@ -50,7 +50,7 @@ gemset_name = 'zookeeper'
50
50
  sh "rvm #{ruby_with_gemset} do bundle exec rspec spec --fail-fast"
51
51
  end
52
52
 
53
- task "mb:test_all_rubies" => rspec_task_name
53
+ task "mb:test_all" => rspec_task_name
54
54
  end
55
55
 
56
56
  namespace :build do
data/ext/Rakefile CHANGED
@@ -7,6 +7,28 @@ task :clean do
7
7
  end
8
8
  end
9
9
 
10
+ GENERATE_GVL_CODE_RB = 'generate_gvl_code.rb'
11
+
12
+ file 'c' do
13
+ if tarball = Dir['zkc-*.tar.gz'].first
14
+ sh "tar -zxf #{tarball}"
15
+ else
16
+ raise "couldn't find the tarball! wtf?!"
17
+ end
18
+ end
19
+
20
+ file GENERATE_GVL_CODE_RB => 'c'
21
+
22
+ file 'zkrb_wrapper.c' => GENERATE_GVL_CODE_RB do
23
+ sh "ruby generate_gvl_code.rb code"
24
+ end
25
+
26
+ file 'zkrb_wrapper.h' => GENERATE_GVL_CODE_RB do
27
+ sh "ruby generate_gvl_code.rb headers"
28
+ end
29
+
30
+ ZKRB_WRAPPER = %w[zkrb_wrapper.c zkrb_wrapper.h]
31
+
10
32
  task :clobber => :clean do
11
33
  rm_rf %w[Makefile c lib bin include]
12
34
  end
@@ -17,7 +39,7 @@ end
17
39
 
18
40
  file 'Makefile' => :build_zkc
19
41
 
20
- task :build => 'Makefile' do
42
+ task :build => [ZKRB_WRAPPER, 'Makefile'].flatten do
21
43
  sh 'make'
22
44
  end
23
45
 
data/ext/depend CHANGED
@@ -1,3 +1,5 @@
1
1
  zookeeper_lib.c: zookeeper_lib.h
2
- zookeeper_c.c: zookeeper_lib.c zookeeper_lib.h dbg.h
2
+ zkrb_wrapper_compat.c: zkrb_wrapper_compat.h
3
+ zkrb_wrapper.c: zkrb_wrapper_compat.c zkrb_wrapper.h
4
+ zookeeper_c.c: zookeeper_lib.c zookeeper_lib.h zkrb_wrapper.c zkrb_wrapper.h dbg.h
3
5
 
data/ext/extconf.rb CHANGED
@@ -19,6 +19,10 @@ $LDFLAGS = "#{$LDFLAGS}".gsub("$(ldflags)", "").gsub("-arch ppc", "")
19
19
  $CXXFLAGS = " -std=gnu++98 #{$CFLAGS}"
20
20
  $CPPFLAGS = $ARCH_FLAG = $DLDFLAGS = ""
21
21
 
22
+ if RUBY_VERSION == '1.8.7'
23
+ $CFLAGS << ' -DZKRB_RUBY_187'
24
+ end
25
+
22
26
  ZK_DEBUG = (ENV['DEBUG'] or ARGV.any? { |arg| arg == '--debug' })
23
27
  DEBUG_CFLAGS = " -O0 -ggdb3 -DHAVE_DEBUG"
24
28
 
@@ -0,0 +1,332 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ =begin
4
+ the idea here is to take each zoo_* function declaration in the header file, and turn it into
5
+ a calling arguments struct, a wrapper function and a macro for packing the values.
6
+
7
+ so for:
8
+
9
+ ZOOAPI int zoo_acreate(zhandle_t *zh, const char *path, const char *value,
10
+ int valuelen, const struct ACL_vector *acl, int flags,
11
+ string_completion_t completion, const void *data);
12
+
13
+ we want
14
+
15
+ typedef struct {
16
+ zhandle_t *zh;
17
+ const char *path;
18
+ const char *value;
19
+ int valuelen;
20
+ const struct ACL_vector *acl;
21
+ int flags;
22
+ string_completion_t completion;
23
+ const void *data;
24
+ } zkrb_zoo_acreate_args_t;
25
+
26
+ static VALUE zkrb_gvl_zoo_acreate(void *data) {
27
+ zkrb_zoo_acreate_args_t *a = (zkrb_zoo_acreate_args_t *)data;
28
+
29
+ a->rc = zoo_acreate(a->zh, a->path, a->value, a->valuelen, a->acl, a->flags, a->completion, a->data);
30
+
31
+ return Qnil;
32
+ }
33
+
34
+ static int zkrb_call_zoo_acreate(zhandle_t *zh, const char *path, const char *value,
35
+ int valuelen, const struct ACL_vector *acl, int flags,
36
+ string_completion_t completion, const void *data) {
37
+
38
+ int rc;
39
+ zkrb_zoo_acreate_args_t *ptr = malloc(sizeof(zkrb_zoo_acreate_args_t));
40
+ check_mem(ptr);
41
+
42
+ ptr->rc = 0;
43
+ ptr->zh = zh;
44
+ ptr->path = path;
45
+ ptr->value = value;
46
+ ptr->valuelen = valuelen;
47
+ ptr->acl = acl;
48
+ ptr->flags = flags;
49
+ ptr->completion = completion;
50
+ ptr->data = data;
51
+
52
+ rb_thread_blocking_region(zkrb_gvl_zoo_acreate, (void *)ptr, RUBY_UBF_IO, 0);
53
+
54
+ rc = ptr->rc;
55
+ free(ptr);
56
+ return rc;
57
+
58
+ error:
59
+ free(ptr);
60
+ return -1;
61
+ }
62
+
63
+ =end
64
+
65
+ REGEXP = /^ZOOAPI int (zoo_[^(]+)\(([^)]+)\);$/m
66
+
67
+ require 'forwardable'
68
+ require 'stringio'
69
+
70
+ ZKRB_WRAPPER_H_PATH = File.expand_path('../zkrb_wrapper.h', __FILE__)
71
+ ZKRB_WRAPPER_C_PATH = File.expand_path('../zkrb_wrapper.c', __FILE__)
72
+
73
+ # the struct that holds the call args for zoo_fn_name
74
+ class CallStruct
75
+ attr_reader :zoo_fn_name, :typed_args, :name
76
+
77
+ def initialize(zoo_fn_name, typed_args)
78
+ @zoo_fn_name, @typed_args = zoo_fn_name, typed_args
79
+ @name = "zkrb_#{zoo_fn_name}_args_t"
80
+ end
81
+
82
+ def body
83
+ @body ||= (
84
+ lines = ["typedef struct {"]
85
+ lines += typed_args.map{|n| " #{n};"}
86
+ lines << " int rc;"
87
+ lines << "} #{name};"
88
+ lines.join("\n")
89
+ )
90
+ end
91
+ end
92
+
93
+ module MemberNames
94
+ def member_names
95
+ @member_names ||= typed_args.map { |n| n.split(/[ *]/).last }
96
+ end
97
+ end
98
+
99
+ # the zkrb_gvl_zoo_* function
100
+ class WrapperFunction
101
+ extend Forwardable
102
+ include MemberNames
103
+
104
+ PREFIX = 'zkrb_gvl'
105
+
106
+ def_delegators :struct, :typed_args
107
+
108
+ attr_reader :struct, :name, :zoo_fn_name
109
+
110
+ def initialize(zoo_fn_name, struct)
111
+ @zoo_fn_name = zoo_fn_name
112
+ @struct = struct
113
+ @name = "#{PREFIX}_#{zoo_fn_name}"
114
+ end
115
+
116
+ def fn_signature
117
+ @fn_signature ||= "static VALUE #{name}(void *data)"
118
+ end
119
+
120
+ def body
121
+ @body ||= (
122
+ lines = ["#{fn_signature} {"]
123
+ lines << " #{struct.name} *a = (#{struct.name} *)data;"
124
+
125
+ funcall = " a->rc = #{zoo_fn_name}("
126
+ funcall << member_names.map { |m| "a->#{m}" }.join(', ')
127
+ funcall << ');'
128
+
129
+ lines << funcall
130
+
131
+ lines << " return Qnil;"
132
+ lines << "}"
133
+ lines.join("\n")
134
+ )
135
+ end
136
+ end
137
+
138
+ # the zkrb_call_zoo_* function
139
+ class CallingFunction
140
+ extend Forwardable
141
+ include MemberNames
142
+
143
+ PREFIX = 'zkrb_call'
144
+
145
+ def_delegators :struct, :typed_args
146
+
147
+ attr_reader :struct, :wrapper_fn, :zoo_fn_name, :name
148
+
149
+ def initialize(zoo_fn_name, struct, wrapper_fn)
150
+ @zoo_fn_name, @struct, @wrapper_fn = zoo_fn_name, struct, wrapper_fn
151
+
152
+ @name = "#{PREFIX}_#{zoo_fn_name}"
153
+ end
154
+
155
+ def fn_signature
156
+ @fn_signature ||= "int #{name}(#{typed_args.join(', ')})"
157
+ end
158
+
159
+ def ptr_lines
160
+ @ptr_lines = (
161
+ lines = ["ptr->rc = rc;"]
162
+ lines += member_names.map { |n| "ptr->#{n} = #{n};" }
163
+ lines.map! { |n| " #{n}" }
164
+ lines.join("\n")
165
+ )
166
+ end
167
+
168
+ def top
169
+ <<-EOS
170
+ // wrapper that calls #{zoo_fn_name} via #{wrapper_fn.name} inside rb_thread_blocking_region
171
+ #{fn_signature} {
172
+ int rc = ZKRB_FAIL;
173
+ #{struct.name} *ptr = malloc(sizeof(#{struct.name}));
174
+ check_mem(ptr);
175
+ EOS
176
+ end
177
+
178
+ def rb_thread_blocking_region_call
179
+ " zkrb_thread_blocking_region(#{wrapper_fn.name}, (void *)ptr);"
180
+ end
181
+
182
+ def bottom
183
+ <<-EOS
184
+
185
+ rc = ptr->rc;
186
+
187
+ error:
188
+ free(ptr);
189
+ return rc;
190
+ }
191
+ EOS
192
+ end
193
+
194
+ def body
195
+ @body ||= [top, ptr_lines, nil, rb_thread_blocking_region_call, bottom].join("\n")
196
+ end
197
+ end
198
+
199
+ class GeneratedCode < Struct.new(:structs, :wrapper_fns, :calling_fns)
200
+ def initialize(*a)
201
+ super
202
+
203
+ self.structs ||= []
204
+ self.wrapper_fns ||= []
205
+ self.calling_fns ||= []
206
+ end
207
+
208
+ def self.from_zookeeper_h(text)
209
+ new.tap do |code|
210
+ while true
211
+ break unless text =~ REGEXP
212
+ zoo_fn_name, argstr = $1
213
+ argstr = $2
214
+
215
+ typed_args = argstr.split(',').map(&:strip)
216
+
217
+ # gah, fix up zoo_aset_acl which has a void_completion_t with no name assigned
218
+ if zoo_fn_name == 'zoo_aset_acl'
219
+ if idx = typed_args.index('void_completion_t')
220
+ typed_args[idx] = 'void_completion_t completion'
221
+ end
222
+ end
223
+
224
+ struct = CallStruct.new(zoo_fn_name, typed_args)
225
+ wrapper_fn = WrapperFunction.new(zoo_fn_name, struct)
226
+ calling_fn = CallingFunction.new(zoo_fn_name, struct, wrapper_fn)
227
+
228
+ code.structs << struct
229
+ code.wrapper_fns << wrapper_fn
230
+ code.calling_fns << calling_fn
231
+
232
+ text = $~.post_match
233
+ end
234
+ end
235
+ end
236
+ end
237
+
238
+ def render_header_file(code)
239
+ StringIO.new('zkrb_wrapper.h', 'w').tap do |fp|
240
+ fp.puts <<-EOS
241
+ #ifndef ZKRB_WRAPPER_H
242
+ #define ZKRB_WRAPPER_H
243
+ #if 0
244
+
245
+ AUTOGENERATED BY #{File.basename(__FILE__)}
246
+
247
+ #endif
248
+
249
+ #include "ruby.h"
250
+ #include "c-client-src/zookeeper.h"
251
+ #include "zkrb_wrapper_compat.h"
252
+ #include "dbg.h"
253
+
254
+ #define ZKRB_FAIL -1
255
+
256
+ EOS
257
+
258
+ code.structs.each do |struct|
259
+ fp.puts(struct.body)
260
+ fp.puts
261
+ end
262
+
263
+ code.calling_fns.each do |cf|
264
+ fp.puts "#{cf.fn_signature};"
265
+ end
266
+
267
+ fp.puts <<-EOS
268
+
269
+ #endif /* ZKRB_WRAPPER_H */
270
+ EOS
271
+
272
+ end.string
273
+ end
274
+
275
+ def render_c_file(code)
276
+ StringIO.new('zkrb_wrapper.c', 'w').tap do |fp|
277
+ fp.puts <<-EOS
278
+ /*
279
+
280
+ Autogenerated boilerplate wrappers around zoo_* function calls necessary for using
281
+ rb_thread_blocking_region to release the GIL when calling native code.
282
+
283
+ generated by ext/#{File.basename(__FILE__)}
284
+
285
+ */
286
+
287
+ #include "ruby.h"
288
+ #include "zkrb_wrapper.h"
289
+ #include <errno.h>
290
+ #include <stdio.h>
291
+ #include <stdlib.h>
292
+
293
+ EOS
294
+
295
+ code.wrapper_fns.zip(code.calling_fns) do |wrap_fn, call_fn|
296
+ fp.puts "#{wrap_fn.body}\n\n"
297
+ fp.puts "#{call_fn.body}\n\n"
298
+ end
299
+
300
+ end.string
301
+ end
302
+
303
+
304
+ def help!
305
+ $stderr.puts "usage: #{File.basename(__FILE__)} {all|headers|code}"
306
+ exit 1
307
+ end
308
+
309
+ def main
310
+ help! if ARGV.empty?
311
+
312
+ text = File.read('c/include/zookeeper.h')
313
+ code = GeneratedCode.from_zookeeper_h(text)
314
+
315
+ cmd = ARGV.first
316
+
317
+ help! unless %w[headers all code].include?(cmd)
318
+
319
+ if %w[headers all].include?(cmd)
320
+ $stderr.puts "writing #{ZKRB_WRAPPER_H_PATH}"
321
+ File.open(ZKRB_WRAPPER_H_PATH, 'w') { |fp| fp.write(render_header_file(code)) }
322
+ end
323
+
324
+ if %w[code all].include?(cmd)
325
+ $stderr.puts "writing #{ZKRB_WRAPPER_C_PATH}"
326
+ File.open(ZKRB_WRAPPER_C_PATH, 'w') { |fp| fp.write(render_c_file(code)) }
327
+ end
328
+
329
+ end
330
+
331
+ main
332
+
@@ -0,0 +1,917 @@
1
+ /*
2
+
3
+ Autogenerated boilerplate wrappers around zoo_* function calls necessary for using
4
+ rb_thread_blocking_region to release the GIL when calling native code.
5
+
6
+ generated by ext/generate_gvl_code.rb
7
+
8
+ */
9
+
10
+ #include "ruby.h"
11
+ #include "zkrb_wrapper.h"
12
+ #include <errno.h>
13
+ #include <stdio.h>
14
+ #include <stdlib.h>
15
+
16
+ static VALUE zkrb_gvl_zoo_recv_timeout(void *data) {
17
+ zkrb_zoo_recv_timeout_args_t *a = (zkrb_zoo_recv_timeout_args_t *)data;
18
+ a->rc = zoo_recv_timeout(a->zh);
19
+ return Qnil;
20
+ }
21
+
22
+ // wrapper that calls zoo_recv_timeout via zkrb_gvl_zoo_recv_timeout inside rb_thread_blocking_region
23
+ int zkrb_call_zoo_recv_timeout(zhandle_t *zh) {
24
+ int rc = ZKRB_FAIL;
25
+ zkrb_zoo_recv_timeout_args_t *ptr = malloc(sizeof(zkrb_zoo_recv_timeout_args_t));
26
+ check_mem(ptr);
27
+
28
+ ptr->rc = rc;
29
+ ptr->zh = zh;
30
+
31
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_recv_timeout, (void *)ptr);
32
+
33
+ rc = ptr->rc;
34
+
35
+ error:
36
+ free(ptr);
37
+ return rc;
38
+ }
39
+
40
+
41
+ static VALUE zkrb_gvl_zoo_state(void *data) {
42
+ zkrb_zoo_state_args_t *a = (zkrb_zoo_state_args_t *)data;
43
+ a->rc = zoo_state(a->zh);
44
+ return Qnil;
45
+ }
46
+
47
+ // wrapper that calls zoo_state via zkrb_gvl_zoo_state inside rb_thread_blocking_region
48
+ int zkrb_call_zoo_state(zhandle_t *zh) {
49
+ int rc = ZKRB_FAIL;
50
+ zkrb_zoo_state_args_t *ptr = malloc(sizeof(zkrb_zoo_state_args_t));
51
+ check_mem(ptr);
52
+
53
+ ptr->rc = rc;
54
+ ptr->zh = zh;
55
+
56
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_state, (void *)ptr);
57
+
58
+ rc = ptr->rc;
59
+
60
+ error:
61
+ free(ptr);
62
+ return rc;
63
+ }
64
+
65
+
66
+ static VALUE zkrb_gvl_zoo_acreate(void *data) {
67
+ zkrb_zoo_acreate_args_t *a = (zkrb_zoo_acreate_args_t *)data;
68
+ a->rc = zoo_acreate(a->zh, a->path, a->value, a->valuelen, a->acl, a->flags, a->completion, a->data);
69
+ return Qnil;
70
+ }
71
+
72
+ // wrapper that calls zoo_acreate via zkrb_gvl_zoo_acreate inside rb_thread_blocking_region
73
+ int zkrb_call_zoo_acreate(zhandle_t *zh, const char *path, const char *value, int valuelen, const struct ACL_vector *acl, int flags, string_completion_t completion, const void *data) {
74
+ int rc = ZKRB_FAIL;
75
+ zkrb_zoo_acreate_args_t *ptr = malloc(sizeof(zkrb_zoo_acreate_args_t));
76
+ check_mem(ptr);
77
+
78
+ ptr->rc = rc;
79
+ ptr->zh = zh;
80
+ ptr->path = path;
81
+ ptr->value = value;
82
+ ptr->valuelen = valuelen;
83
+ ptr->acl = acl;
84
+ ptr->flags = flags;
85
+ ptr->completion = completion;
86
+ ptr->data = data;
87
+
88
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_acreate, (void *)ptr);
89
+
90
+ rc = ptr->rc;
91
+
92
+ error:
93
+ free(ptr);
94
+ return rc;
95
+ }
96
+
97
+
98
+ static VALUE zkrb_gvl_zoo_adelete(void *data) {
99
+ zkrb_zoo_adelete_args_t *a = (zkrb_zoo_adelete_args_t *)data;
100
+ a->rc = zoo_adelete(a->zh, a->path, a->version, a->completion, a->data);
101
+ return Qnil;
102
+ }
103
+
104
+ // wrapper that calls zoo_adelete via zkrb_gvl_zoo_adelete inside rb_thread_blocking_region
105
+ int zkrb_call_zoo_adelete(zhandle_t *zh, const char *path, int version, void_completion_t completion, const void *data) {
106
+ int rc = ZKRB_FAIL;
107
+ zkrb_zoo_adelete_args_t *ptr = malloc(sizeof(zkrb_zoo_adelete_args_t));
108
+ check_mem(ptr);
109
+
110
+ ptr->rc = rc;
111
+ ptr->zh = zh;
112
+ ptr->path = path;
113
+ ptr->version = version;
114
+ ptr->completion = completion;
115
+ ptr->data = data;
116
+
117
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_adelete, (void *)ptr);
118
+
119
+ rc = ptr->rc;
120
+
121
+ error:
122
+ free(ptr);
123
+ return rc;
124
+ }
125
+
126
+
127
+ static VALUE zkrb_gvl_zoo_aexists(void *data) {
128
+ zkrb_zoo_aexists_args_t *a = (zkrb_zoo_aexists_args_t *)data;
129
+ a->rc = zoo_aexists(a->zh, a->path, a->watch, a->completion, a->data);
130
+ return Qnil;
131
+ }
132
+
133
+ // wrapper that calls zoo_aexists via zkrb_gvl_zoo_aexists inside rb_thread_blocking_region
134
+ int zkrb_call_zoo_aexists(zhandle_t *zh, const char *path, int watch, stat_completion_t completion, const void *data) {
135
+ int rc = ZKRB_FAIL;
136
+ zkrb_zoo_aexists_args_t *ptr = malloc(sizeof(zkrb_zoo_aexists_args_t));
137
+ check_mem(ptr);
138
+
139
+ ptr->rc = rc;
140
+ ptr->zh = zh;
141
+ ptr->path = path;
142
+ ptr->watch = watch;
143
+ ptr->completion = completion;
144
+ ptr->data = data;
145
+
146
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_aexists, (void *)ptr);
147
+
148
+ rc = ptr->rc;
149
+
150
+ error:
151
+ free(ptr);
152
+ return rc;
153
+ }
154
+
155
+
156
+ static VALUE zkrb_gvl_zoo_awexists(void *data) {
157
+ zkrb_zoo_awexists_args_t *a = (zkrb_zoo_awexists_args_t *)data;
158
+ a->rc = zoo_awexists(a->zh, a->path, a->watcher, a->watcherCtx, a->completion, a->data);
159
+ return Qnil;
160
+ }
161
+
162
+ // wrapper that calls zoo_awexists via zkrb_gvl_zoo_awexists inside rb_thread_blocking_region
163
+ int zkrb_call_zoo_awexists(zhandle_t *zh, const char *path, watcher_fn watcher, void* watcherCtx, stat_completion_t completion, const void *data) {
164
+ int rc = ZKRB_FAIL;
165
+ zkrb_zoo_awexists_args_t *ptr = malloc(sizeof(zkrb_zoo_awexists_args_t));
166
+ check_mem(ptr);
167
+
168
+ ptr->rc = rc;
169
+ ptr->zh = zh;
170
+ ptr->path = path;
171
+ ptr->watcher = watcher;
172
+ ptr->watcherCtx = watcherCtx;
173
+ ptr->completion = completion;
174
+ ptr->data = data;
175
+
176
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_awexists, (void *)ptr);
177
+
178
+ rc = ptr->rc;
179
+
180
+ error:
181
+ free(ptr);
182
+ return rc;
183
+ }
184
+
185
+
186
+ static VALUE zkrb_gvl_zoo_aget(void *data) {
187
+ zkrb_zoo_aget_args_t *a = (zkrb_zoo_aget_args_t *)data;
188
+ a->rc = zoo_aget(a->zh, a->path, a->watch, a->completion, a->data);
189
+ return Qnil;
190
+ }
191
+
192
+ // wrapper that calls zoo_aget via zkrb_gvl_zoo_aget inside rb_thread_blocking_region
193
+ int zkrb_call_zoo_aget(zhandle_t *zh, const char *path, int watch, data_completion_t completion, const void *data) {
194
+ int rc = ZKRB_FAIL;
195
+ zkrb_zoo_aget_args_t *ptr = malloc(sizeof(zkrb_zoo_aget_args_t));
196
+ check_mem(ptr);
197
+
198
+ ptr->rc = rc;
199
+ ptr->zh = zh;
200
+ ptr->path = path;
201
+ ptr->watch = watch;
202
+ ptr->completion = completion;
203
+ ptr->data = data;
204
+
205
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_aget, (void *)ptr);
206
+
207
+ rc = ptr->rc;
208
+
209
+ error:
210
+ free(ptr);
211
+ return rc;
212
+ }
213
+
214
+
215
+ static VALUE zkrb_gvl_zoo_awget(void *data) {
216
+ zkrb_zoo_awget_args_t *a = (zkrb_zoo_awget_args_t *)data;
217
+ a->rc = zoo_awget(a->zh, a->path, a->watcher, a->watcherCtx, a->completion, a->data);
218
+ return Qnil;
219
+ }
220
+
221
+ // wrapper that calls zoo_awget via zkrb_gvl_zoo_awget inside rb_thread_blocking_region
222
+ int zkrb_call_zoo_awget(zhandle_t *zh, const char *path, watcher_fn watcher, void* watcherCtx, data_completion_t completion, const void *data) {
223
+ int rc = ZKRB_FAIL;
224
+ zkrb_zoo_awget_args_t *ptr = malloc(sizeof(zkrb_zoo_awget_args_t));
225
+ check_mem(ptr);
226
+
227
+ ptr->rc = rc;
228
+ ptr->zh = zh;
229
+ ptr->path = path;
230
+ ptr->watcher = watcher;
231
+ ptr->watcherCtx = watcherCtx;
232
+ ptr->completion = completion;
233
+ ptr->data = data;
234
+
235
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_awget, (void *)ptr);
236
+
237
+ rc = ptr->rc;
238
+
239
+ error:
240
+ free(ptr);
241
+ return rc;
242
+ }
243
+
244
+
245
+ static VALUE zkrb_gvl_zoo_aset(void *data) {
246
+ zkrb_zoo_aset_args_t *a = (zkrb_zoo_aset_args_t *)data;
247
+ a->rc = zoo_aset(a->zh, a->path, a->buffer, a->buflen, a->version, a->completion, a->data);
248
+ return Qnil;
249
+ }
250
+
251
+ // wrapper that calls zoo_aset via zkrb_gvl_zoo_aset inside rb_thread_blocking_region
252
+ int zkrb_call_zoo_aset(zhandle_t *zh, const char *path, const char *buffer, int buflen, int version, stat_completion_t completion, const void *data) {
253
+ int rc = ZKRB_FAIL;
254
+ zkrb_zoo_aset_args_t *ptr = malloc(sizeof(zkrb_zoo_aset_args_t));
255
+ check_mem(ptr);
256
+
257
+ ptr->rc = rc;
258
+ ptr->zh = zh;
259
+ ptr->path = path;
260
+ ptr->buffer = buffer;
261
+ ptr->buflen = buflen;
262
+ ptr->version = version;
263
+ ptr->completion = completion;
264
+ ptr->data = data;
265
+
266
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_aset, (void *)ptr);
267
+
268
+ rc = ptr->rc;
269
+
270
+ error:
271
+ free(ptr);
272
+ return rc;
273
+ }
274
+
275
+
276
+ static VALUE zkrb_gvl_zoo_aget_children(void *data) {
277
+ zkrb_zoo_aget_children_args_t *a = (zkrb_zoo_aget_children_args_t *)data;
278
+ a->rc = zoo_aget_children(a->zh, a->path, a->watch, a->completion, a->data);
279
+ return Qnil;
280
+ }
281
+
282
+ // wrapper that calls zoo_aget_children via zkrb_gvl_zoo_aget_children inside rb_thread_blocking_region
283
+ int zkrb_call_zoo_aget_children(zhandle_t *zh, const char *path, int watch, strings_completion_t completion, const void *data) {
284
+ int rc = ZKRB_FAIL;
285
+ zkrb_zoo_aget_children_args_t *ptr = malloc(sizeof(zkrb_zoo_aget_children_args_t));
286
+ check_mem(ptr);
287
+
288
+ ptr->rc = rc;
289
+ ptr->zh = zh;
290
+ ptr->path = path;
291
+ ptr->watch = watch;
292
+ ptr->completion = completion;
293
+ ptr->data = data;
294
+
295
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_aget_children, (void *)ptr);
296
+
297
+ rc = ptr->rc;
298
+
299
+ error:
300
+ free(ptr);
301
+ return rc;
302
+ }
303
+
304
+
305
+ static VALUE zkrb_gvl_zoo_awget_children(void *data) {
306
+ zkrb_zoo_awget_children_args_t *a = (zkrb_zoo_awget_children_args_t *)data;
307
+ a->rc = zoo_awget_children(a->zh, a->path, a->watcher, a->watcherCtx, a->completion, a->data);
308
+ return Qnil;
309
+ }
310
+
311
+ // wrapper that calls zoo_awget_children via zkrb_gvl_zoo_awget_children inside rb_thread_blocking_region
312
+ int zkrb_call_zoo_awget_children(zhandle_t *zh, const char *path, watcher_fn watcher, void* watcherCtx, strings_completion_t completion, const void *data) {
313
+ int rc = ZKRB_FAIL;
314
+ zkrb_zoo_awget_children_args_t *ptr = malloc(sizeof(zkrb_zoo_awget_children_args_t));
315
+ check_mem(ptr);
316
+
317
+ ptr->rc = rc;
318
+ ptr->zh = zh;
319
+ ptr->path = path;
320
+ ptr->watcher = watcher;
321
+ ptr->watcherCtx = watcherCtx;
322
+ ptr->completion = completion;
323
+ ptr->data = data;
324
+
325
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_awget_children, (void *)ptr);
326
+
327
+ rc = ptr->rc;
328
+
329
+ error:
330
+ free(ptr);
331
+ return rc;
332
+ }
333
+
334
+
335
+ static VALUE zkrb_gvl_zoo_aget_children2(void *data) {
336
+ zkrb_zoo_aget_children2_args_t *a = (zkrb_zoo_aget_children2_args_t *)data;
337
+ a->rc = zoo_aget_children2(a->zh, a->path, a->watch, a->completion, a->data);
338
+ return Qnil;
339
+ }
340
+
341
+ // wrapper that calls zoo_aget_children2 via zkrb_gvl_zoo_aget_children2 inside rb_thread_blocking_region
342
+ int zkrb_call_zoo_aget_children2(zhandle_t *zh, const char *path, int watch, strings_stat_completion_t completion, const void *data) {
343
+ int rc = ZKRB_FAIL;
344
+ zkrb_zoo_aget_children2_args_t *ptr = malloc(sizeof(zkrb_zoo_aget_children2_args_t));
345
+ check_mem(ptr);
346
+
347
+ ptr->rc = rc;
348
+ ptr->zh = zh;
349
+ ptr->path = path;
350
+ ptr->watch = watch;
351
+ ptr->completion = completion;
352
+ ptr->data = data;
353
+
354
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_aget_children2, (void *)ptr);
355
+
356
+ rc = ptr->rc;
357
+
358
+ error:
359
+ free(ptr);
360
+ return rc;
361
+ }
362
+
363
+
364
+ static VALUE zkrb_gvl_zoo_awget_children2(void *data) {
365
+ zkrb_zoo_awget_children2_args_t *a = (zkrb_zoo_awget_children2_args_t *)data;
366
+ a->rc = zoo_awget_children2(a->zh, a->path, a->watcher, a->watcherCtx, a->completion, a->data);
367
+ return Qnil;
368
+ }
369
+
370
+ // wrapper that calls zoo_awget_children2 via zkrb_gvl_zoo_awget_children2 inside rb_thread_blocking_region
371
+ int zkrb_call_zoo_awget_children2(zhandle_t *zh, const char *path, watcher_fn watcher, void* watcherCtx, strings_stat_completion_t completion, const void *data) {
372
+ int rc = ZKRB_FAIL;
373
+ zkrb_zoo_awget_children2_args_t *ptr = malloc(sizeof(zkrb_zoo_awget_children2_args_t));
374
+ check_mem(ptr);
375
+
376
+ ptr->rc = rc;
377
+ ptr->zh = zh;
378
+ ptr->path = path;
379
+ ptr->watcher = watcher;
380
+ ptr->watcherCtx = watcherCtx;
381
+ ptr->completion = completion;
382
+ ptr->data = data;
383
+
384
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_awget_children2, (void *)ptr);
385
+
386
+ rc = ptr->rc;
387
+
388
+ error:
389
+ free(ptr);
390
+ return rc;
391
+ }
392
+
393
+
394
+ static VALUE zkrb_gvl_zoo_async(void *data) {
395
+ zkrb_zoo_async_args_t *a = (zkrb_zoo_async_args_t *)data;
396
+ a->rc = zoo_async(a->zh, a->path, a->completion, a->data);
397
+ return Qnil;
398
+ }
399
+
400
+ // wrapper that calls zoo_async via zkrb_gvl_zoo_async inside rb_thread_blocking_region
401
+ int zkrb_call_zoo_async(zhandle_t *zh, const char *path, string_completion_t completion, const void *data) {
402
+ int rc = ZKRB_FAIL;
403
+ zkrb_zoo_async_args_t *ptr = malloc(sizeof(zkrb_zoo_async_args_t));
404
+ check_mem(ptr);
405
+
406
+ ptr->rc = rc;
407
+ ptr->zh = zh;
408
+ ptr->path = path;
409
+ ptr->completion = completion;
410
+ ptr->data = data;
411
+
412
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_async, (void *)ptr);
413
+
414
+ rc = ptr->rc;
415
+
416
+ error:
417
+ free(ptr);
418
+ return rc;
419
+ }
420
+
421
+
422
+ static VALUE zkrb_gvl_zoo_aget_acl(void *data) {
423
+ zkrb_zoo_aget_acl_args_t *a = (zkrb_zoo_aget_acl_args_t *)data;
424
+ a->rc = zoo_aget_acl(a->zh, a->path, a->completion, a->data);
425
+ return Qnil;
426
+ }
427
+
428
+ // wrapper that calls zoo_aget_acl via zkrb_gvl_zoo_aget_acl inside rb_thread_blocking_region
429
+ int zkrb_call_zoo_aget_acl(zhandle_t *zh, const char *path, acl_completion_t completion, const void *data) {
430
+ int rc = ZKRB_FAIL;
431
+ zkrb_zoo_aget_acl_args_t *ptr = malloc(sizeof(zkrb_zoo_aget_acl_args_t));
432
+ check_mem(ptr);
433
+
434
+ ptr->rc = rc;
435
+ ptr->zh = zh;
436
+ ptr->path = path;
437
+ ptr->completion = completion;
438
+ ptr->data = data;
439
+
440
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_aget_acl, (void *)ptr);
441
+
442
+ rc = ptr->rc;
443
+
444
+ error:
445
+ free(ptr);
446
+ return rc;
447
+ }
448
+
449
+
450
+ static VALUE zkrb_gvl_zoo_aset_acl(void *data) {
451
+ zkrb_zoo_aset_acl_args_t *a = (zkrb_zoo_aset_acl_args_t *)data;
452
+ a->rc = zoo_aset_acl(a->zh, a->path, a->version, a->acl, a->completion, a->data);
453
+ return Qnil;
454
+ }
455
+
456
+ // wrapper that calls zoo_aset_acl via zkrb_gvl_zoo_aset_acl inside rb_thread_blocking_region
457
+ int zkrb_call_zoo_aset_acl(zhandle_t *zh, const char *path, int version, struct ACL_vector *acl, void_completion_t completion, const void *data) {
458
+ int rc = ZKRB_FAIL;
459
+ zkrb_zoo_aset_acl_args_t *ptr = malloc(sizeof(zkrb_zoo_aset_acl_args_t));
460
+ check_mem(ptr);
461
+
462
+ ptr->rc = rc;
463
+ ptr->zh = zh;
464
+ ptr->path = path;
465
+ ptr->version = version;
466
+ ptr->acl = acl;
467
+ ptr->completion = completion;
468
+ ptr->data = data;
469
+
470
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_aset_acl, (void *)ptr);
471
+
472
+ rc = ptr->rc;
473
+
474
+ error:
475
+ free(ptr);
476
+ return rc;
477
+ }
478
+
479
+
480
+ static VALUE zkrb_gvl_zoo_add_auth(void *data) {
481
+ zkrb_zoo_add_auth_args_t *a = (zkrb_zoo_add_auth_args_t *)data;
482
+ a->rc = zoo_add_auth(a->zh, a->scheme, a->cert, a->certLen, a->completion, a->data);
483
+ return Qnil;
484
+ }
485
+
486
+ // wrapper that calls zoo_add_auth via zkrb_gvl_zoo_add_auth inside rb_thread_blocking_region
487
+ int zkrb_call_zoo_add_auth(zhandle_t *zh, const char* scheme, const char* cert, int certLen, void_completion_t completion, const void *data) {
488
+ int rc = ZKRB_FAIL;
489
+ zkrb_zoo_add_auth_args_t *ptr = malloc(sizeof(zkrb_zoo_add_auth_args_t));
490
+ check_mem(ptr);
491
+
492
+ ptr->rc = rc;
493
+ ptr->zh = zh;
494
+ ptr->scheme = scheme;
495
+ ptr->cert = cert;
496
+ ptr->certLen = certLen;
497
+ ptr->completion = completion;
498
+ ptr->data = data;
499
+
500
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_add_auth, (void *)ptr);
501
+
502
+ rc = ptr->rc;
503
+
504
+ error:
505
+ free(ptr);
506
+ return rc;
507
+ }
508
+
509
+
510
+ static VALUE zkrb_gvl_zoo_create(void *data) {
511
+ zkrb_zoo_create_args_t *a = (zkrb_zoo_create_args_t *)data;
512
+ a->rc = zoo_create(a->zh, a->path, a->value, a->valuelen, a->acl, a->flags, a->path_buffer, a->path_buffer_len);
513
+ return Qnil;
514
+ }
515
+
516
+ // wrapper that calls zoo_create via zkrb_gvl_zoo_create inside rb_thread_blocking_region
517
+ int zkrb_call_zoo_create(zhandle_t *zh, const char *path, const char *value, int valuelen, const struct ACL_vector *acl, int flags, char *path_buffer, int path_buffer_len) {
518
+ int rc = ZKRB_FAIL;
519
+ zkrb_zoo_create_args_t *ptr = malloc(sizeof(zkrb_zoo_create_args_t));
520
+ check_mem(ptr);
521
+
522
+ ptr->rc = rc;
523
+ ptr->zh = zh;
524
+ ptr->path = path;
525
+ ptr->value = value;
526
+ ptr->valuelen = valuelen;
527
+ ptr->acl = acl;
528
+ ptr->flags = flags;
529
+ ptr->path_buffer = path_buffer;
530
+ ptr->path_buffer_len = path_buffer_len;
531
+
532
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_create, (void *)ptr);
533
+
534
+ rc = ptr->rc;
535
+
536
+ error:
537
+ free(ptr);
538
+ return rc;
539
+ }
540
+
541
+
542
+ static VALUE zkrb_gvl_zoo_delete(void *data) {
543
+ zkrb_zoo_delete_args_t *a = (zkrb_zoo_delete_args_t *)data;
544
+ a->rc = zoo_delete(a->zh, a->path, a->version);
545
+ return Qnil;
546
+ }
547
+
548
+ // wrapper that calls zoo_delete via zkrb_gvl_zoo_delete inside rb_thread_blocking_region
549
+ int zkrb_call_zoo_delete(zhandle_t *zh, const char *path, int version) {
550
+ int rc = ZKRB_FAIL;
551
+ zkrb_zoo_delete_args_t *ptr = malloc(sizeof(zkrb_zoo_delete_args_t));
552
+ check_mem(ptr);
553
+
554
+ ptr->rc = rc;
555
+ ptr->zh = zh;
556
+ ptr->path = path;
557
+ ptr->version = version;
558
+
559
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_delete, (void *)ptr);
560
+
561
+ rc = ptr->rc;
562
+
563
+ error:
564
+ free(ptr);
565
+ return rc;
566
+ }
567
+
568
+
569
+ static VALUE zkrb_gvl_zoo_exists(void *data) {
570
+ zkrb_zoo_exists_args_t *a = (zkrb_zoo_exists_args_t *)data;
571
+ a->rc = zoo_exists(a->zh, a->path, a->watch, a->stat);
572
+ return Qnil;
573
+ }
574
+
575
+ // wrapper that calls zoo_exists via zkrb_gvl_zoo_exists inside rb_thread_blocking_region
576
+ int zkrb_call_zoo_exists(zhandle_t *zh, const char *path, int watch, struct Stat *stat) {
577
+ int rc = ZKRB_FAIL;
578
+ zkrb_zoo_exists_args_t *ptr = malloc(sizeof(zkrb_zoo_exists_args_t));
579
+ check_mem(ptr);
580
+
581
+ ptr->rc = rc;
582
+ ptr->zh = zh;
583
+ ptr->path = path;
584
+ ptr->watch = watch;
585
+ ptr->stat = stat;
586
+
587
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_exists, (void *)ptr);
588
+
589
+ rc = ptr->rc;
590
+
591
+ error:
592
+ free(ptr);
593
+ return rc;
594
+ }
595
+
596
+
597
+ static VALUE zkrb_gvl_zoo_wexists(void *data) {
598
+ zkrb_zoo_wexists_args_t *a = (zkrb_zoo_wexists_args_t *)data;
599
+ a->rc = zoo_wexists(a->zh, a->path, a->watcher, a->watcherCtx, a->stat);
600
+ return Qnil;
601
+ }
602
+
603
+ // wrapper that calls zoo_wexists via zkrb_gvl_zoo_wexists inside rb_thread_blocking_region
604
+ int zkrb_call_zoo_wexists(zhandle_t *zh, const char *path, watcher_fn watcher, void* watcherCtx, struct Stat *stat) {
605
+ int rc = ZKRB_FAIL;
606
+ zkrb_zoo_wexists_args_t *ptr = malloc(sizeof(zkrb_zoo_wexists_args_t));
607
+ check_mem(ptr);
608
+
609
+ ptr->rc = rc;
610
+ ptr->zh = zh;
611
+ ptr->path = path;
612
+ ptr->watcher = watcher;
613
+ ptr->watcherCtx = watcherCtx;
614
+ ptr->stat = stat;
615
+
616
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_wexists, (void *)ptr);
617
+
618
+ rc = ptr->rc;
619
+
620
+ error:
621
+ free(ptr);
622
+ return rc;
623
+ }
624
+
625
+
626
+ static VALUE zkrb_gvl_zoo_get(void *data) {
627
+ zkrb_zoo_get_args_t *a = (zkrb_zoo_get_args_t *)data;
628
+ a->rc = zoo_get(a->zh, a->path, a->watch, a->buffer, a->buffer_len, a->stat);
629
+ return Qnil;
630
+ }
631
+
632
+ // wrapper that calls zoo_get via zkrb_gvl_zoo_get inside rb_thread_blocking_region
633
+ int zkrb_call_zoo_get(zhandle_t *zh, const char *path, int watch, char *buffer, int* buffer_len, struct Stat *stat) {
634
+ int rc = ZKRB_FAIL;
635
+ zkrb_zoo_get_args_t *ptr = malloc(sizeof(zkrb_zoo_get_args_t));
636
+ check_mem(ptr);
637
+
638
+ ptr->rc = rc;
639
+ ptr->zh = zh;
640
+ ptr->path = path;
641
+ ptr->watch = watch;
642
+ ptr->buffer = buffer;
643
+ ptr->buffer_len = buffer_len;
644
+ ptr->stat = stat;
645
+
646
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_get, (void *)ptr);
647
+
648
+ rc = ptr->rc;
649
+
650
+ error:
651
+ free(ptr);
652
+ return rc;
653
+ }
654
+
655
+
656
+ static VALUE zkrb_gvl_zoo_wget(void *data) {
657
+ zkrb_zoo_wget_args_t *a = (zkrb_zoo_wget_args_t *)data;
658
+ a->rc = zoo_wget(a->zh, a->path, a->watcher, a->watcherCtx, a->buffer, a->buffer_len, a->stat);
659
+ return Qnil;
660
+ }
661
+
662
+ // wrapper that calls zoo_wget via zkrb_gvl_zoo_wget inside rb_thread_blocking_region
663
+ int zkrb_call_zoo_wget(zhandle_t *zh, const char *path, watcher_fn watcher, void* watcherCtx, char *buffer, int* buffer_len, struct Stat *stat) {
664
+ int rc = ZKRB_FAIL;
665
+ zkrb_zoo_wget_args_t *ptr = malloc(sizeof(zkrb_zoo_wget_args_t));
666
+ check_mem(ptr);
667
+
668
+ ptr->rc = rc;
669
+ ptr->zh = zh;
670
+ ptr->path = path;
671
+ ptr->watcher = watcher;
672
+ ptr->watcherCtx = watcherCtx;
673
+ ptr->buffer = buffer;
674
+ ptr->buffer_len = buffer_len;
675
+ ptr->stat = stat;
676
+
677
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_wget, (void *)ptr);
678
+
679
+ rc = ptr->rc;
680
+
681
+ error:
682
+ free(ptr);
683
+ return rc;
684
+ }
685
+
686
+
687
+ static VALUE zkrb_gvl_zoo_set(void *data) {
688
+ zkrb_zoo_set_args_t *a = (zkrb_zoo_set_args_t *)data;
689
+ a->rc = zoo_set(a->zh, a->path, a->buffer, a->buflen, a->version);
690
+ return Qnil;
691
+ }
692
+
693
+ // wrapper that calls zoo_set via zkrb_gvl_zoo_set inside rb_thread_blocking_region
694
+ int zkrb_call_zoo_set(zhandle_t *zh, const char *path, const char *buffer, int buflen, int version) {
695
+ int rc = ZKRB_FAIL;
696
+ zkrb_zoo_set_args_t *ptr = malloc(sizeof(zkrb_zoo_set_args_t));
697
+ check_mem(ptr);
698
+
699
+ ptr->rc = rc;
700
+ ptr->zh = zh;
701
+ ptr->path = path;
702
+ ptr->buffer = buffer;
703
+ ptr->buflen = buflen;
704
+ ptr->version = version;
705
+
706
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_set, (void *)ptr);
707
+
708
+ rc = ptr->rc;
709
+
710
+ error:
711
+ free(ptr);
712
+ return rc;
713
+ }
714
+
715
+
716
+ static VALUE zkrb_gvl_zoo_set2(void *data) {
717
+ zkrb_zoo_set2_args_t *a = (zkrb_zoo_set2_args_t *)data;
718
+ a->rc = zoo_set2(a->zh, a->path, a->buffer, a->buflen, a->version, a->stat);
719
+ return Qnil;
720
+ }
721
+
722
+ // wrapper that calls zoo_set2 via zkrb_gvl_zoo_set2 inside rb_thread_blocking_region
723
+ int zkrb_call_zoo_set2(zhandle_t *zh, const char *path, const char *buffer, int buflen, int version, struct Stat *stat) {
724
+ int rc = ZKRB_FAIL;
725
+ zkrb_zoo_set2_args_t *ptr = malloc(sizeof(zkrb_zoo_set2_args_t));
726
+ check_mem(ptr);
727
+
728
+ ptr->rc = rc;
729
+ ptr->zh = zh;
730
+ ptr->path = path;
731
+ ptr->buffer = buffer;
732
+ ptr->buflen = buflen;
733
+ ptr->version = version;
734
+ ptr->stat = stat;
735
+
736
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_set2, (void *)ptr);
737
+
738
+ rc = ptr->rc;
739
+
740
+ error:
741
+ free(ptr);
742
+ return rc;
743
+ }
744
+
745
+
746
+ static VALUE zkrb_gvl_zoo_get_children(void *data) {
747
+ zkrb_zoo_get_children_args_t *a = (zkrb_zoo_get_children_args_t *)data;
748
+ a->rc = zoo_get_children(a->zh, a->path, a->watch, a->strings);
749
+ return Qnil;
750
+ }
751
+
752
+ // wrapper that calls zoo_get_children via zkrb_gvl_zoo_get_children inside rb_thread_blocking_region
753
+ int zkrb_call_zoo_get_children(zhandle_t *zh, const char *path, int watch, struct String_vector *strings) {
754
+ int rc = ZKRB_FAIL;
755
+ zkrb_zoo_get_children_args_t *ptr = malloc(sizeof(zkrb_zoo_get_children_args_t));
756
+ check_mem(ptr);
757
+
758
+ ptr->rc = rc;
759
+ ptr->zh = zh;
760
+ ptr->path = path;
761
+ ptr->watch = watch;
762
+ ptr->strings = strings;
763
+
764
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_get_children, (void *)ptr);
765
+
766
+ rc = ptr->rc;
767
+
768
+ error:
769
+ free(ptr);
770
+ return rc;
771
+ }
772
+
773
+
774
+ static VALUE zkrb_gvl_zoo_wget_children(void *data) {
775
+ zkrb_zoo_wget_children_args_t *a = (zkrb_zoo_wget_children_args_t *)data;
776
+ a->rc = zoo_wget_children(a->zh, a->path, a->watcher, a->watcherCtx, a->strings);
777
+ return Qnil;
778
+ }
779
+
780
+ // wrapper that calls zoo_wget_children via zkrb_gvl_zoo_wget_children inside rb_thread_blocking_region
781
+ int zkrb_call_zoo_wget_children(zhandle_t *zh, const char *path, watcher_fn watcher, void* watcherCtx, struct String_vector *strings) {
782
+ int rc = ZKRB_FAIL;
783
+ zkrb_zoo_wget_children_args_t *ptr = malloc(sizeof(zkrb_zoo_wget_children_args_t));
784
+ check_mem(ptr);
785
+
786
+ ptr->rc = rc;
787
+ ptr->zh = zh;
788
+ ptr->path = path;
789
+ ptr->watcher = watcher;
790
+ ptr->watcherCtx = watcherCtx;
791
+ ptr->strings = strings;
792
+
793
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_wget_children, (void *)ptr);
794
+
795
+ rc = ptr->rc;
796
+
797
+ error:
798
+ free(ptr);
799
+ return rc;
800
+ }
801
+
802
+
803
+ static VALUE zkrb_gvl_zoo_get_children2(void *data) {
804
+ zkrb_zoo_get_children2_args_t *a = (zkrb_zoo_get_children2_args_t *)data;
805
+ a->rc = zoo_get_children2(a->zh, a->path, a->watch, a->strings, a->stat);
806
+ return Qnil;
807
+ }
808
+
809
+ // wrapper that calls zoo_get_children2 via zkrb_gvl_zoo_get_children2 inside rb_thread_blocking_region
810
+ int zkrb_call_zoo_get_children2(zhandle_t *zh, const char *path, int watch, struct String_vector *strings, struct Stat *stat) {
811
+ int rc = ZKRB_FAIL;
812
+ zkrb_zoo_get_children2_args_t *ptr = malloc(sizeof(zkrb_zoo_get_children2_args_t));
813
+ check_mem(ptr);
814
+
815
+ ptr->rc = rc;
816
+ ptr->zh = zh;
817
+ ptr->path = path;
818
+ ptr->watch = watch;
819
+ ptr->strings = strings;
820
+ ptr->stat = stat;
821
+
822
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_get_children2, (void *)ptr);
823
+
824
+ rc = ptr->rc;
825
+
826
+ error:
827
+ free(ptr);
828
+ return rc;
829
+ }
830
+
831
+
832
+ static VALUE zkrb_gvl_zoo_wget_children2(void *data) {
833
+ zkrb_zoo_wget_children2_args_t *a = (zkrb_zoo_wget_children2_args_t *)data;
834
+ a->rc = zoo_wget_children2(a->zh, a->path, a->watcher, a->watcherCtx, a->strings, a->stat);
835
+ return Qnil;
836
+ }
837
+
838
+ // wrapper that calls zoo_wget_children2 via zkrb_gvl_zoo_wget_children2 inside rb_thread_blocking_region
839
+ int zkrb_call_zoo_wget_children2(zhandle_t *zh, const char *path, watcher_fn watcher, void* watcherCtx, struct String_vector *strings, struct Stat *stat) {
840
+ int rc = ZKRB_FAIL;
841
+ zkrb_zoo_wget_children2_args_t *ptr = malloc(sizeof(zkrb_zoo_wget_children2_args_t));
842
+ check_mem(ptr);
843
+
844
+ ptr->rc = rc;
845
+ ptr->zh = zh;
846
+ ptr->path = path;
847
+ ptr->watcher = watcher;
848
+ ptr->watcherCtx = watcherCtx;
849
+ ptr->strings = strings;
850
+ ptr->stat = stat;
851
+
852
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_wget_children2, (void *)ptr);
853
+
854
+ rc = ptr->rc;
855
+
856
+ error:
857
+ free(ptr);
858
+ return rc;
859
+ }
860
+
861
+
862
+ static VALUE zkrb_gvl_zoo_get_acl(void *data) {
863
+ zkrb_zoo_get_acl_args_t *a = (zkrb_zoo_get_acl_args_t *)data;
864
+ a->rc = zoo_get_acl(a->zh, a->path, a->acl, a->stat);
865
+ return Qnil;
866
+ }
867
+
868
+ // wrapper that calls zoo_get_acl via zkrb_gvl_zoo_get_acl inside rb_thread_blocking_region
869
+ int zkrb_call_zoo_get_acl(zhandle_t *zh, const char *path, struct ACL_vector *acl, struct Stat *stat) {
870
+ int rc = ZKRB_FAIL;
871
+ zkrb_zoo_get_acl_args_t *ptr = malloc(sizeof(zkrb_zoo_get_acl_args_t));
872
+ check_mem(ptr);
873
+
874
+ ptr->rc = rc;
875
+ ptr->zh = zh;
876
+ ptr->path = path;
877
+ ptr->acl = acl;
878
+ ptr->stat = stat;
879
+
880
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_get_acl, (void *)ptr);
881
+
882
+ rc = ptr->rc;
883
+
884
+ error:
885
+ free(ptr);
886
+ return rc;
887
+ }
888
+
889
+
890
+ static VALUE zkrb_gvl_zoo_set_acl(void *data) {
891
+ zkrb_zoo_set_acl_args_t *a = (zkrb_zoo_set_acl_args_t *)data;
892
+ a->rc = zoo_set_acl(a->zh, a->path, a->version, a->acl);
893
+ return Qnil;
894
+ }
895
+
896
+ // wrapper that calls zoo_set_acl via zkrb_gvl_zoo_set_acl inside rb_thread_blocking_region
897
+ int zkrb_call_zoo_set_acl(zhandle_t *zh, const char *path, int version, const struct ACL_vector *acl) {
898
+ int rc = ZKRB_FAIL;
899
+ zkrb_zoo_set_acl_args_t *ptr = malloc(sizeof(zkrb_zoo_set_acl_args_t));
900
+ check_mem(ptr);
901
+
902
+ ptr->rc = rc;
903
+ ptr->zh = zh;
904
+ ptr->path = path;
905
+ ptr->version = version;
906
+ ptr->acl = acl;
907
+
908
+ zkrb_thread_blocking_region(zkrb_gvl_zoo_set_acl, (void *)ptr);
909
+
910
+ rc = ptr->rc;
911
+
912
+ error:
913
+ free(ptr);
914
+ return rc;
915
+ }
916
+
917
+