DTS Application Library  0.2.3
Application library containing referenced objects and interfaces to common libraries
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
Referenced Lockable Objects

Utilities for managing referenced lockable objects. More...

Modules

 Hashed bucket linked lists of referenced objects
 Store references in and retrive from linked lists based on a hash.
 

Files

file  refobj.c
 Referenced Lockable Objects.
 

Data Structures

struct  ref_obj
 Internal structure of all referenced objects. More...
 

Macros

#define clearflag(obj, flag)
 Atomically clear a flag in the flags field of a referenced object. More...
 
#define setflag(obj, flag)
 Atomically set a flag in the flags field of a referenced object. More...
 
#define testflag(obj, flag)   (objlock(obj) | (obj->flags & flag) | objunlock(obj))
 Atomically test a flag in the flags field of a referenced object. More...
 
#define DTS_OJBREF_CLASS(classtype)
 Add this macro to a C++ class to add refobj support. More...
 
#define REFOBJ_MAGIC   0xdeadc0de
 Magic number stored as first field of all referenced objects. More...
 
#define refobj_offset   sizeof(struct ref_obj);
 The size of ref_obj is the offset for the data. More...
 

Typedefs

typedef void(* objdestroy )(void *)
 Callback used to clean data of a reference object when it is to be freed. More...
 

Functions

void * objalloc (int size, objdestroy destructor)
 Allocate a referenced lockable object. More...
 
int objref (void *data)
 Reference a object. More...
 
int objunref (void *data)
 Drop reference held. More...
 
int objcnt (void *data)
 Return current reference count. More...
 
int objsize (void *data)
 Size requested for data. More...
 
int objlock (void *data)
 Lock the reference. More...
 
int objtrylock (void *data)
 Try lock a reference. More...
 
int objunlock (void *data)
 Unlock a reference. More...
 
void * objchar (const char *orig)
 Return a reference to copy of a buffer. More...
 

Detailed Description

Utilities for managing referenced lockable objects.

See Also
Referenced Lockable Objects

Macro Definition Documentation

#define clearflag (   obj,
  flag 
)
Value:
objlock(obj);\
obj->flags &= ~flag;\
int objlock(void *data)
Lock the reference.
Definition: refobj.c:269
int objunlock(void *data)
Unlock a reference.
Definition: refobj.c:301

Atomically clear a flag in the flags field of a referenced object.

Definition at line 918 of file dtsapp.h.

#define DTS_OJBREF_CLASS (   classtype)
Value:
void *operator new(size_t sz) {\
return objalloc(sz, &classtype::dts_unref_classtype);\
}\
void operator delete(void *obj) {\
}\
static void dts_unref_classtype(void *data) {\
delete (classtype*)data;\
}\
~classtype()
void * objalloc(int size, objdestroy)
Allocate a referenced lockable object.
Definition: refobj.c:129

Add this macro to a C++ class to add refobj support.

This macro defines operator overloads for new/delete and declares a destructor.

Note
this should not be used with inheritance

Definition at line 976 of file dtsapp.h.

#define REFOBJ_MAGIC   0xdeadc0de

Magic number stored as first field of all referenced objects.

Definition at line 34 of file refobj.c.

Referenced by objalloc(), objcnt(), objlock(), objref(), objsize(), objtrylock(), objunlock(), and objunref().

#define refobj_offset   sizeof(struct ref_obj);

The size of ref_obj is the offset for the data.

Definition at line 119 of file refobj.c.

Referenced by addtobucket(), objalloc(), objcnt(), objlock(), objref(), objsize(), objtrylock(), objunlock(), and objunref().

#define setflag (   obj,
  flag 
)
Value:
objlock(obj);\
obj->flags |= flag; \
int objlock(void *data)
Lock the reference.
Definition: refobj.c:269
int objunlock(void *data)
Unlock a reference.
Definition: refobj.c:301

Atomically set a flag in the flags field of a referenced object.

Definition at line 925 of file dtsapp.h.

Referenced by close_socket(), dtls_listenssl(), framework_mkthread(), jointhreads(), nf_ctrack_endtrace(), socketwrite_d(), stopthreads(), and tlsaccept().

