glibc/rt/aio_cancel.c
Ulrich Drepper 7ef90c1595 Update.
1998-09-14 11:26  Ulrich Drepper  <drepper@cygnus.com>

	* wcsmbs/wcsmbs-tst1.c: Include stdlib.h.

1998-09-14  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>

	* libc-work/nis/nss_nisplus/nisplus-service.c
	(_nss_nisplus_parse_servent): Convert port in network byte order.

1998-09-14 07:53 -0400  Zack Weinberg  <zack@rabi.phys.columbia.edu>

	* stdlib/stdlib.h: Add a switch, __need_malloc_and_calloc,
	to provide only malloc and calloc.
	* include/stdlib.h: Support the above.
	* string/bits/string2.h: Use __need_malloc_and_calloc when
	including stdlib.h.
	(__string2_1bptr_p): Avoid -Wbad-function-cast warnings.

	* iconvdata/iso-2022-jp.c: Include <stdlib.h>.
	* iconvdata/iso646.c: Include <stdlib.h>.

1998-09-14 07:51 -0400  Zack Weinberg  <zack@rabi.phys.columbia.edu>

	* sunrpc/rpc_cout.c: Add braces around ambiguous else.
	* sysdeps/libm-ieee754/w_pow.c: Likewise.
	* sysdeps/libm-ieee754/w_powf.c: Likewise.
	* sysdeps/libm-ieee754/w_powl.c: Likewise.

1998-09-14 07:57 -0400  Zack Weinberg  <zack@rabi.phys.columbia.edu>

	* stdio-common/stdio_lim.h.in: New file.  All parameters
	are adjustable at build time.
	* Rules: Add a rule to build bits/stdio_lim.h from
	stdio-common/stdio_lim.h.in.  (It has to be in Rules so that
	all subdirectories know how to make the file.  It can't be
	in Makerules because then it gets built at top level and the
	dependencies are wrong.)

	* stdio-common/Makefile (distribute): Add stdio_lim.h.in.
	* sysdeps/unix/sysv/linux/Makefile: Delete rules to make
	stdio_lim.h.
	* sysdeps/unix/sysv/linux/stdio_lim.h.in: Removed.
	* sysdeps/unix/sysv/linux/Dist: Take out stdio_lim.h.in.
	* sysdeps/posix/Makefile: Removed.
	* sysdeps/posix/mk-stdiolim.c: Removed.
	* sysdeps/generic/bits/stdio_lim.h: Removed.

1998-09-12  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* argp/argp-help.c: Fixup indentation.
	* nss/nss_files/files-alias.c: Quiet -Wparentheses warning.
	* resolv/nss_dns/dns-network.c: Likewise.
	* resolv/res_send.c: Likewise.
	* rt/aio_cancel.c: Likewise.
	* rt/aio_misc.c: Likewise.

1998-09-12  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makefile (install-symbolic-link): Remove the link list file at last.
	* Makerules (install-clean-symbolic-link-list): Removed.

1998-09-12  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* timezone/tst-timezone.c: Print time in UTC to get consistent
	output.

1998-09-12  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/rtld.c (_dl_rpath): Removed.
	* elf/dl-support.c (_dl_path): Removed.
	* elf/Makefile ($(objpfx)ld.so): Don't pass -rpath.
	(CFLAGS-dl-support.c): Removed.

	* elf/dl-load.c (env_path_list): Renamed from fake_path_list.  All
	uses changed.
	(_dl_init_paths): Always set env_path_list from LD_LIBRARY_PATH,
	instead of appending it to the main map's rpath info.
	(_dl_map_object): Consistently use LD_LIBRARY_PATH after all
	DT_RPATHs.  This makes it effective again.
	(decompose_rpath): Remove second parameter, callers changed.
	(fillin_rpath): Allocate enough space in curwd.
	(expand_dynamic_string_token): Cope with get_origin returning -1.

1998-09-14  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>

	* libc-work/nis/nss_compat/compat-pwd.c: Add support for
	passwd.adjunct.

	* nis/nss_nis/nis-pwd.c (_nss_nis_getpwent_r): Correct test for
	invalid password.

1998-09-13 18:06  Ulrich Drepper  <drepper@cygnus.com>

	* locale/programs/locale.c: Update dates.
1998-09-14 11:43:26 +00:00

149 lines
4.1 KiB
C

/* Cancel requests associated with given file descriptor.
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* We use an UGLY hack to prevent gcc from finding us cheating. The
implementation of aio_cancel and aio_cancel64 are identical and so
we want to avoid code duplication by using aliases. But gcc sees
the different parameter lists and prints a warning. We define here
a function so that aio_cancel64 has no prototype. */
#define aio_cancel64 XXX
#include <aio.h>
/* And undo the hack. */
#undef aio_cancel64
#include <errno.h>
#include "aio_misc.h"
int
aio_cancel (fildes, aiocbp)
int fildes;
struct aiocb *aiocbp;
{
struct requestlist *req = NULL;
int result = AIO_ALLDONE;
/* Request the mutex. */
pthread_mutex_lock (&__aio_requests_mutex);
/* We are asked to cancel a specific AIO request. */
if (aiocbp != NULL)
{
/* If the AIO request is not for this descriptor it has no value
to look for the request block. */
if (aiocbp->aio_fildes == fildes)
{
struct requestlist *last = NULL;
req = __aio_find_req_fd (fildes);
while (req->aiocbp != (aiocb_union *) aiocbp)
{
last = req;
req = req->next_prio;
}
/* Don't remove the entry if a thread is already working on it. */
if (req->running == allocated)
result = AIO_NOTCANCELED;
else
{
/* We can remove the entry. */
if (last != NULL)
last->next_prio = req->next_prio;
else
if (req->next_prio == NULL)
{
if (req->last_fd != NULL)
req->last_fd->next_fd = req->next_fd;
if (req->next_fd != NULL)
req->next_fd->last_fd = req->last_fd;
}
else
{
if (req->last_fd != NULL)
req->last_fd->next_fd = req->next_prio;
if (req->next_fd != NULL)
req->next_fd->last_fd = req->next_prio;
req->next_prio->last_fd = req->last_fd;
req->next_prio->next_fd = req->next_fd;
/* Mark this entry as runnable. */
req->next_prio->running = yes;
}
result = AIO_CANCELED;
}
req->next_prio = NULL;
}
}
else
{
/* Find the beginning of the list of all requests for this
desriptor. */
req = __aio_find_req_fd (fildes);
/* If any request is worked on by a thread it must be the first.
So either we can delete all requests or all but the first. */
if (req != NULL)
{
if (req->running == allocated)
{
struct requestlist *old = req;
req = req->next_prio;
old->next_prio = NULL;
result = AIO_NOTCANCELED;
}
else
{
/* Remove entry from the file descriptor list. */
if (req->last_fd != NULL)
req->last_fd->next_fd = req->next_fd;
if (req->next_fd != NULL)
req->next_fd->last_fd = req->last_fd;
result = AIO_CANCELED;
}
}
}
/* Mark requests as canceled and send signal. */
while (req != NULL)
{
struct requestlist *old = req;
req->aiocbp->aiocb.__error_code = ECANCELED;
req->aiocbp->aiocb.__return_value = -1;
__aio_notify (req);
req = req->next_prio;
__aio_free_request (old);
}
/* Release the mutex. */
pthread_mutex_unlock (&__aio_requests_mutex);
return result;
}
weak_alias (aio_cancel, aio_cancel64)