Lines Matching refs:channel

98 /*** channel allocation ***/
108 SysChannel channel = _s_free_channels;
109 assert( channel != NULL && "out of free channels" );
110 _s_free_channels = channel->next;
111 channel->next = NULL;
112 channel->active = 0;
113 channel->closed = 0;
114 channel->pending = 0;
115 channel->wanted = 0;
116 return channel;
120 sys_channel_free( SysChannel channel )
122 if (channel->fd >= 0) {
124 shutdown( channel->fd, SD_BOTH );
126 shutdown( channel->fd, SHUT_RDWR );
128 close(channel->fd);
129 channel->fd = -1;
131 channel->wanted = 0;
132 channel->ready = 0;
133 channel->callback = NULL;
135 channel->next = _s_free_channels;
136 _s_free_channels = channel;
143 /* used by select to wait on channel events */
148 sys_channel_deactivate( SysChannel channel )
150 assert( channel->active != 0 );
155 if (node == channel)
159 *pnode = channel->next;
160 channel->next = NULL;
161 channel->active = 0;
165 sys_channel_activate( SysChannel channel )
167 assert( channel->active == 0 );
168 channel->next = _s_channels;
169 _s_channels = channel;
170 channel->active = 1;
171 if (channel->fd > _s_maxfd)
172 _s_maxfd = channel->fd;
199 sys_channel_on( SysChannel channel,
204 int adds = events & ~channel->wanted;
205 int removes = channel->wanted & ~events;
207 channel->wanted = events;
208 channel->callback = callback;
209 channel->opaque = opaque;
216 FD_SET( channel->fd, &_s_fdsets[ee] );
222 FD_CLR( channel->fd, &_s_fdsets[ee] );
224 if (events && !channel->active) {
225 sys_channel_activate( channel );
227 else if (!events && channel->active) {
228 sys_channel_deactivate( channel );
233 sys_channel_read( SysChannel channel, void* buffer, int size )
238 assert( !channel->closed );
241 int len = read(channel->fd, buff, size);
258 sys_channel_write( SysChannel channel, const void* buffer, int size )
263 assert( !channel->closed );
266 int len = write(channel->fd, buff, size);
283 sys_channel_close( SysChannel channel )
285 if (channel->active) {
286 sys_channel_on( channel, 0, NULL, NULL );
289 if (channel->pending) {
290 /* we can't free the channel right now because it */
292 channel->closed = 1;
296 if (!channel->closed) {
297 channel->closed = 1;
300 sys_channel_free( channel );
467 SysChannel channel;
470 for (channel = _s_channels; channel; channel = channel->next)
472 if (channel->fd != i)
475 channel->ready = events;
476 channel->pending = 1;
477 sys_queue_add( _s_pending_channels, channel );
512 SysChannel channel;
524 while ((channel = sys_queue_get( _s_pending_channels )) != NULL) {
527 channel->pending = 0;
528 if (channel->closed) {
529 /* the channel was closed by a previous callback */
530 sys_channel_close(channel);
532 events = channel->ready;
533 channel->ready = 0;
534 channel->callback( channel->opaque, events );
546 SysChannel channel;
550 channel = sys_channel_alloc();
551 if (-1==(channel->fd=socket(AF_INET, SOCK_STREAM, 0))) {
553 sys_channel_free( channel );
558 if ( -1==setsockopt( channel->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) )) {
571 if (-1==bind(channel->fd, (struct sockaddr*)&servname, sizeof(servname))) {
573 sys_channel_close(channel);
578 if ( listen(channel->fd, BACKLOG) < 0 ) {
580 sys_channel_close(channel);
584 return channel;
592 SysChannel channel = sys_channel_alloc();
594 channel->fd = accept( server_channel->fd, NULL, 0 );
595 if (channel->fd < 0) {
597 sys_channel_free( channel );
602 fcntl(channel->fd, F_SETFL, O_NONBLOCK);
603 setsockopt(channel->fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));
604 return channel;
613 SysChannel channel = sys_channel_alloc();
619 sys_channel_free(channel);
628 channel->fd = socket(hp->h_addrtype, SOCK_STREAM, 0);
629 if(channel->fd < 0) {
630 sys_channel_free(channel);
634 if(connect( channel->fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
636 sys_channel_free(channel);
641 fcntl(channel->fd, F_SETFL, O_NONBLOCK);
642 setsockopt( channel->fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on) );
643 return channel;