xbad 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/ext/xbad/xbad.c +22 -15
  3. data/ext/xbad/xbad.h +24 -13
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3b040f5e82df3f21ac0c18bc8cfb6fbd8d21ce3e
4
- data.tar.gz: 496906d81a204a7a1493a8e65bf4eb1cd9c7a4de
3
+ metadata.gz: 9fafb42bcbc0fa8b8439fe6f2c08acf8c0957c64
4
+ data.tar.gz: dda1a795814fd9a98b88061bd8ffa7f0fa36bd82
5
5
  SHA512:
6
- metadata.gz: 155170d26a537e7431b9e023e3f239c7fc681045282f35a291883f9470f039f5ff915c3b59c16a691700df4ebf58b3182591328d2554edeeca4ab0b987f35aff
7
- data.tar.gz: e80f0b09863a03719ff46086aa7349045a4b88f239453c69eecef64e3af3f3fafae5e341ec6b6b4f3a8680363b0fdf49427ea5d906dd0845a0bd0e85ec875dcf
6
+ metadata.gz: 3c533eaab413ff1462f5880e4b8fd61a37b884dfb222e6ed1ba0d6e632659ea7c9f18de1f59f5eb33798ac8b3d7e67bf631e0964e04980f64eb6e50407c3eb47
7
+ data.tar.gz: 51ced76814b9bb55743d78f51f2e07d3c365758d5eb93e96aafde2da37e8de0a95cc5def07f1224362efe1144e96da0ef9171e8766682ea4fb2c6b25eec3c087
@@ -4,21 +4,26 @@
4
4
  #include "xbad.h"
5
5
 
6
6
 
