예제 #1
0
static PyObject* PyJudyIntSet_remove(PyJudyIntSet* self, PyObject* key)
{
	Word_t v;

	if (self->s == 0 || !pyobject_as_word_t(key, &v)) {
		set_key_error(key);
		return 0;
	}

	JError_t JError;
	int i = Judy1Unset(&self->s, (Word_t)v, &JError);

	if (i == JERR) {
		judy_set_error(&JError);
		return 0;
	}

	if (i == 0) {
		set_key_error(key);
		return 0;
	}

	Py_INCREF(Py_None);
	return Py_None;
}
예제 #2
0
char set_s_selected(struct symbol *s, char value)
{
if(value)
	{
	Judy1Set ((Pvoid_t)&GLOBALS->s_selected, (Word_t)s, PJE0);
	}
	else
	{
	Judy1Unset ((Pvoid_t)&GLOBALS->s_selected, (Word_t)s, PJE0);
	}

return(value);
}
예제 #3
0
void flx_collector_t::mark(pthread::memory_ranges_t *px)
{
  int reclimit = 64;
  if(debug)
    fprintf(stderr,"Collector: Running mark\n");
  assert (root_count == roots.size());
  assert(j_tmp == 0);

  if(px)
  {
    std::vector<pthread::memory_range_t>::iterator end = (*px).end();
    for(
      std::vector<pthread::memory_range_t>::iterator i = (*px).begin();
      i != end;
      ++i
    )
    {
      pthread::memory_range_t range = *i;
      if(debug)
      {
        unsigned long n = (char*)range.e - (char*)range.b;
        fprintf(stderr, "Conservate scan of memory %p->%p, %ld bytes\n",range.b, range.e, n);
      }
      //VALGRIND_MAKE_MEM_DEFINED(range.b, (char*)range.e-(char*)range.b);
      void *end = range.e;
      for ( void *i = range.b; i != end; i = (void*)((void**)i+1))
      {
        if(debug)
          fprintf(stderr, "Check if *%p=%p is a pointer\n",i,*(void**)i);
        scan_object(*(void**)i, reclimit);
      }
      if(debug)
        fprintf(stderr, "DONE: Conservate scan of memory %p->%p\n",range.b, range.e);
    }
  }

  if(debug)
    fprintf(stderr, "Scanning roots\n");
  rootmap_t::iterator const end = roots.end();
  for(
    rootmap_t::iterator i = roots.begin();
    i != end;
    ++i
  )
  {
    if (debug)
      fprintf(stderr, "Scanning root %p\n", (*i).first);
    scan_object((*i).first, reclimit);
  }
  // Now, scan the temporary list until it is empty
  Word_t toscan = 0ul;
  int res = Judy1First(j_tmp,&toscan,&je); // get one object scheduled for scanning
  while(res) {
    Judy1Unset(&j_tmp,toscan,&je);         // remove it immediately
    scan_object((void*)toscan, reclimit);            // scan it, it will either be marked or discarded
    toscan = 0ul;
    res = Judy1First(j_tmp,&toscan,&je); 
  }                                     
  assert(j_tmp == 0);                  

  if(debug)
    fprintf(stderr, "Done Scanning roots\n");
}