15 #ifndef __PARSEBUFFER_H__
16 #define __PARSEBUFFER_H__
165 inline virtual const char*
get_name()
const {
return "ParseBuffer"; }
218 ex_in_use_mutex =
SG_MALLOC(pthread_mutex_t, ring_size);
219 ex_in_use_cond =
SG_MALLOC(pthread_cond_t, ring_size);
220 read_lock =
new pthread_mutex_t;
221 write_lock =
new pthread_mutex_t;
223 SG_SINFO(
"Initialized with ring size: %d.\n", ring_size);
228 for (int32_t i=0; i<ring_size; i++)
231 ex_ring[i].fv.vector =
new T();
232 ex_ring[i].fv.vlen = 1;
233 ex_ring[i].label = FLT_MAX;
235 pthread_cond_init(&ex_in_use_cond[i], NULL);
236 pthread_mutex_init(&ex_in_use_mutex[i], NULL);
238 pthread_mutex_init(read_lock, NULL);
239 pthread_mutex_init(write_lock, NULL);
241 free_vectors_on_destruct =
true;
246 for (int32_t i=0; i<ring_size; i++)
248 if (ex_ring[i].fv.vector != NULL && free_vectors_on_destruct)
249 delete ex_ring[i].fv.vector;
250 pthread_mutex_destroy(&ex_in_use_mutex[i]);
251 pthread_cond_destroy(&ex_in_use_cond[i]);
265 ex_ring[ex_write_index].label = ex->
label;
266 ex_ring[ex_write_index].fv.vector = ex->
fv.vector;
267 ex_ring[ex_write_index].fv.vlen = ex->
fv.vlen;
277 if (ex_read_index >= 0)
278 return &ex_ring[ex_read_index];
286 pthread_mutex_lock(read_lock);
289 int32_t current_index = ex_read_index;
292 pthread_mutex_lock(&ex_in_use_mutex[current_index]);
295 ex = return_example_to_read();
299 pthread_mutex_unlock(&ex_in_use_mutex[current_index]);
301 pthread_mutex_unlock(read_lock);
308 pthread_mutex_lock(write_lock);
310 int32_t current_index = ex_write_index;
312 pthread_mutex_lock(&ex_in_use_mutex[current_index]);
315 pthread_cond_wait(&ex_in_use_cond[ex_write_index], &ex_in_use_mutex[ex_write_index]);
318 ret = write_example(ex);
320 pthread_mutex_unlock(&ex_in_use_mutex[current_index]);
321 pthread_mutex_unlock(write_lock);
329 pthread_mutex_lock(read_lock);
330 pthread_mutex_lock(&ex_in_use_mutex[ex_read_index]);
331 ex_used[ex_read_index] =
E_USED;
333 if (free_after_release)
335 SG_DEBUG(
"Freeing object in ring at index %d and address: %p.\n",
336 ex_read_index, ex_ring[ex_read_index].fv.vector);
338 delete ex_ring[ex_read_index].fv.vector;
339 ex_ring[ex_read_index].fv.vector=NULL;
342 pthread_cond_signal(&ex_in_use_cond[ex_read_index]);
343 pthread_mutex_unlock(&ex_in_use_mutex[ex_read_index]);
346 pthread_mutex_unlock(read_lock);
350 #endif // __PARSEBUFFER_H__