#define testflag (   obj,
  flag 
)    (objlock(obj) | (obj->flags & flag) | objunlock(obj))

Atomically test a flag in the flags field of a referenced object.

Definition at line 932 of file dtsapp.h.

Referenced by framework_mkthread(), framework_threadok(), socketread_d(), and socketwrite_d().

Typedef Documentation

typedef void(* objdestroy)(void *)

Callback used to clean data of a reference object when it is to be freed.

Parameters
dataData held by reference about to be freed.

Definition at line 264 of file dtsapp.h.

Function Documentation

void* objalloc ( int  size,
objdestroy  destructor 
)

Allocate a referenced lockable object.

Use malloc to allocate memory to contain the data lock and reference the lock is initialised magic and reference set. The data begins at the end of the ref_obj set a pointer to it and return.

Parameters
sizeSize of the data buffer to allocate in addition to the reference.
destructorFunction called before the memory is freed to cleanup.
Returns
Pointer to a data buffer size big.

Definition at line 129 of file refobj.c.

References ref_obj::cnt, ref_obj::data, ref_obj::destroy, ref_obj::lock, ref_obj::magic, REFOBJ_MAGIC, refobj_offset, and ref_obj::size.

Referenced by accept_socket(), add_radserver(), b64enc_buf(), create_bucketlist(), create_kernmac(), create_kernvlan(), curl_newauth(), curl_newpost(), curl_setauth_cb(), curl_setprogress(), curlinit(), dtls_listenssl(), framework_mkcore(), framework_mkthread(), get_ifinfo(), init_bucket_loop(), ldap_addinit(), ldap_connect(), ldap_modifyinit(), ldap_saslbind(), ldap_simplebind(), make_socket(), nfqueue_attach(), objchar(), rfc6296_map_add(), set_interface_addr(), set_interface_flags(), set_interface_ipaddr(), set_interface_name(), startthreads(), tlsaccept(), unixsocket_server(), xml_doctobuffer(), xml_getfirstnode(), xml_init(), xml_loadbuf(), xml_loaddoc(), xml_xpath(), xslt_addparam(), xslt_apply_buffer(), xslt_init(), xslt_open(), and zcompress().

129  {
130  struct ref_obj *ref;
131  int asize;
132  char *robj;
133 
134  asize = size + refobj_offset;
135 
136  if ((robj = malloc(asize))) {
137  memset(robj, 0, asize);
138  ref = (struct ref_obj *)robj;
139  pthread_mutex_init(&ref->lock, NULL);
140  ref->magic = REFOBJ_MAGIC;
141  ref->cnt = 1;
142  ref->data = robj + refobj_offset;
143  ref->size = asize;
144  ref->destroy = destructor;
145  return (ref->data);
146  }
147  return NULL;
148 }
#define refobj_offset
The size of ref_obj is the offset for the data.
Definition: refobj.c:119
objdestroy destroy
Function to call to clean up the data before its freed.
Definition: refobj.c:52
Internal structure of all referenced objects.
Definition: refobj.c:38
void * data
Pointer to the data referenced.
Definition: refobj.c:54
#define REFOBJ_MAGIC
Magic number stored as first field of all referenced objects.
Definition: refobj.c:34
size_t size
The size allocated to this object.
Definition: refobj.c:48
uint32_t magic
Memory integrity check used to prevent non refeferenced objects been handled as referenced objects...
Definition: refobj.c:42
uint32_t cnt
Reference count the oject will be freed when the reference count reaches 0.
Definition: refobj.c:45
pthread_mutex_t lock
this is a pointer to the lock it may be changed to be the lock
Definition: refobj.c:50
void* objchar ( const char *  orig)

Return a reference to copy of a buffer.

Parameters
origOriginal buffer to copy.
Returns
Reference to new instance of orig.

Definition at line 330 of file refobj.c.

References objalloc().

