Skip to content
Snippets Groups Projects
Select Git revision
  • b2c69322a3c8d80b1e39a5fff0529b80df0e0105
  • master default protected
  • 9.0
  • marcus/wix3
  • 8.0
  • nt-tools
  • 7.8
  • 7.6
  • 7.4
  • 7.2
  • 7.0
  • 0.6
  • rosuav/latex-markdown-renderer
  • rxnpatch/rxnpatch
  • marcus/gobject-introspection
  • rxnpatch/8.0
  • rosuav/pre-listening-ports
  • rosuav/async-annotations
  • rosuav/pgsql-ssl
  • rxnpatch/rxnpatch-broken/2023-10-06T094250
  • grubba/fdlib
  • v8.0.2020
  • v8.0.2018
  • v8.0.2016
  • v8.0.2014
  • v8.0.2012
  • v8.0.2008
  • v8.0.2006
  • v8.0.2004
  • v8.0.2002
  • v8.0.2000
  • v8.0.1998
  • v8.0.1996
  • v8.0.1994
  • v8.0.1992
  • v8.0.1990
  • v8.0.1988
  • v8.0.1986
  • rxnpatch/clusters/8.0/2025-04-29T124414
  • rxnpatch/2025-04-29T124414
  • v8.0.1984
41 results

_Xlib.pmod

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();
        }
    };