* dtable.cc (fh_oom): Remove.

(fh_calloc): Remove.
	(cnew): Redefine to handle NULL returns from cmalloc.
	(build_fh_name): Accommodate new definition of cnew.  Remove unneeded
	test for fh_oom.
	(fh_alloc): Ditto.
This commit is contained in:
Corinna Vinschen 2011-06-30 14:04:51 +00:00
parent 4b626add7e
commit 3d938be6c5
2 changed files with 46 additions and 45 deletions

View File

@ -1,3 +1,12 @@
2011-06-30 Ryan Johnson <ryan.johnson@cs.utoronto.ca>
* dtable.cc (fh_oom): Remove.
(fh_calloc): Remove.
(cnew): Redefine to handle NULL returns from cmalloc.
(build_fh_name): Accommodate new definition of cnew. Remove unneeded
test for fh_oom.
(fh_alloc): Ditto.
2011-06-30 Corinna Vinschen <corinna@vinschen.de> 2011-06-30 Corinna Vinschen <corinna@vinschen.de>
* fhandler_console.cc (fhandler_console::read): Add comment. * fhandler_console.cc (fhandler_console::read): Add comment.

View File

@ -393,17 +393,11 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle)
} }
} }
/* This is a workaround for the fact that the placement new operator #define cnew(name, ...) \
always calls the constructor, even if the placement pointer is NULL. */ ({ \
static fhandler_union fh_oom; void* ptr = (void*) ccalloc (HEAP_FHANDLER, 1, sizeof (name)); \
static void * ptr? new(ptr) name(__VA_ARGS__) : NULL; \
fh_calloc (size_t size) })
{
void *ret = ccalloc (HEAP_FHANDLER, 1, size);
return ret ?: (void *) &fh_oom;
}
#define cnew(name) new (fh_calloc (sizeof (name))) name
fhandler_base * fhandler_base *
build_fh_name (const char *name, unsigned opt, suffix_info *si) build_fh_name (const char *name, unsigned opt, suffix_info *si)
@ -411,8 +405,8 @@ build_fh_name (const char *name, unsigned opt, suffix_info *si)
path_conv pc (name, opt | PC_NULLEMPTY | PC_POSIX, si); path_conv pc (name, opt | PC_NULLEMPTY | PC_POSIX, si);
if (pc.error) if (pc.error)
{ {
fhandler_base *fh = cnew (fhandler_nodevice) (); fhandler_base *fh = cnew (fhandler_nodevice);
if (fh != (fhandler_base *) &fh_oom) if (fh)
fh->set_error (pc.error); fh->set_error (pc.error);
set_errno (fh ? pc.error : EMFILE); set_errno (fh ? pc.error : EMFILE);
return fh; return fh;
@ -441,10 +435,10 @@ fh_alloc (device dev)
switch (dev.get_major ()) switch (dev.get_major ())
{ {
case DEV_TTYS_MAJOR: case DEV_TTYS_MAJOR:
fh = cnew (fhandler_pty_slave) (dev.get_minor ()); fh = cnew (fhandler_pty_slave, dev.get_minor ());
break; break;
case DEV_CYGDRIVE_MAJOR: case DEV_CYGDRIVE_MAJOR:
fh = cnew (fhandler_cygdrive) (); fh = cnew (fhandler_cygdrive);
break; break;
case DEV_FLOPPY_MAJOR: case DEV_FLOPPY_MAJOR:
case DEV_CDROM_MAJOR: case DEV_CDROM_MAJOR:
@ -456,16 +450,16 @@ fh_alloc (device dev)
case DEV_SD5_MAJOR: case DEV_SD5_MAJOR:
case DEV_SD6_MAJOR: case DEV_SD6_MAJOR:
case DEV_SD7_MAJOR: case DEV_SD7_MAJOR:
fh = cnew (fhandler_dev_floppy) (); fh = cnew (fhandler_dev_floppy);
break; break;
case DEV_TAPE_MAJOR: case DEV_TAPE_MAJOR:
fh = cnew (fhandler_dev_tape) (); fh = cnew (fhandler_dev_tape);
break; break;
case DEV_SERIAL_MAJOR: case DEV_SERIAL_MAJOR:
fh = cnew (fhandler_serial) (); fh = cnew (fhandler_serial);
break; break;
case DEV_CONS_MAJOR: case DEV_CONS_MAJOR:
fh = cnew (fhandler_console) (dev); fh = cnew (fhandler_console, dev);
break; break;
default: default:
switch ((int) dev) switch ((int) dev)
@ -473,21 +467,21 @@ fh_alloc (device dev)
case FH_CONSOLE: case FH_CONSOLE:
case FH_CONIN: case FH_CONIN:
case FH_CONOUT: case FH_CONOUT:
fh = cnew (fhandler_console) (dev); fh = cnew (fhandler_console, dev);
break; break;
case FH_PTYM: case FH_PTYM:
fh = cnew (fhandler_pty_master) (); fh = cnew (fhandler_pty_master);
break; break;
case FH_WINDOWS: case FH_WINDOWS:
fh = cnew (fhandler_windows) (); fh = cnew (fhandler_windows);
break; break;
case FH_FIFO: case FH_FIFO:
fh = cnew (fhandler_fifo) (); fh = cnew (fhandler_fifo);
break; break;
case FH_PIPE: case FH_PIPE:
case FH_PIPER: case FH_PIPER:
case FH_PIPEW: case FH_PIPEW:
fh = cnew (fhandler_pipe) (); fh = cnew (fhandler_pipe);
break; break;
case FH_TCP: case FH_TCP:
case FH_UDP: case FH_UDP:
@ -495,72 +489,70 @@ fh_alloc (device dev)
case FH_UNIX: case FH_UNIX:
case FH_STREAM: case FH_STREAM:
case FH_DGRAM: case FH_DGRAM:
fh = cnew (fhandler_socket) (); fh = cnew (fhandler_socket);
break; break;
case FH_FS: case FH_FS:
fh = cnew (fhandler_disk_file) (); fh = cnew (fhandler_disk_file);
break; break;
case FH_NULL: case FH_NULL:
fh = cnew (fhandler_dev_null) (); fh = cnew (fhandler_dev_null);
break; break;
case FH_ZERO: case FH_ZERO:
case FH_FULL: case FH_FULL:
fh = cnew (fhandler_dev_zero) (); fh = cnew (fhandler_dev_zero);
break; break;
case FH_RANDOM: case FH_RANDOM:
case FH_URANDOM: case FH_URANDOM:
fh = cnew (fhandler_dev_random) (); fh = cnew (fhandler_dev_random);
break; break;
case FH_MEM: case FH_MEM:
case FH_PORT: case FH_PORT:
fh = cnew (fhandler_dev_mem) (); fh = cnew (fhandler_dev_mem);
break; break;
case FH_CLIPBOARD: case FH_CLIPBOARD:
fh = cnew (fhandler_dev_clipboard) (); fh = cnew (fhandler_dev_clipboard);
break; break;
case FH_OSS_DSP: case FH_OSS_DSP:
fh = cnew (fhandler_dev_dsp) (); fh = cnew (fhandler_dev_dsp);
break; break;
case FH_PROC: case FH_PROC:
fh = cnew (fhandler_proc) (); fh = cnew (fhandler_proc);
break; break;
case FH_REGISTRY: case FH_REGISTRY:
fh = cnew (fhandler_registry) (); fh = cnew (fhandler_registry);
break; break;
case FH_PROCESS: case FH_PROCESS:
case FH_PROCESSFD: case FH_PROCESSFD:
fh = cnew (fhandler_process) (); fh = cnew (fhandler_process);
break; break;
case FH_PROCNET: case FH_PROCNET:
fh = cnew (fhandler_procnet) (); fh = cnew (fhandler_procnet);
break; break;
case FH_PROCSYS: case FH_PROCSYS:
fh = cnew (fhandler_procsys) (); fh = cnew (fhandler_procsys);
break; break;
case FH_PROCSYSVIPC: case FH_PROCSYSVIPC:
fh = cnew (fhandler_procsysvipc) (); fh = cnew (fhandler_procsysvipc);
break; break;
case FH_NETDRIVE: case FH_NETDRIVE:
fh = cnew (fhandler_netdrive) (); fh = cnew (fhandler_netdrive);
break; break;
case FH_TTY: case FH_TTY:
{ {
if (iscons_dev (myself->ctty)) if (iscons_dev (myself->ctty))
fh = cnew (fhandler_console) (dev); fh = cnew (fhandler_console, dev);
else else
fh = cnew (fhandler_pty_slave) (myself->ctty); fh = cnew (fhandler_pty_slave, myself->ctty);
break; break;
} }
case FH_KMSG: case FH_KMSG:
fh = cnew (fhandler_mailslot) (); fh = cnew (fhandler_mailslot);
break; break;
} }
} }
if (fh == fh_unset) if (fh == fh_unset)
fh = cnew (fhandler_nodevice) (); fh = cnew (fhandler_nodevice);
if (fh == (fhandler_base *) &fh_oom)
fh = NULL;
return fh; return fh;
} }