330  {
331  int len = strlen(orig) + 1;
332  void *nobj;
333 
334  if ((nobj = objalloc(len, NULL))) {
335  memcpy(nobj, orig, len);
336  }
337  return nobj;
338 }
void * objalloc(int size, objdestroy)
Allocate a referenced lockable object.
Definition: refobj.c:129
int objcnt ( void *  data)

Return current reference count.

Parameters
dataPointer to determine active reference count.
Returns
-1 on error or the current count.

Definition at line 222 of file refobj.c.

References ref_obj::cnt, ref_obj::data, ref_obj::lock, ref_obj::magic, REFOBJ_MAGIC, and refobj_offset.

Referenced by ldap_unref_attr(), and ldap_unref_entry().

222  {
223  char *ptr = data;
224  int ret = -1;
225  struct ref_obj *ref;
226 
227  if (!data) {
228  return (ret);
229  }
230 
231  ptr = ptr - refobj_offset;
232  ref = (struct ref_obj *)ptr;
233 
234  if (ref->magic == REFOBJ_MAGIC) {
235  pthread_mutex_lock(&ref->lock);
236  ret = ref->cnt;
237  pthread_mutex_unlock(&ref->lock);
238  }
239  return (ret);
240 }
#define refobj_offset
The size of ref_obj is the offset for the data.
Definition: refobj.c:119
Internal structure of all referenced objects.
Definition: refobj.c:38
void * data
Pointer to the data referenced.
Definition: refobj.c:54
#define REFOBJ_MAGIC
Magic number stored as first field of all referenced objects.
Definition: refobj.c:34
uint32_t magic
Memory integrity check used to prevent non refeferenced objects been handled as referenced objects...
Definition: refobj.c:42
uint32_t cnt
Reference count the oject will be freed when the reference count reaches 0.
Definition: refobj.c:45
pthread_mutex_t lock
this is a pointer to the lock it may be changed to be the lock
Definition: refobj.c:50
int objlock ( void *  data)

Lock the reference.

Parameters
dataReference to lock
Returns
Always returns 0 will only lock if a valid object.

Definition at line 269 of file refobj.c.

References ref_obj::data, ref_obj::lock, ref_obj::magic, REFOBJ_MAGIC, and refobj_offset.

Referenced by accept_socket(), addtobucket(), bucket_list_cnt(), create_kernmac(), create_kernvlan(), curl_postitem(), curlinit(), dtls_listenssl(), dtlshandltimeout(), dtlstimeout(), dtsl_serveropts(), framework_mkthread(), get_iface_index(), jointhreads(), ldap_doadd(), ldap_domodify(), ldap_saslbind(), ldap_simplebind(), nf_ctrack_delete(), nf_ctrack_dump(), nf_ctrack_nat(), nfqueue_attach(), remove_bucket_item(), remove_bucket_loop(), set_interface_addr(), set_interface_flags(), set_interface_ipaddr(), set_interface_name(), socketread_d(), socketserver(), socketwrite_d(), ssl_shutdown(), stopthreads(), url_escape(), url_unescape(), xml_addnode(), xml_appendnode(), xml_createpath(), xml_delete(), xml_doctobuffer(), xml_getfirstnode(), xml_getnextnode(), xml_getrootnode(), xml_modify(), xml_savefile(), xml_setattr(), xml_unlink(), xml_xpath(), xslt_addparam(), xslt_apply(), xslt_apply_buffer(), and xslt_clearparam().

269  {
270  char *ptr = data;
271  struct ref_obj *ref;
272 
273  ptr = ptr - refobj_offset;
274  ref = (struct ref_obj *)ptr;
275 
276  if (data && ref->magic == REFOBJ_MAGIC) {
277  pthread_mutex_lock(&ref->lock);
278  }
279  return (0);
280 }
#define refobj_offset
The size of ref_obj is the offset for the data.
Definition: refobj.c:119
Internal structure of all referenced objects.
Definition: refobj.c:38
void * data
Pointer to the data referenced.
Definition: refobj.c:54
#define REFOBJ_MAGIC
Magic number stored as first field of all referenced objects.
Definition: refobj.c:34
uint32_t magic
Memory integrity check used to prevent non refeferenced objects been handled as referenced objects...
Definition: refobj.c:42
pthread_mutex_t lock
this is a pointer to the lock it may be changed to be the lock
Definition: refobj.c:50
int objref ( void *  data)

