Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
526a1823
Commit
526a1823
authored
Sep 11, 2000
by
Fred Drake
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Untabify. When compiling in -tt mode, an inconsistent Tab use error
was raised. This occurred during installation.
parent
8fd7ba2c
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
407 additions
and
408 deletions
+407
-408
Lib/asyncore.py
Lib/asyncore.py
+407
-408
No files found.
Lib/asyncore.py
View file @
526a1823
# -*- Mode: Python
; tab-width: 4
-*-
# -*- Mode: Python -*-
#
Id: asyncore.py,v 2.51 2000/09/07 22:29:26 rushing Exp
#
Id: asyncore.py,v 2.51 2000/09/07 22:29:26 rushing Exp
#
Author: Sam Rushing <rushing@nightmare.com>
#
Author: Sam Rushing <rushing@nightmare.com>
# ======================================================================
# ======================================================================
# Copyright 1996 by Sam Rushing
# Copyright 1996 by Sam Rushing
...
@@ -54,347 +54,347 @@ import sys
...
@@ -54,347 +54,347 @@ import sys
import
os
import
os
if
os
.
name
==
'nt'
:
if
os
.
name
==
'nt'
:
EWOULDBLOCK
=
10035
EWOULDBLOCK
=
10035
EINPROGRESS
=
10036
EINPROGRESS
=
10036
EALREADY
=
10037
EALREADY
=
10037
ECONNRESET
=
10054
ECONNRESET
=
10054
ENOTCONN
=
10057
ENOTCONN
=
10057
ESHUTDOWN
=
10058
ESHUTDOWN
=
10058
else
:
else
:
from
errno
import
EALREADY
,
EINPROGRESS
,
EWOULDBLOCK
,
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
from
errno
import
EALREADY
,
EINPROGRESS
,
EWOULDBLOCK
,
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
try
:
try
:
socket_map
socket_map
except
NameError
:
except
NameError
:
socket_map
=
{}
socket_map
=
{}
class
ExitNow
(
exceptions
.
Exception
):
class
ExitNow
(
exceptions
.
Exception
):
pass
pass
DEBUG
=
0
DEBUG
=
0
def
poll
(
timeout
=
0.0
,
map
=
None
):
def
poll
(
timeout
=
0.0
,
map
=
None
):
global
DEBUG
global
DEBUG
if
map
is
None
:
if
map
is
None
:
map
=
socket_map
map
=
socket_map
if
map
:
if
map
:
r
=
[];
w
=
[];
e
=
[]
r
=
[];
w
=
[];
e
=
[]
for
fd
,
obj
in
map
.
items
():
for
fd
,
obj
in
map
.
items
():
if
obj
.
readable
():
if
obj
.
readable
():
r
.
append
(
fd
)
r
.
append
(
fd
)
if
obj
.
writable
():
if
obj
.
writable
():
w
.
append
(
fd
)
w
.
append
(
fd
)
r
,
w
,
e
=
select
.
select
(
r
,
w
,
e
,
timeout
)
r
,
w
,
e
=
select
.
select
(
r
,
w
,
e
,
timeout
)
if
DEBUG
:
if
DEBUG
:
print
r
,
w
,
e
print
r
,
w
,
e
for
fd
in
r
:
for
fd
in
r
:
try
:
try
:
obj
=
map
[
fd
]
obj
=
map
[
fd
]
try
:
try
:
obj
.
handle_read_event
()
obj
.
handle_read_event
()
except
ExitNow
:
except
ExitNow
:
raise
ExitNow
raise
ExitNow
except
:
except
:
obj
.
handle_error
()
obj
.
handle_error
()
except
KeyError
:
except
KeyError
:
pass
pass
for
fd
in
w
:
for
fd
in
w
:
try
:
try
:
obj
=
map
[
fd
]
obj
=
map
[
fd
]
try
:
try
:
obj
.
handle_write_event
()
obj
.
handle_write_event
()
except
ExitNow
:
except
ExitNow
:
raise
ExitNow
raise
ExitNow
except
:
except
:
obj
.
handle_error
()
obj
.
handle_error
()
except
KeyError
:
except
KeyError
:
pass
pass
def
poll2
(
timeout
=
0.0
,
map
=
None
):
def
poll2
(
timeout
=
0.0
,
map
=
None
):
import
poll
import
poll
if
map
is
None
:
if
map
is
None
:
map
=
socket_map
map
=
socket_map
# timeout is in milliseconds
# timeout is in milliseconds
timeout
=
int
(
timeout
*
1000
)
timeout
=
int
(
timeout
*
1000
)
if
map
:
if
map
:
l
=
[]
l
=
[]
for
fd
,
obj
in
map
.
items
():
for
fd
,
obj
in
map
.
items
():
flags
=
0
flags
=
0
if
obj
.
readable
():
if
obj
.
readable
():
flags
=
poll
.
POLLIN
flags
=
poll
.
POLLIN
if
obj
.
writable
():
if
obj
.
writable
():
flags
=
flags
|
poll
.
POLLOUT
flags
=
flags
|
poll
.
POLLOUT
if
flags
:
if
flags
:
l
.
append
((
fd
,
flags
))
l
.
append
((
fd
,
flags
))
r
=
poll
.
poll
(
l
,
timeout
)
r
=
poll
.
poll
(
l
,
timeout
)
for
fd
,
flags
in
r
:
for
fd
,
flags
in
r
:
try
:
try
:
obj
=
map
[
fd
]
obj
=
map
[
fd
]
try
:
try
:
if
(
flags
&
poll
.
POLLIN
):
if
(
flags
&
poll
.
POLLIN
):
obj
.
handle_read_event
()
obj
.
handle_read_event
()
if
(
flags
&
poll
.
POLLOUT
):
if
(
flags
&
poll
.
POLLOUT
):
obj
.
handle_write_event
()
obj
.
handle_write_event
()
except
ExitNow
:
except
ExitNow
:
raise
ExitNow
raise
ExitNow
except
:
except
:
obj
.
handle_error
()
obj
.
handle_error
()
except
KeyError
:
except
KeyError
:
pass
pass
def
loop
(
timeout
=
30.0
,
use_poll
=
0
,
map
=
None
):
def
loop
(
timeout
=
30.0
,
use_poll
=
0
,
map
=
None
):
if
use_poll
:
if
use_poll
:
poll_fun
=
poll2
poll_fun
=
poll2
else
:
else
:
poll_fun
=
poll
poll_fun
=
poll
if
map
is
None
:
if
map
is
None
:
map
=
socket_map
map
=
socket_map
while
map
:
while
map
:
poll_fun
(
timeout
,
map
)
poll_fun
(
timeout
,
map
)
class
dispatcher
:
class
dispatcher
:
debug
=
0
debug
=
0
connected
=
0
connected
=
0
accepting
=
0
accepting
=
0
closing
=
0
closing
=
0
addr
=
None
addr
=
None
def
__init__
(
self
,
sock
=
None
,
map
=
None
):
def
__init__
(
self
,
sock
=
None
,
map
=
None
):
if
sock
:
if
sock
:
self
.
set_socket
(
sock
,
map
)
self
.
set_socket
(
sock
,
map
)
# I think it should inherit this anyway
# I think it should inherit this anyway
self
.
socket
.
setblocking
(
0
)
self
.
socket
.
setblocking
(
0
)
self
.
connected
=
1
self
.
connected
=
1
def
__repr__
(
self
):
def
__repr__
(
self
):
try
:
try
:
status
=
[]
status
=
[]
if
self
.
accepting
and
self
.
addr
:
if
self
.
accepting
and
self
.
addr
:
status
.
append
(
'listening'
)
status
.
append
(
'listening'
)
elif
self
.
connected
:
elif
self
.
connected
:
status
.
append
(
'connected'
)
status
.
append
(
'connected'
)
if
self
.
addr
:
if
self
.
addr
:
status
.
append
(
'%s:%d'
%
self
.
addr
)
status
.
append
(
'%s:%d'
%
self
.
addr
)
return
'<%s %s at %x>'
%
(
return
'<%s %s at %x>'
%
(
self
.
__class__
.
__name__
,
self
.
__class__
.
__name__
,
string
.
join
(
status
,
' '
),
string
.
join
(
status
,
' '
),
id
(
self
)
id
(
self
)
)
)
except
:
except
:
try
:
try
:
ar
=
repr
(
self
.
addr
)
ar
=
repr
(
self
.
addr
)
except
:
except
:
ar
=
'no self.addr!'
ar
=
'no self.addr!'
return
'<__repr__ (self) failed for object at %x (addr=%s)>'
%
(
id
(
self
),
ar
)
return
'<__repr__ (self) failed for object at %x (addr=%s)>'
%
(
id
(
self
),
ar
)
def
add_channel
(
self
,
map
=
None
):
def
add_channel
(
self
,
map
=
None
):
#self.log_info ('adding channel %s' % self)
#self.log_info ('adding channel %s' % self)
if
map
is
None
:
if
map
is
None
:
map
=
socket_map
map
=
socket_map
map
[
self
.
_fileno
]
=
self
map
[
self
.
_fileno
]
=
self
def
del_channel
(
self
,
map
=
None
):
def
del_channel
(
self
,
map
=
None
):
fd
=
self
.
_fileno
fd
=
self
.
_fileno
if
map
is
None
:
if
map
is
None
:
map
=
socket_map
map
=
socket_map
if
map
.
has_key
(
fd
):
if
map
.
has_key
(
fd
):
#self.log_info ('closing channel %d:%s' % (fd, self))
#self.log_info ('closing channel %d:%s' % (fd, self))
del
map
[
fd
]
del
map
[
fd
]
def
create_socket
(
self
,
family
,
type
):
def
create_socket
(
self
,
family
,
type
):
self
.
family_and_type
=
family
,
type
self
.
family_and_type
=
family
,
type
self
.
socket
=
socket
.
socket
(
family
,
type
)
self
.
socket
=
socket
.
socket
(
family
,
type
)
self
.
socket
.
setblocking
(
0
)
self
.
socket
.
setblocking
(
0
)
self
.
_fileno
=
self
.
socket
.
fileno
()
self
.
_fileno
=
self
.
socket
.
fileno
()
self
.
add_channel
()
self
.
add_channel
()
def
set_socket
(
self
,
sock
,
map
=
None
):
def
set_socket
(
self
,
sock
,
map
=
None
):
self
.
__dict__
[
'socket'
]
=
sock
self
.
__dict__
[
'socket'
]
=
sock
self
.
_fileno
=
sock
.
fileno
()
self
.
_fileno
=
sock
.
fileno
()
self
.
add_channel
(
map
)
self
.
add_channel
(
map
)
def
set_reuse_addr
(
self
):
def
set_reuse_addr
(
self
):
# try to re-use a server port if possible
# try to re-use a server port if possible
try
:
try
:
self
.
socket
.
setsockopt
(
self
.
socket
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_REUSEADDR
,
socket
.
SOL_SOCKET
,
socket
.
SO_REUSEADDR
,
self
.
socket
.
getsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_REUSEADDR
)
|
1
self
.
socket
.
getsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_REUSEADDR
)
|
1
)
)
except
:
except
:
pass
pass
# ==================================================
# ==================================================
# predicates for select()
# predicates for select()
# these are used as filters for the lists of sockets
# these are used as filters for the lists of sockets
# to pass to select().
# to pass to select().
# ==================================================
# ==================================================
def
readable
(
self
):
def
readable
(
self
):
return
1
return
1
if
os
.
name
==
'mac'
:
if
os
.
name
==
'mac'
:
# The macintosh will select a listening socket for
# The macintosh will select a listening socket for
# write if you let it. What might this mean?
# write if you let it. What might this mean?
def
writable
(
self
):
def
writable
(
self
):
return
not
self
.
accepting
return
not
self
.
accepting
else
:
else
:
def
writable
(
self
):
def
writable
(
self
):
return
1
return
1
# ==================================================
# ==================================================
# socket object methods.
# socket object methods.
# ==================================================
# ==================================================
def
listen
(
self
,
num
):
def
listen
(
self
,
num
):
self
.
accepting
=
1
self
.
accepting
=
1
if
os
.
name
==
'nt'
and
num
>
5
:
if
os
.
name
==
'nt'
and
num
>
5
:
num
=
1
num
=
1
return
self
.
socket
.
listen
(
num
)
return
self
.
socket
.
listen
(
num
)
def
bind
(
self
,
addr
):
def
bind
(
self
,
addr
):
self
.
addr
=
addr
self
.
addr
=
addr
return
self
.
socket
.
bind
(
addr
)
return
self
.
socket
.
bind
(
addr
)
def
connect
(
self
,
address
):
def
connect
(
self
,
address
):
self
.
connected
=
0
self
.
connected
=
0
try
:
try
:
self
.
socket
.
connect
(
address
)
self
.
socket
.
connect
(
address
)
except
socket
.
error
,
why
:
except
socket
.
error
,
why
:
if
why
[
0
]
in
(
EINPROGRESS
,
EALREADY
,
EWOULDBLOCK
):
if
why
[
0
]
in
(
EINPROGRESS
,
EALREADY
,
EWOULDBLOCK
):
return
return
else
:
else
:
raise
socket
.
error
,
why
raise
socket
.
error
,
why
self
.
connected
=
1
self
.
connected
=
1
self
.
handle_connect
()
self
.
handle_connect
()
def
accept
(
self
):
def
accept
(
self
):
try
:
try
:
conn
,
addr
=
self
.
socket
.
accept
()
conn
,
addr
=
self
.
socket
.
accept
()
return
conn
,
addr
return
conn
,
addr
except
socket
.
error
,
why
:
except
socket
.
error
,
why
:
if
why
[
0
]
==
EWOULDBLOCK
:
if
why
[
0
]
==
EWOULDBLOCK
:
pass
pass
else
:
else
:
raise
socket
.
error
,
why
raise
socket
.
error
,
why
def
send
(
self
,
data
):
def
send
(
self
,
data
):
try
:
try
:
result
=
self
.
socket
.
send
(
data
)
result
=
self
.
socket
.
send
(
data
)
return
result
return
result
except
socket
.
error
,
why
:
except
socket
.
error
,
why
:
if
why
[
0
]
==
EWOULDBLOCK
:
if
why
[
0
]
==
EWOULDBLOCK
:
return
0
return
0
else
:
else
:
raise
socket
.
error
,
why
raise
socket
.
error
,
why
return
0
return
0
def
recv
(
self
,
buffer_size
):
def
recv
(
self
,
buffer_size
):
try
:
try
:
data
=
self
.
socket
.
recv
(
buffer_size
)
data
=
self
.
socket
.
recv
(
buffer_size
)
if
not
data
:
if
not
data
:
# a closed connection is indicated by signaling
# a closed connection is indicated by signaling
# a read condition, and having recv() return 0.
# a read condition, and having recv() return 0.
self
.
handle_close
()
self
.
handle_close
()
return
''
return
''
else
:
else
:
return
data
return
data
except
socket
.
error
,
why
:
except
socket
.
error
,
why
:
# winsock sometimes throws ENOTCONN
# winsock sometimes throws ENOTCONN
if
why
[
0
]
in
[
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
]:
if
why
[
0
]
in
[
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
]:
self
.
handle_close
()
self
.
handle_close
()
return
''
return
''
else
:
else
:
raise
socket
.
error
,
why
raise
socket
.
error
,
why
def
close
(
self
):
def
close
(
self
):
self
.
del_channel
()
self
.
del_channel
()
self
.
socket
.
close
()
self
.
socket
.
close
()
# cheap inheritance, used to pass all other attribute
# cheap inheritance, used to pass all other attribute
# references to the underlying socket object.
# references to the underlying socket object.
def
__getattr__
(
self
,
attr
):
def
__getattr__
(
self
,
attr
):
return
getattr
(
self
.
socket
,
attr
)
return
getattr
(
self
.
socket
,
attr
)
# log and log_info maybe overriden to provide more sophisitcated
# log and log_info maybe overriden to provide more sophisitcated
# logging and warning methods. In general, log is for 'hit' logging
# logging and warning methods. In general, log is for 'hit' logging
# and 'log_info' is for informational, warning and error logging.
# and 'log_info' is for informational, warning and error logging.
def
log
(
self
,
message
):
def
log
(
self
,
message
):
sys
.
stderr
.
write
(
'log: %s
\
n
'
%
str
(
message
))
sys
.
stderr
.
write
(
'log: %s
\
n
'
%
str
(
message
))
def
log_info
(
self
,
message
,
type
=
'info'
):
def
log_info
(
self
,
message
,
type
=
'info'
):
if
__debug__
or
type
!=
'info'
:
if
__debug__
or
type
!=
'info'
:
print
'%s: %s'
%
(
type
,
message
)
print
'%s: %s'
%
(
type
,
message
)
def
handle_read_event
(
self
):
def
handle_read_event
(
self
):
if
self
.
accepting
:
if
self
.
accepting
:
# for an accepting socket, getting a read implies
# for an accepting socket, getting a read implies
# that we are connected
# that we are connected
if
not
self
.
connected
:
if
not
self
.
connected
:
self
.
connected
=
1
self
.
connected
=
1
self
.
handle_accept
()
self
.
handle_accept
()
elif
not
self
.
connected
:
elif
not
self
.
connected
:
self
.
handle_connect
()
self
.
handle_connect
()
self
.
connected
=
1
self
.
connected
=
1
self
.
handle_read
()
self
.
handle_read
()
else
:
else
:
self
.
handle_read
()
self
.
handle_read
()
def
handle_write_event
(
self
):
def
handle_write_event
(
self
):
# getting a write implies that we are connected
# getting a write implies that we are connected
if
not
self
.
connected
:
if
not
self
.
connected
:
self
.
handle_connect
()
self
.
handle_connect
()
self
.
connected
=
1
self
.
connected
=
1
self
.
handle_write
()
self
.
handle_write
()
def
handle_expt_event
(
self
):
def
handle_expt_event
(
self
):
self
.
handle_expt
()
self
.
handle_expt
()
def
handle_error
(
self
):
def
handle_error
(
self
):
(
file
,
fun
,
line
),
t
,
v
,
tbinfo
=
compact_traceback
()
(
file
,
fun
,
line
),
t
,
v
,
tbinfo
=
compact_traceback
()
# sometimes a user repr method will crash.
# sometimes a user repr method will crash.
try
:
try
:
self_repr
=
repr
(
self
)
self_repr
=
repr
(
self
)
except
:
except
:
self_repr
=
'<__repr__ (self) failed for object at %0x>'
%
id
(
self
)
self_repr
=
'<__repr__ (self) failed for object at %0x>'
%
id
(
self
)
self
.
log_info
(
self
.
log_info
(
'uncaptured python exception, closing channel %s (%s:%s %s)'
%
(
'uncaptured python exception, closing channel %s (%s:%s %s)'
%
(
self_repr
,
self_repr
,
t
,
t
,
v
,
v
,
tbinfo
tbinfo
),
),
'error'
'error'
)
)
self
.
close
()
self
.
close
()
def
handle_expt
(
self
):
def
handle_expt
(
self
):
self
.
log_info
(
'unhandled exception'
,
'warning'
)
self
.
log_info
(
'unhandled exception'
,
'warning'
)
def
handle_read
(
self
):
def
handle_read
(
self
):
self
.
log_info
(
'unhandled read event'
,
'warning'
)
self
.
log_info
(
'unhandled read event'
,
'warning'
)
def
handle_write
(
self
):
def
handle_write
(
self
):
self
.
log_info
(
'unhandled write event'
,
'warning'
)
self
.
log_info
(
'unhandled write event'
,
'warning'
)
def
handle_connect
(
self
):
def
handle_connect
(
self
):
self
.
log_info
(
'unhandled connect event'
,
'warning'
)
self
.
log_info
(
'unhandled connect event'
,
'warning'
)
def
handle_accept
(
self
):
def
handle_accept
(
self
):
self
.
log_info
(
'unhandled accept event'
,
'warning'
)
self
.
log_info
(
'unhandled accept event'
,
'warning'
)
def
handle_close
(
self
):
def
handle_close
(
self
):
self
.
log_info
(
'unhandled close event'
,
'warning'
)
self
.
log_info
(
'unhandled close event'
,
'warning'
)
self
.
close
()
self
.
close
()
# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# adds simple buffered output capability, useful for simple clients.
# adds simple buffered output capability, useful for simple clients.
...
@@ -402,63 +402,63 @@ class dispatcher:
...
@@ -402,63 +402,63 @@ class dispatcher:
# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
class
dispatcher_with_send
(
dispatcher
):
class
dispatcher_with_send
(
dispatcher
):
def
__init__
(
self
,
sock
=
None
):
def
__init__
(
self
,
sock
=
None
):
dispatcher
.
__init__
(
self
,
sock
)
dispatcher
.
__init__
(
self
,
sock
)
self
.
out_buffer
=
''
self
.
out_buffer
=
''
def
initiate_send
(
self
):
def
initiate_send
(
self
):
num_sent
=
0
num_sent
=
0
num_sent
=
dispatcher
.
send
(
self
,
self
.
out_buffer
[:
512
])
num_sent
=
dispatcher
.
send
(
self
,
self
.
out_buffer
[:
512
])
self
.
out_buffer
=
self
.
out_buffer
[
num_sent
:]
self
.
out_buffer
=
self
.
out_buffer
[
num_sent
:]
def
handle_write
(
self
):
def
handle_write
(
self
):
self
.
initiate_send
()
self
.
initiate_send
()
def
writable
(
self
):
def
writable
(
self
):
return
(
not
self
.
connected
)
or
len
(
self
.
out_buffer
)
return
(
not
self
.
connected
)
or
len
(
self
.
out_buffer
)
def
send
(
self
,
data
):
def
send
(
self
,
data
):
if
self
.
debug
:
if
self
.
debug
:
self
.
log_info
(
'sending %s'
%
repr
(
data
))
self
.
log_info
(
'sending %s'
%
repr
(
data
))
self
.
out_buffer
=
self
.
out_buffer
+
data
self
.
out_buffer
=
self
.
out_buffer
+
data
self
.
initiate_send
()
self
.
initiate_send
()
# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# used for debugging.
# used for debugging.
# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
def
compact_traceback
():
def
compact_traceback
():
t
,
v
,
tb
=
sys
.
exc_info
()
t
,
v
,
tb
=
sys
.
exc_info
()
tbinfo
=
[]
tbinfo
=
[]
while
1
:
while
1
:
tbinfo
.
append
((
tbinfo
.
append
((
tb
.
tb_frame
.
f_code
.
co_filename
,
tb
.
tb_frame
.
f_code
.
co_filename
,
tb
.
tb_frame
.
f_code
.
co_name
,
tb
.
tb_frame
.
f_code
.
co_name
,
str
(
tb
.
tb_lineno
)
str
(
tb
.
tb_lineno
)
))
))
tb
=
tb
.
tb_next
tb
=
tb
.
tb_next
if
not
tb
:
if
not
tb
:
break
break
# just to be safe
# just to be safe
del
tb
del
tb
file
,
function
,
line
=
tbinfo
[
-
1
]
file
,
function
,
line
=
tbinfo
[
-
1
]
info
=
'['
+
string
.
join
(
info
=
'['
+
string
.
join
(
map
(
map
(
lambda
x
:
string
.
join
(
x
,
'|'
),
lambda
x
:
string
.
join
(
x
,
'|'
),
tbinfo
tbinfo
),
),
'] ['
'] ['
)
+
']'
)
+
']'
return
(
file
,
function
,
line
),
t
,
v
,
info
return
(
file
,
function
,
line
),
t
,
v
,
info
def
close_all
(
map
=
None
):
def
close_all
(
map
=
None
):
if
map
is
None
:
if
map
is
None
:
map
=
socket_map
map
=
socket_map
for
x
in
map
.
values
():
for
x
in
map
.
values
():
x
.
socket
.
close
()
x
.
socket
.
close
()
map
.
clear
()
map
.
clear
()
# Asynchronous File I/O:
# Asynchronous File I/O:
#
#
...
@@ -475,42 +475,41 @@ def close_all (map=None):
...
@@ -475,42 +475,41 @@ def close_all (map=None):
import
os
import
os
if
os
.
name
==
'posix'
:
if
os
.
name
==
'posix'
:
import
fcntl
import
fcntl
import
FCNTL
import
FCNTL
class
file_wrapper
:
class
file_wrapper
:
# here we override just enough to make a file
# here we override just enough to make a file
# look like a socket for the purposes of asyncore.
# look like a socket for the purposes of asyncore.
def
__init__
(
self
,
fd
):
def
__init__
(
self
,
fd
):
self
.
fd
=
fd
self
.
fd
=
fd
def
recv
(
self
,
*
args
):
def
recv
(
self
,
*
args
):
return
apply
(
os
.
read
,
(
self
.
fd
,)
+
args
)
return
apply
(
os
.
read
,
(
self
.
fd
,)
+
args
)
def
send
(
self
,
*
args
):
def
send
(
self
,
*
args
):
return
apply
(
os
.
write
,
(
self
.
fd
,)
+
args
)
return
apply
(
os
.
write
,
(
self
.
fd
,)
+
args
)
read
=
recv
read
=
recv
write
=
send
write
=
send
def
close
(
self
):
def
close
(
self
):
return
os
.
close
(
self
.
fd
)
return
os
.
close
(
self
.
fd
)
def
fileno
(
self
):
def
fileno
(
self
):
return
self
.
fd
return
self
.
fd
class
file_dispatcher
(
dispatcher
):
class
file_dispatcher
(
dispatcher
):
def
__init__
(
self
,
fd
):
def
__init__
(
self
,
fd
):
dispatcher
.
__init__
(
self
)
dispatcher
.
__init__
(
self
)
self
.
connected
=
1
self
.
connected
=
1
# set it to non-blocking mode
# set it to non-blocking mode
flags
=
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_GETFL
,
0
)
flags
=
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_GETFL
,
0
)
flags
=
flags
|
FCNTL
.
O_NONBLOCK
flags
=
flags
|
FCNTL
.
O_NONBLOCK
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_SETFL
,
flags
)
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_SETFL
,
flags
)
self
.
set_file
(
fd
)
self
.
set_file
(
fd
)
def
set_file
(
self
,
fd
):
def
set_file
(
self
,
fd
):
self
.
_fileno
=
fd
self
.
_fileno
=
fd
self
.
socket
=
file_wrapper
(
fd
)
self
.
socket
=
file_wrapper
(
fd
)
self
.
add_channel
()
self
.
add_channel
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment