Skip to content
Snippets Groups Projects
Select Git revision
  • 13d6050c4886de15aeb0c6867beae43826f3bd26
  • master default
  • wip-slh-dsa-sha2-128s
  • master-updates
  • release-3.10-fixes
  • getopt-prototype
  • fix-bcrypt-warning
  • refactor-hmac
  • wip-use-alignas
  • trim-sha3-context
  • fix-gitlab-ci
  • check-fat-emulate
  • delete-digest_func-size
  • slh-dsa-shake-128f-nettle
  • slh-dsa-shake-128s-nettle
  • slh-dsa-shake-128s
  • delete-openpgp
  • ppc64-sha512
  • delete-md5-compat
  • cleanup-hmac-tests
  • ppc64-sha256
  • nettle_3.10.2_release_20250626
  • nettle_3.10.1_release_20241230
  • nettle_3.10_release_20240616
  • nettle_3.10rc2
  • nettle_3.10rc1
  • nettle_3.9.1_release_20230601
  • nettle_3.9_release_20230514
  • nettle_3.8.1_release_20220727
  • nettle_3.8_release_20220602
  • nettle_3.7.3_release_20210606
  • nettle_3.7.2_release_20210321
  • nettle_3.7.1_release_20210217
  • nettle_3.7_release_20210104
  • nettle_3.7rc1
  • nettle_3.6_release_20200429
  • nettle_3.6rc3
  • nettle_3.6rc2
  • nettle_3.6rc1
  • nettle_3.5.1_release_20190627
  • nettle_3.5_release_20190626
41 results

realloc.h

Blame
  • Thread.pmod 1.48 KiB
    constant Mutex=__builtin.mutex;
    constant Condition=__builtin.condition;
    
    class Fifo {
      inherit Condition : r_cond;
      inherit Condition: w_cond;
      inherit Mutex: lock;
      
      mixed *buffer;
      int ptr, num;
      
      int size() {  return num; }
      
      mixed read()
        {
          mixed tmp;
          object key=lock::lock();
          while(!num) r_cond::wait(key);
          tmp=buffer[ptr];
          buffer[ptr++] = 0;	// Throw away any references.
          ptr%=sizeof(buffer);
          num--;
          w_cond::signal();
          return tmp;
        }
      
      void write(mixed v)
        {
          object key=lock::lock();
          while(num == sizeof(buffer)) w_cond::wait(key);
          buffer[(ptr + num++) % sizeof(buffer)]=v;
          r_cond::signal();
        }
      
      varargs void create(int size)
        {
          buffer=allocate(size || 128);
        }
    };
    
    class Queue {
      inherit Condition: r_cond;
      inherit Mutex: lock;
      
      mixed *buffer=allocate(16);
      int r_ptr, w_ptr;
      
      int size() {  return w_ptr - r_ptr;  }
      
      mixed read()
        {
          mixed tmp;
          object key=lock::lock();
          while(!size()) r_cond::wait(key);
          tmp=buffer[r_ptr];
          buffer[r_ptr++] = 0;	// Throw away any references.
          key=0;
          return tmp;
        }
      
      void write(mixed v)
        {
          object key=lock::lock();
          if(w_ptr >= sizeof(buffer))
          {
    	buffer=buffer[r_ptr..];
    	buffer+=allocate(sizeof(buffer)+1);
    	w_ptr-=r_ptr;
    	r_ptr=0;
          }
          buffer[w_ptr]=v;
          w_ptr++;
          key=0; // Must free this one _before_ the signal...
          r_cond::signal();
        }
    };