Reference a object.

Parameters
dataData to obtain reference for.
Returns
0 on error or the current count (after incrementing)

Definition at line 153 of file refobj.c.

References ref_obj::cnt, ref_obj::data, ref_obj::lock, ref_obj::magic, REFOBJ_MAGIC, and refobj_offset.

Referenced by addtobucket(), bucket_list_find_key(), create_kernmac(), create_kernvlan(), curl_setauth_cb(), curl_setprogress(), curlinit(), framework_init(), framework_mkthread(), get_category_next(), get_config_category(), get_config_file(), get_iface_index(), ifhwaddr(), init_bucket_loop(), jointhreads(), ldap_domodify(), ldap_saslbind(), ldap_simplebind(), ldap_simplerebind(), mcast_socket(), next_bucket_loop(), set_interface_addr(), set_interface_flags(), set_interface_ipaddr(), set_interface_name(), startthreads(), stopthreads(), unixsocket_client(), unixsocket_server(), xml_addnode(), xml_appendnode(), xml_createpath(), xml_getfirstnode(), xml_getnextnode(), xml_getnodes(), xml_init(), xml_xpath(), xslt_addparam(), and xslt_init().

153  {
154  char *ptr = data;
155  struct ref_obj *ref;
156  int ret = 0;
157 
158  ptr = ptr - refobj_offset;
159  ref = (struct ref_obj *)ptr;
160 
161  if (!data || !ref || (ref->magic != REFOBJ_MAGIC)) {
162  return (ret);
163  }
164 
165  /*double check just incase im gone*/
166  if (!pthread_mutex_lock(&ref->lock)) {
167  if ((ref->magic == REFOBJ_MAGIC) && (ref->cnt > 0)) {
168  ref->cnt++;
169  ret = ref->cnt;
170  }
171  pthread_mutex_unlock(&ref->lock);
172  }
173 
174  return (ret);
175 }
#define refobj_offset
The size of ref_obj is the offset for the data.
Definition: refobj.c:119
Internal structure of all referenced objects.
Definition: refobj.c:38
void * data
Pointer to the data referenced.
Definition: refobj.c:54
#define REFOBJ_MAGIC
Magic number stored as first field of all referenced objects.
Definition: refobj.c:34
uint32_t magic
Memory integrity check used to prevent non refeferenced objects been handled as referenced objects...
Definition: refobj.c:42
uint32_t cnt
Reference count the oject will be freed when the reference count reaches 0.
Definition: refobj.c:45
pthread_mutex_t lock
this is a pointer to the lock it may be changed to be the lock
Definition: refobj.c:50
int objsize ( void *  data)

Size requested for data.

Note
the size of the data is returned.
Parameters
dataPointer to data to obtain size of.
Returns
size requested for allocation not allocation [excludes refobj].

Definition at line 246 of file refobj.c.

References ref_obj::data, ref_obj::lock, ref_obj::magic, REFOBJ_MAGIC, refobj_offset, and ref_obj::size.

246  {
247  char *ptr = data;
248  int ret = 0;
249  struct ref_obj *ref;
250 
251  if (!data) {
252  return (ret);
253  }
254 
255  ptr = ptr - refobj_offset;
256  ref = (struct ref_obj *)ptr;
257 
258  if (ref->magic == REFOBJ_MAGIC) {
259  pthread_mutex_lock(&ref->lock);
260  ret = ref->size - refobj_offset;
261  pthread_mutex_unlock(&ref->lock);
262  }
263  return (ret);
264 }
#define refobj_offset
The size of ref_obj is the offset for the data.
Definition: refobj.c:119
Internal structure of all referenced objects.
Definition: refobj.c:38
void * data
Pointer to the data referenced.
Definition: refobj.c:54
#define REFOBJ_MAGIC
Magic number stored as first field of all referenced objects.
Definition: refobj.c:34
size_t size
The size allocated to this object.
Definition: refobj.c:48
uint32_t magic
Memory integrity check used to prevent non refeferenced objects been handled as referenced objects...
Definition: refobj.c:42
pthread_mutex_t lock
this is a pointer to the lock it may be changed to be the lock
Definition: refobj.c:50
int objtrylock ( void *  data)

Try lock a reference.

Parameters
dataReference to attempt to lock.
Returns
0 on success -1 on failure.

Definition at line 285 of file refobj.c.

References ref_obj::data, ref_obj::lock, ref_obj::magic, REFOBJ_MAGIC, and refobj_offset.

285  {
286  char *ptr = data;
287  struct ref_obj *ref;
288 
289  ptr = ptr - refobj_offset;
290  ref = (struct ref_obj *)ptr;
291 
292  if (ref->magic == REFOBJ_MAGIC) {
293  return ((pthread_mutex_trylock(&ref->lock)) ? -1 : 0);
294  }
295  return (-1);
296 }
#define refobj_offset
The size of ref_obj is the offset for the data.
Definition: refobj.c:119
Internal structure of all referenced objects.
Definition: refobj.c:38
void * data
Pointer to the data referenced.
Definition: refobj.c:54
#define REFOBJ_MAGIC
Magic number stored as first field of all referenced objects.
Definition: refobj.c:34
uint32_t magic
Memory integrity check used to prevent non refeferenced objects been handled as referenced objects...
Definition: refobj.c:42
pthread_mutex_t lock
this is a pointer to the lock it may be changed to be the lock
Definition: refobj.c:50
int objunlock ( void *  data)

Unlock a reference.

Parameters
dataReference to unlock.
Returns
Always returns 0.

Definition at line 301 of file refobj.c.

References ref_obj::data, ref_obj::lock, ref_obj::magic, REFOBJ_MAGIC, and refobj_offset.

Referenced by accept_socket(), addtobucket(), bucket_list_cnt(), create_kernmac(), create_kernvlan(), curl_postitem(), curlinit(), dtls_listenssl(), dtlshandltimeout(), dtlstimeout(), dtsl_serveropts(), framework_mkthread(), get_iface_index(), jointhreads(), ldap_doadd(), ldap_domodify(), ldap_saslbind(), ldap_simplebind(), nf_ctrack_delete(), nf_ctrack_dump(), nf_ctrack_nat(), nfqueue_attach(), remove_bucket_item(), remove_bucket_loop(), set_interface_addr(), set_interface_flags(), set_interface_ipaddr(), set_interface_name(), socketread_d(), socketserver(), socketwrite_d(), ssl_shutdown(), stopthreads(), url_escape(), url_unescape(), xml_addnode(), xml_appendnode(), xml_createpath(), xml_delete(), xml_doctobuffer(), xml_getfirstnode(), xml_getnextnode(), xml_getrootnode(), xml_modify(), xml_savefile(), xml_setattr(), xml_unlink(), xml_xpath(), xslt_addparam(), xslt_apply(), xslt_apply_buffer(), and xslt_clearparam().

301  {
302  char *ptr = data;
303  struct ref_obj *ref;
304 
305  ptr = ptr - refobj_offset;
306  ref = (struct ref_obj *)ptr;
307 
308  if (ref->magic == REFOBJ_MAGIC) {
309  pthread_mutex_unlock(&ref->lock);
310  }
311  return (0);
312 }
#define refobj_offset
The size of ref_obj is the offset for the data.
Definition: refobj.c:119
Internal structure of all referenced objects.
Definition: refobj.c:38
void * data
Pointer to the data referenced.
Definition: refobj.c:54
#define REFOBJ_MAGIC
Magic number stored as first field of all referenced objects.
Definition: refobj.c:34
uint32_t magic
Memory integrity check used to prevent non refeferenced objects been handled as referenced objects...
Definition: refobj.c:42
pthread_mutex_t lock
this is a pointer to the lock it may be changed to be the lock
Definition: refobj.c:50
int objunref ( void *  data)

Drop reference held.

If the reference is the last reference call the destructor to clean up and then free the memory used.