7
- static VALUE XBAD_init(VALUE class, VALUE _shmid, VALUE _hash_bits, VALUE _item_size ) {
8
- int shmid = NUM2INT(_shmid);
9
- int item_size = NUM2INT(_item_size);
10
- int hash_bits = NUM2INT(_hash_bits);
11
- struct shared_pool *p = shared_pool_init(shmid,hash_bits,item_size);
12
- VALUE sp = Data_Wrap_Struct(class, 0, shared_pool_destroy, p);
13
- return sp;
14
- }
15
-
16
- inline struct shared_pool *shared_pool(VALUE obj) {
7
+ inline struct shared_pool *get_shared_pool(VALUE obj) {
17
8
  struct shared_pool *sp;
18
9
  Data_Get_Struct(obj,struct shared_pool, sp);
19
10
  return sp;
20
11
  }
21
12
 
13
+ static VALUE XBAD_alloc(VALUE class) {
14
+ struct shared_pool *p = shared_pool_alloc();
15
+ return Data_Wrap_Struct(class, 0, shared_pool_destroy, p);
16
+ }
17
+
18
+ static VALUE XBAD_init(VALUE self, VALUE _shmid, VALUE _hash_bits, VALUE _item_size ) {
19
+ int shmid = NUM2INT(_shmid);
20
+ int item_size = NUM2INT(_item_size);
21
+ int hash_bits = NUM2INT(_hash_bits);
22
+ struct shared_pool *sp = get_shared_pool(self);
23
+ shared_pool_init(sp,shmid,hash_bits,item_size);
24
+ return self;
25
+ }
26
+
22
27
  static inline void die_unless_string(VALUE x) {
23
28
  if (TYPE(x) != T_STRING)
24
29
  rb_raise(rb_eTypeError, "invalid type for input %s",rb_obj_classname(x));
@@ -27,7 +32,7 @@ static inline void die_unless_string(VALUE x) {
27
32
  static VALUE XBAD_store(VALUE self, VALUE key, VALUE value, VALUE _expire_after) {
28
33
  die_unless_string(key);
29
34
  die_unless_string(value);
30
- struct shared_pool *sp = shared_pool(self);
35
+ struct shared_pool *sp = get_shared_pool(self);
31
36
  int expire_after = NUM2INT(_expire_after);
32
37
  if (t_add(sp,RSTRING_PTR(key),RSTRING_LEN(key),RSTRING_PTR(value),RSTRING_LEN(value),expire_after) != 0)
33
38
  rb_raise(rb_eArgError,"failed to store");
@@ -37,7 +42,7 @@ static VALUE XBAD_store(VALUE self, VALUE key, VALUE value, VALUE _expire_after)
37
42
  static VALUE XBAD_store_and_broadcast(VALUE self, VALUE key, VALUE value, VALUE _expire_after,VALUE _port) {
38
43
  die_unless_string(key);
39
44
  die_unless_string(value);
40
- struct shared_pool *sp = shared_pool(self);
45
+ struct shared_pool *sp = get_shared_pool(self);
41
46
  int expire_after = NUM2INT(_expire_after);
42
47
  unsigned short port = NUM2INT(_port);
43
48
  struct in_addr ip = { .s_addr = htonl(0xffffffff) };
@@ -49,7 +54,7 @@ static VALUE XBAD_store_and_broadcast(VALUE self, VALUE key, VALUE value, VALUE
49
54
 
50
55
  static VALUE XBAD_find(VALUE self, VALUE key) {
51
56
  VALUE ret = Qnil;
52
- struct shared_pool *sp = shared_pool(self);
57
+ struct shared_pool *sp = get_shared_pool(self);
53
58
  struct item *item = t_find_and_lock(sp,RSTRING_PTR(key),RSTRING_LEN(key));
54
59
  if (item) {
55
60
  ret = rb_str_new(ITEM_BLOB(item),item->blob_len);
@@ -59,14 +64,16 @@ static VALUE XBAD_find(VALUE self, VALUE key) {
59
64
  }
60
65
 
61
66
  static VALUE XBAD_reset(VALUE self) {
62
- struct shared_pool *sp = shared_pool(self);
67
+ struct shared_pool *sp = get_shared_pool(self);
63
68
  shared_pool_reset(sp);
64
69
  return Qtrue;
65
70
  }
66
71
 
67
72
  void Init_xbad() {
68
73
  VALUE c = rb_define_class("XBAD", rb_cObject);
69
- rb_define_singleton_method(c, "create", RUBY_METHOD_FUNC(XBAD_init), 3);
74
+ rb_define_alloc_func(c, XBAD_alloc);
75
+ rb_define_method(c, "initialize", XBAD_init, 3);
76
+ //rb_define_singleton_method(c, "initialize", RUBY_METHOD_FUNC(XBAD_init), 3);
70
77
  rb_define_method(c, "find", XBAD_find, 1);
71
78
  rb_define_method(c, "store", XBAD_store, 3);
72
79
  rb_define_method(c, "store_and_broadcast", XBAD_store_and_broadcast, 4);
@@ -191,15 +191,20 @@ static void t_bind_and_wait_for_updates(struct shared_pool *sp, struct in_addr i
191
191
  }
192
192
  }
193
193
 
194
- static struct shared_pool *shared_pool_init(int key, int hash_bits, int item_size) {
194
+ static struct shared_pool *shared_pool_alloc(void) {
195
+ struct shared_pool *sp;
196
+ BAD_ALLOC(sp,struct shared_pool);
197
+ memset(sp,0,sizeof(*sp));
198
+ return sp;
199
+ }
200
+
201
+ static struct shared_pool *shared_pool_init(struct shared_pool *sp, int key, int hash_bits, int item_size) {
195
202
  if (hash_bits < 16 || hash_bits > 32 )
196
203
  SAYX("hash bits must be between 16 and 32");
197
204
 
198
205
  if (item_size <= sizeof(struct item))
199
206
  SAYX("item size must be at least %zu",sizeof(struct item));
200
207
 
201
- struct shared_pool *sp;
202
- BAD_ALLOC(sp,struct shared_pool);
203
208
  sp->c_sock = 0;
204
209
  sp->s_sock = 0;
205
210
  sp->pool = NULL;
@@ -220,6 +225,10 @@ static struct shared_pool *shared_pool_init(int key, int hash_bits, int item_siz
220
225
  return sp;
221
226
  }
222
227
 
228
+ static struct shared_pool *shared_pool_alloc_and_init(int key, int hash_bits, int item_size) {
229
+ struct shared_pool *sp = shared_pool_alloc();
230
+ return shared_pool_init(sp,key,hash_bits,item_size);
231
+ }
223
232
  static void shared_pool_reset(struct shared_pool *sp) {
224
233
  int i;
225
234
  for (i = 0; i < sp->hash_mask + 1; i++) {
@@ -257,16 +266,18 @@ static void shared_pool_blind_guardian(struct shared_pool *sp, int interval_us,i
257
266
  }
258
267
 
259
268
  static void shared_pool_destroy(struct shared_pool *sp) {
260
- if (shmdt(sp->pool) != 0)
261
- SAYPX("detach failed");
262
-
263
- struct shmid_ds ds;
264
-
265
- if (shmctl(sp->shm_id, IPC_STAT, &ds) != 0)
266
- SAYPX("IPC_STAT failed");
267
- if (ds.shm_nattch == 0) {
268
- if (shmctl(sp->shm_id, IPC_RMID, NULL) != 0)
269
- SAYPX("IPC_RMID failed on shm_id %d",sp->shm_id);
269
+ if (sp->pool) {
270
+ if (shmdt(sp->pool) != 0)
271
+ SAYPX("detach failed");
272
+
273
+ struct shmid_ds ds;
274
+
275
+ if (shmctl(sp->shm_id, IPC_STAT, &ds) != 0)
276
+ SAYPX("IPC_STAT failed");
277
+ if (ds.shm_nattch == 0) {
278
+ if (shmctl(sp->shm_id, IPC_RMID, NULL) != 0)
279
+ SAYPX("IPC_RMID failed on shm_id %d",sp->shm_id);
280
+ }
270
281
  }
271
282
  BAD_FREE(sp);
272
283
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xbad
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Borislav Nikolov