Skip to content
Snippets Groups Projects
Select Git revision
  • d8e032fe41bbc5495f8b4938bcc00e5e6a65b0c5
  • master default protected
  • 9.0
  • 8.0
  • 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
  • nt-tools
  • rosuav/async-annotations
  • rosuav/pgsql-ssl
  • rxnpatch/rxnpatch-broken/2023-10-06T094250
  • grubba/fdlib
  • grubba/wip/sakura/8.0
  • 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
  • v8.0.1982
  • v8.0.1980
  • v8.0.1978
  • v8.0.1976
  • v8.0.1974
  • v8.0.1972
  • v8.0.1970
  • v8.0.1968
  • v8.0.1966
41 results

Gnome.pmod

Blame
    • Martin Nilsson's avatar
      ffaf457e
      Better dependency checks. · ffaf457e
      Martin Nilsson authored
      Rev: lib/modules/Cache.pmod/Storage.pmod/Gdbm.pike:1.10
      Rev: lib/modules/GLUE.pmod/module.pmod:1.5
      Rev: lib/modules/Gnome.pmod:1.8
      Rev: lib/modules/Pike.pmod/Security.pmod:1.4
      Rev: lib/modules/Protocols.pmod/IRC.pmod/Client.pike:1.14
      Rev: lib/modules/Protocols.pmod/LDAP.pmod/client.pike:1.55
      Rev: lib/modules/Protocols.pmod/LDAP.pmod/ldap_privates.pmod:1.8
      Rev: lib/modules/Protocols.pmod/LDAP.pmod/protocol.pike:1.12
      Rev: lib/modules/Sql.pmod/msql.pike:1.15
      Rev: lib/modules/Sql.pmod/mysql.pike:1.20
      Rev: lib/modules/Sql.pmod/mysql_result.pike:1.5
      Rev: lib/modules/Sql.pmod/odbc.pike:1.13
      Rev: lib/modules/Sql.pmod/odbc_result.pike:1.5
      Rev: lib/modules/Sql.pmod/postgres.pike:1.23
      Rev: lib/modules/Sql.pmod/postgres_result.pike:1.6
      Rev: lib/modules/Sql.pmod/sybase.pike:1.9
      Rev: lib/modules/Standards.pmod/ASN1.pmod/Decode.pmod:1.19
      Rev: lib/modules/Standards.pmod/ASN1.pmod/Types.pmod:1.36
      Rev: lib/modules/Standards.pmod/PKCS.pmod/CSR.pmod:1.12
      Rev: lib/modules/Standards.pmod/PKCS.pmod/Certificate.pmod:1.18
      Rev: lib/modules/Standards.pmod/PKCS.pmod/DSA.pmod:1.8
      Rev: lib/modules/Standards.pmod/PKCS.pmod/Identifiers.pmod:1.15
      Rev: lib/modules/Standards.pmod/PKCS.pmod/RSA.pmod:1.20
      Rev: lib/modules/_Image.pmod/module.pmod:1.40
      ffaf457e
      History
      Better dependency checks.
      Martin Nilsson authored
      Rev: lib/modules/Cache.pmod/Storage.pmod/Gdbm.pike:1.10
      Rev: lib/modules/GLUE.pmod/module.pmod:1.5
      Rev: lib/modules/Gnome.pmod:1.8
      Rev: lib/modules/Pike.pmod/Security.pmod:1.4
      Rev: lib/modules/Protocols.pmod/IRC.pmod/Client.pike:1.14
      Rev: lib/modules/Protocols.pmod/LDAP.pmod/client.pike:1.55
      Rev: lib/modules/Protocols.pmod/LDAP.pmod/ldap_privates.pmod:1.8
      Rev: lib/modules/Protocols.pmod/LDAP.pmod/protocol.pike:1.12
      Rev: lib/modules/Sql.pmod/msql.pike:1.15
      Rev: lib/modules/Sql.pmod/mysql.pike:1.20
      Rev: lib/modules/Sql.pmod/mysql_result.pike:1.5
      Rev: lib/modules/Sql.pmod/odbc.pike:1.13
      Rev: lib/modules/Sql.pmod/odbc_result.pike:1.5
      Rev: lib/modules/Sql.pmod/postgres.pike:1.23
      Rev: lib/modules/Sql.pmod/postgres_result.pike:1.6
      Rev: lib/modules/Sql.pmod/sybase.pike:1.9
      Rev: lib/modules/Standards.pmod/ASN1.pmod/Decode.pmod:1.19
      Rev: lib/modules/Standards.pmod/ASN1.pmod/Types.pmod:1.36
      Rev: lib/modules/Standards.pmod/PKCS.pmod/CSR.pmod:1.12
      Rev: lib/modules/Standards.pmod/PKCS.pmod/Certificate.pmod:1.18
      Rev: lib/modules/Standards.pmod/PKCS.pmod/DSA.pmod:1.8
      Rev: lib/modules/Standards.pmod/PKCS.pmod/Identifiers.pmod:1.15
      Rev: lib/modules/Standards.pmod/PKCS.pmod/RSA.pmod:1.20
      Rev: lib/modules/_Image.pmod/module.pmod:1.40
    select.c 3.82 KiB
    /* select.c, liboop, copyright 1999 Dan Egnor
    
       This is free software; you can redistribute it and/or modify it under the
       terms of the GNU Lesser General Public License, version 2.1 or later.
       See the file COPYING for details. */
    
    #include "oop.h"
    
    #include <assert.h>
    
    struct select_set {
    	fd_set rfd,wfd;
    };
    
    struct oop_adapter_select {
    	oop_source *source;
    	struct select_set watch,active;
    	struct timeval timeout;
    	int num_fd,do_timeout,is_active,num_fd_active;
    	oop_call_select *call;
    	void *data;
    };
    
    static oop_call_fd on_fd;
    static oop_call_time on_timeout,on_collect;
    
    oop_adapter_select *oop_select_new(
    	oop_source *source, 
    	oop_call_select *call,void *data)
    {
    	oop_adapter_select *s = oop_malloc(sizeof(*s));
    	if (NULL == s) return s;
    	s->source = source;
    	FD_ZERO(&s->watch.rfd);
    	FD_ZERO(&s->watch.wfd);
    	FD_ZERO(&s->active.rfd);
    	FD_ZERO(&s->active.wfd);
    	s->num_fd = 0;
    	s->do_timeout = 0;
    	s->is_active = 0;
    	s->call = call;
    	s->data = data;
    	return s;
    }
    
    static void *activate(oop_adapter_select *s) {
    	if (!s->is_active) {
    		s->is_active = 1;
    		s->source->on_time(s->source,OOP_TIME_NOW,on_collect,s);
    	}
    	return OOP_CONTINUE;
    }
    
    static void deactivate(oop_adapter_select *s) {
    	if (s->is_active) {
    		s->source->cancel_time(s->source,OOP_TIME_NOW,on_collect,s);
    		s->is_active = 0;
    		s->num_fd_active = 0;
    		FD_ZERO(&s->active.rfd);
    		FD_ZERO(&s->active.wfd);
    	}
    }
    
    void oop_select_set(
    	oop_adapter_select *s,int num_fd,
    	fd_set *rfd,fd_set *wfd,struct timeval *timeout)
    {
    	int fd;
    	for (fd = 0; fd < num_fd || fd < s->num_fd; ++fd) {
    		int rfd_set = fd < num_fd && FD_ISSET(fd,rfd);
    		int wfd_set = fd < num_fd && FD_ISSET(fd,wfd);
    		int w_rfd_set = fd < s->num_fd && FD_ISSET(fd,&s->watch.rfd);
    		int w_wfd_set = fd < s->num_fd && FD_ISSET(fd,&s->watch.wfd);
    
    		if (rfd_set && !w_rfd_set) {
    			s->source->on_fd(s->source,fd,OOP_READ,on_fd,s);
    			FD_SET(fd,&s->watch.rfd);
    		}
    
    		if (!rfd_set && w_rfd_set) {
    			s->source->cancel_fd(s->source,fd,OOP_READ);
    			FD_CLR(fd,&s->watch.rfd);
    		}
    
    		if (wfd_set && !w_wfd_set) {
    			s->source->on_fd(s->source,fd,OOP_WRITE,on_fd,s);
    			FD_SET(fd,&s->watch.wfd);
    		}
    
    		if (!wfd_set && w_wfd_set) {
    			s->source->cancel_fd(s->source,fd,OOP_WRITE);
    			FD_CLR(fd,&s->watch.wfd);
    		}
    	}
    
    	s->num_fd = num_fd;
    
    	if (s->do_timeout) {
    		s->source->cancel_time(s->source,s->timeout,on_timeout,s);
    		s->do_timeout = 0;
    	}
    
    	if (NULL != timeout) {
    		gettimeofday(&s->timeout,NULL);
    		s->timeout.tv_sec += timeout->tv_sec;
    		s->timeout.tv_usec += timeout->tv_usec;
    		while (s->timeout.tv_usec >= 1000000) {
    			++s->timeout.tv_sec;
    			s->timeout.tv_usec -= 1000000;
    		}
    		s->do_timeout = 1;
    		s->source->on_time(s->source,s->timeout,on_timeout,s);
    	}
    
    	deactivate(s);
    }
    
    void oop_select_delete(oop_adapter_select *s) {
    	fd_set fd;
    	FD_ZERO(&fd);
    	oop_select_set(s,0,&fd,&fd,NULL);
    	oop_free(s);
    }
    
    static void set_fd(int fd,fd_set *fds,int *num) {
    	if (!FD_ISSET(fd,fds)) {
    		FD_SET(fd,fds);
    		if (fd >= *num) *num = fd + 1;
    	}
    }
    
    static void *on_fd(oop_source *source,int fd,oop_event event,void *data) {
    	oop_adapter_select *s = (oop_adapter_select *) data;
    	switch (event) {
    	case OOP_READ:
    		assert(FD_ISSET(fd,&s->watch.rfd));
    		set_fd(fd,&s->active.rfd,&s->num_fd_active);
    		break;
    	case OOP_WRITE:
    		assert(FD_ISSET(fd,&s->watch.wfd));
    		set_fd(fd,&s->active.wfd,&s->num_fd_active);
    		break;
    	default:
    		assert(0);
    		break;
    	}
    	return activate(s);
    }
    
    static void *on_timeout(oop_source *source,struct timeval when,void *data) {
    	oop_adapter_select *s = (oop_adapter_select *) data;
    	assert(s->do_timeout);
    	return activate(s);
    }
    
    static void *on_collect(oop_source *source,struct timeval when,void *data) {
    	oop_adapter_select *s = (oop_adapter_select *) data;
    	struct select_set set = s->active;
    	int num = s->num_fd_active;
    	struct timeval now;
    	gettimeofday(&now,NULL);
    	deactivate(s);
    	return s->call(s,num,&set.rfd,&set.wfd,now,s->data);
    }