Warning
The reference should not be used again and ideally set to NULL.
Parameters
dataData we are droping a reference for
Returns
-1 on error or the refrence count after decrementing.

Definition at line 184 of file refobj.c.

References ref_obj::cnt, ref_obj::data, ref_obj::destroy, ref_obj::lock, ref_obj::magic, REFOBJ_MAGIC, refobj_offset, and ref_obj::size.

Referenced by accept_socket(), add_radserver(), addtobucket(), bucket_list_find_key(), bucketlist_callback(), close_socket(), closenetlink(), create_kernmac(), create_kernvlan(), curl_setauth_cb(), curl_setprogress(), curlclose(), curlinit(), daemonize(), dtls_listenssl(), framework_init(), framework_mkcore(), framework_mkthread(), framework_threadok(), get_category_loop(), get_category_next(), get_config_category(), get_config_file(), get_iface_index(), ifhwaddr(), jointhreads(), ldap_add_attr(), ldap_addinit(), ldap_connect(), ldap_doadd(), ldap_domodify(), ldap_mod_add(), ldap_mod_addattr(), ldap_mod_del(), ldap_mod_delattr(), ldap_mod_rep(), ldap_mod_repattr(), ldap_modifyinit(), ldap_saslbind(), ldap_simplebind(), ldap_simplerebind(), ldap_unref_attr(), ldap_unref_entry(), make_socket(), mcast_socket(), nf_ctrack_close(), nf_ctrack_endtrace(), nf_ctrack_trace(), nfqueue_attach(), process_config(), remove_bucket_item(), remove_bucket_loop(), rfc6296_map_add(), rfc6296_test(), set_interface_addr(), set_interface_flags(), set_interface_ipaddr(), set_interface_name(), socketread_d(), socketwrite_d(), startthreads(), stopthreads(), thread_signal(), unixsocket_client(), unixsocket_server(), unrefconfigfiles(), url_escape(), url_unescape(), xml_addnode(), xml_appendnode(), xml_close(), xml_createpath(), xml_getattr(), xml_getfirstnode(), xml_getnextnode(), xml_loadbuf(), xml_loaddoc(), xml_xpath(), xslt_addparam(), xslt_apply(), xslt_apply_buffer(), xslt_clearparam(), and xslt_close().

184  {
185  char *ptr = data;
186  struct ref_obj *ref;
187  int ret = -1;
188 
189  if (!data) {
190  return (ret);
191  }
192 
193  ptr = ptr - refobj_offset;
194  ref = (struct ref_obj *)ptr;
195 
196  if ((ref->magic == REFOBJ_MAGIC) && (ref->cnt)) {
197  pthread_mutex_lock(&ref->lock);
198  ref->cnt--;
199  ret = ref->cnt;
200  /* free the object its no longer in use*/
201  if (!ret) {
202  ref->magic = 0;
203  ref->size = 0;
204  ref->data = NULL;
205  if (ref->destroy) {
206  ref->destroy(data);
207  }
208  pthread_mutex_unlock(&ref->lock);
209  pthread_mutex_destroy(&ref->lock);
210  free(ref);
211  } else {
212  pthread_mutex_unlock(&ref->lock);
213  }
214  }
215  return (ret);
216 }
#define refobj_offset
The size of ref_obj is the offset for the data.
Definition: refobj.c:119
objdestroy destroy
Function to call to clean up the data before its freed.
Definition: refobj.c:52
Internal structure of all referenced objects.
Definition: refobj.c:38
void * data
Pointer to the data referenced.
Definition: refobj.c:54
#define REFOBJ_MAGIC
Magic number stored as first field of all referenced objects.
Definition: refobj.c:34
size_t size
The size allocated to this object.
Definition: refobj.c:48
uint32_t magic
Memory integrity check used to prevent non refeferenced objects been handled as referenced objects...
Definition: refobj.c:42
uint32_t cnt
Reference count the oject will be freed when the reference count reaches 0.
Definition: refobj.c:45
pthread_mutex_t lock
this is a pointer to the lock it may be changed to be the lock
Definition: refobj.c:50