ROOT logo
// $Id: GSelector.cxx 2715 2012-04-05 17:25:48Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "GSelector.h"

#include "TSocket.h"

#include <sys/select.h>
// #include <sys/time.h>
// #include <sys/types.h>
// #include <unistd.h>
#include <errno.h>

void GFdSet::Add(void* ud, Int_t fd)
{
  insert(make_pair(ud, fd));
}

void GFdSet::Add(TSocket* s)
{
  insert(make_pair(s, s->GetDescriptor()));
}

void GFdSet::Remove(void* ud)
{
  erase(ud);
}

//==============================================================================

ClassImp(GSelector);

//------------------------------------------------------------------------------

GSelector::GSelector(Init_e e) : GMutex(e), fError(SE_Null), fTimeOut(0)
{}

GSelector::~GSelector()
{}

//------------------------------------------------------------------------------

void GSelector::Clear()
{
  Lock();
  fRead.clear();
  fWrite.clear();
  fExcept.clear();
  Unlock();
}

//------------------------------------------------------------------------------

Int_t GSelector::Select()
{
  static const Exc_t _eh("GSelector::Select ");

  // Prepare sets.
  int Mfd = 0;

  fd_set read, write, except;

  FD_ZERO(&read);   FD_ZERO(&write);   FD_ZERO(&except);
  fReadOut.clear(); fWriteOut.clear(); fExceptOut.clear();
  Lock();
  for (GFdSet_i i=fRead.begin(); i!=fRead.end(); ++i)
  {
    FD_SET(i->second, &read);
    if (i->second > Mfd)
      Mfd = i->second;
  }
  for (GFdSet_i i=fWrite.begin(); i!=fWrite.end(); ++i)
  {
    FD_SET(i->second, &write);
    if (i->second > Mfd)
      Mfd = i->second;
  }
  for (GFdSet_i i=fExcept.begin(); i!=fExcept.end(); ++i)
  {
    FD_SET(i->second, &except);
    if (i->second > Mfd)
      Mfd = i->second;
  }
  Unlock();

  errno = 0;
  int ret;
  if (fTimeOut <= 0)
  {
    ret = select(Mfd+1, &read, &write, &except, 0);
  }
  else
  {
    struct timeval timeout;
    timeout.tv_sec = (time_t) fTimeOut;
    timeout.tv_usec = (time_t)(1000000*(fTimeOut - timeout.tv_sec));
    ret = select(Mfd+1, &read, &write, &except, &timeout);
  }

  if (ret == -1)
  {
    switch(errno)
    {
      case 0: // Cancelled ... or sth ...
	fError = SE_Null;
	return -1;
      case EBADF:
	fError = SE_BadFD;
	ISerr(_eh + "Bad file-descriptor.");
	return -1;
      case EINTR:
	fError = SE_Interrupt;
	ISmess(_eh + "Interrupted select.");
	return -1;
      case EINVAL:
	fError = SE_BadArg;
	ISerr(_eh + "Bad parameters (nfds or timeout).");
	return -1;
      case ENOMEM:
	fError = SE_NoMem;
	ISerr(_eh + "No memory for select.");
	return -1;
      default:
	fError = SE_Unknown;
	ISerr(_eh + GForm("Undocumented error in select: %d.", errno));
	return -1;
    } // end switch
  }

  if (ret==0) return 0;

  // Build output sets.
  Lock();
  for (GFdSet_i i=fRead.begin(); i!=fRead.end(); ++i)
  {
    if (FD_ISSET(i->second, &read))
      fReadOut.insert(*i);
  }
  for (GFdSet_i i=fWrite.begin(); i!=fWrite.end(); ++i)
  {
    if (FD_ISSET(i->second, &write))
      fWriteOut.insert(*i);
  }
  for (GFdSet_i i=fExcept.begin(); i!=fExcept.end(); i++)
  {
    if (FD_ISSET(i->second, &except))
      fExceptOut.insert(*i);
  }
  Unlock();

  return ret;
}
 GSelector.cxx:1
 GSelector.cxx:2
 GSelector.cxx:3
 GSelector.cxx:4
 GSelector.cxx:5
 GSelector.cxx:6
 GSelector.cxx:7
 GSelector.cxx:8
 GSelector.cxx:9
 GSelector.cxx:10
 GSelector.cxx:11
 GSelector.cxx:12
 GSelector.cxx:13
 GSelector.cxx:14
 GSelector.cxx:15
 GSelector.cxx:16
 GSelector.cxx:17
 GSelector.cxx:18
 GSelector.cxx:19
 GSelector.cxx:20
 GSelector.cxx:21
 GSelector.cxx:22
 GSelector.cxx:23
 GSelector.cxx:24
 GSelector.cxx:25
 GSelector.cxx:26
 GSelector.cxx:27
 GSelector.cxx:28
 GSelector.cxx:29
 GSelector.cxx:30
 GSelector.cxx:31
 GSelector.cxx:32
 GSelector.cxx:33
 GSelector.cxx:34
 GSelector.cxx:35
 GSelector.cxx:36
 GSelector.cxx:37
 GSelector.cxx:38
 GSelector.cxx:39
 GSelector.cxx:40
 GSelector.cxx:41
 GSelector.cxx:42
 GSelector.cxx:43
 GSelector.cxx:44
 GSelector.cxx:45
 GSelector.cxx:46
 GSelector.cxx:47
 GSelector.cxx:48
 GSelector.cxx:49
 GSelector.cxx:50
 GSelector.cxx:51
 GSelector.cxx:52
 GSelector.cxx:53
 GSelector.cxx:54
 GSelector.cxx:55
 GSelector.cxx:56
 GSelector.cxx:57
 GSelector.cxx:58
 GSelector.cxx:59
 GSelector.cxx:60
 GSelector.cxx:61
 GSelector.cxx:62
 GSelector.cxx:63
 GSelector.cxx:64
 GSelector.cxx:65
 GSelector.cxx:66
 GSelector.cxx:67
 GSelector.cxx:68
 GSelector.cxx:69
 GSelector.cxx:70
 GSelector.cxx:71
 GSelector.cxx:72
 GSelector.cxx:73
 GSelector.cxx:74
 GSelector.cxx:75
 GSelector.cxx:76
 GSelector.cxx:77
 GSelector.cxx:78
 GSelector.cxx:79
 GSelector.cxx:80
 GSelector.cxx:81
 GSelector.cxx:82
 GSelector.cxx:83
 GSelector.cxx:84
 GSelector.cxx:85
 GSelector.cxx:86
 GSelector.cxx:87
 GSelector.cxx:88
 GSelector.cxx:89
 GSelector.cxx:90
 GSelector.cxx:91
 GSelector.cxx:92
 GSelector.cxx:93
 GSelector.cxx:94
 GSelector.cxx:95
 GSelector.cxx:96
 GSelector.cxx:97
 GSelector.cxx:98
 GSelector.cxx:99
 GSelector.cxx:100
 GSelector.cxx:101
 GSelector.cxx:102
 GSelector.cxx:103
 GSelector.cxx:104
 GSelector.cxx:105
 GSelector.cxx:106
 GSelector.cxx:107
 GSelector.cxx:108
 GSelector.cxx:109
 GSelector.cxx:110
 GSelector.cxx:111
 GSelector.cxx:112
 GSelector.cxx:113
 GSelector.cxx:114
 GSelector.cxx:115
 GSelector.cxx:116
 GSelector.cxx:117
 GSelector.cxx:118
 GSelector.cxx:119
 GSelector.cxx:120
 GSelector.cxx:121
 GSelector.cxx:122
 GSelector.cxx:123
 GSelector.cxx:124
 GSelector.cxx:125
 GSelector.cxx:126
 GSelector.cxx:127
 GSelector.cxx:128
 GSelector.cxx:129
 GSelector.cxx:130
 GSelector.cxx:131
 GSelector.cxx:132
 GSelector.cxx:133
 GSelector.cxx:134
 GSelector.cxx:135
 GSelector.cxx:136
 GSelector.cxx:137
 GSelector.cxx:138
 GSelector.cxx:139
 GSelector.cxx:140
 GSelector.cxx:141
 GSelector.cxx:142
 GSelector.cxx:143
 GSelector.cxx:144
 GSelector.cxx:145
 GSelector.cxx:146
 GSelector.cxx:147
 GSelector.cxx:148
 GSelector.cxx:149
 GSelector.cxx:150
 GSelector.cxx:151
 GSelector.cxx:152
 GSelector.cxx:153
 GSelector.cxx:154
 GSelector.cxx:155