ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev_select.c
(Generate patch)

Comparing libev/ev_select.c (file contents):
Revision 1.4 by root, Wed Oct 31 14:44:15 2007 UTC vs.
Revision 1.8 by root, Fri Nov 2 16:54:35 2007 UTC

1/* 1/*
2 * libev select fd activity backend
3 *
2 * Copyright (c) 2007 Marc Alexander Lehmann <libev@schmorp.de> 4 * Copyright (c) 2007 Marc Alexander Lehmann <libev@schmorp.de>
3 * All rights reserved. 5 * All rights reserved.
4 * 6 *
5 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 8 * modification, are permitted provided that the following conditions are
47 int offs = fd >> 3; 49 int offs = fd >> 3;
48 int mask = 1 << (fd & 7); 50 int mask = 1 << (fd & 7);
49 51
50 if (vec_max < (fd >> 5) + 1) 52 if (vec_max < (fd >> 5) + 1)
51 { 53 {
52 vec_max = (fd >> 5) + 1; 54 int new_max = (fd >> 5) + 1;
53 55
54 vec_ri = (unsigned char *)realloc (vec_ri, vec_max * 4); 56 vec_ri = (unsigned char *)realloc (vec_ri, new_max * 4);
55 vec_ro = (unsigned char *)realloc (vec_ro, vec_max * 4); /* could free/malloc */ 57 vec_ro = (unsigned char *)realloc (vec_ro, new_max * 4); /* could free/malloc */
56 vec_wi = (unsigned char *)realloc (vec_wi, vec_max * 4); 58 vec_wi = (unsigned char *)realloc (vec_wi, new_max * 4);
57 vec_wo = (unsigned char *)realloc (vec_wo, vec_max * 4); /* could free/malloc */ 59 vec_wo = (unsigned char *)realloc (vec_wo, new_max * 4); /* could free/malloc */
60
61 for (; vec_max < new_max; ++vec_max)
62 ((uint32_t *)vec_ri)[vec_max] =
63 ((uint32_t *)vec_wi)[vec_max] = 0;
58 } 64 }
59 65
60 vec_ri [offs] |= mask; 66 vec_ri [offs] |= mask;
61 if (!(nev & EV_READ)) 67 if (!(nev & EV_READ))
62 vec_ri [offs] &= ~mask; 68 vec_ri [offs] &= ~mask;
64 vec_wi [offs] |= mask; 70 vec_wi [offs] |= mask;
65 if (!(nev & EV_WRITE)) 71 if (!(nev & EV_WRITE))
66 vec_wi [offs] &= ~mask; 72 vec_wi [offs] &= ~mask;
67} 73}
68 74
75static void
69static void select_poll (ev_tstamp timeout) 76select_poll (ev_tstamp timeout)
70{ 77{
71 struct timeval tv; 78 struct timeval tv;
72 int res; 79 int res;
73 80
74 memcpy (vec_ro, vec_ri, vec_max * 4); 81 memcpy (vec_ro, vec_ri, vec_max * 4);
104 fd_event (idx * 8 + bit, events); 111 fd_event (idx * 8 + bit, events);
105 } 112 }
106 } 113 }
107 } 114 }
108 } 115 }
116 else if (res < 0)
117 {
118 if (errno == EBADF)
119 fd_ebadf ();
120 else if (errno == ENOMEM)
121 fd_enomem ();
122 }
109} 123}
110 124
125static void
111void select_init (int flags) 126select_init (int flags)
112{ 127{
113 ev_method = EVMETHOD_SELECT; 128 ev_method = EVMETHOD_SELECT;
114 method_fudge = 1e-2; /* needed to compensate for select returning early, very conservative */ 129 method_fudge = 1e-2; /* needed to compensate for select returning early, very conservative */
115 method_modify = select_modify; 130 method_modify = select_modify;
116 method_poll = select_poll; 131 method_poll = select_poll;
117} 132}
118 133
119

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines