summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
Diffstat (limited to 'mysys')
-rw-r--r--mysys/CMakeLists.txt2
-rw-r--r--mysys/Makefile.am4
-rw-r--r--mysys/array.c4
-rw-r--r--mysys/mf_iocache2.c17
-rw-r--r--mysys/mf_tempdir.c15
-rw-r--r--mysys/mf_tempfile.c132
-rw-r--r--mysys/my_open.c7
-rw-r--r--mysys/my_semaphore.c103
-rw-r--r--mysys/my_static.c5
-rw-r--r--mysys/my_static.h4
-rw-r--r--mysys/my_winsem.c406
11 files changed, 82 insertions, 617 deletions
diff --git a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt
index c4d67f1e552..1ae625c4c03 100644
--- a/mysys/CMakeLists.txt
+++ b/mysys/CMakeLists.txt
@@ -39,6 +39,6 @@ ADD_LIBRARY(mysys array.c charset-def.c charset.c checksum.c default.c default_m
my_mkdir.c my_mmap.c my_net.c my_once.c my_open.c my_pread.c my_pthread.c
my_quick.c my_read.c my_realloc.c my_redel.c my_rename.c my_seek.c my_sleep.c
my_static.c my_symlink.c my_symlink2.c my_sync.c my_thr_init.c my_wincond.c
- my_windac.c my_winsem.c my_winthread.c my_write.c ptr_cmp.c queues.c
+ my_windac.c my_winthread.c my_write.c ptr_cmp.c queues.c
rijndael.c safemalloc.c sha1.c string.c thr_alarm.c thr_lock.c thr_mutex.c
thr_rwlock.c tree.c typelib.c my_vle.c base64.c my_memmem.c my_getpagesize.c)
diff --git a/mysys/Makefile.am b/mysys/Makefile.am
index fd6a0f76332..fca13ab52b8 100644
--- a/mysys/Makefile.am
+++ b/mysys/Makefile.am
@@ -47,7 +47,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \
my_sync.c my_getopt.c my_mkdir.c \
default_modify.c default.c \
my_compress.c checksum.c \
- my_net.c my_semaphore.c my_port.c my_sleep.c \
+ my_net.c my_port.c my_sleep.c \
charset.c charset-def.c my_bitmap.c my_bit.c md5.c \
my_gethostbyname.c rijndael.c my_aes.c sha1.c \
my_handler.c my_netware.c my_largepage.c \
@@ -56,7 +56,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \
EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \
thr_mutex.c thr_rwlock.c \
CMakeLists.txt mf_soundex.c \
- my_conio.c my_wincond.c my_winsem.c my_winthread.c
+ my_conio.c my_wincond.c my_winthread.c
libmysys_a_LIBADD = @THREAD_LOBJECTS@
# test_dir_DEPENDENCIES= $(LIBRARIES)
# testhash_DEPENDENCIES= $(LIBRARIES)
diff --git a/mysys/array.c b/mysys/array.c
index 8f4a6087c00..60f5b255e18 100644
--- a/mysys/array.c
+++ b/mysys/array.c
@@ -15,10 +15,6 @@
/* Handling of arrays that can grow dynamicly. */
-#if defined(WIN32) || defined(__WIN__)
-#undef SAFEMALLOC /* Problems with threads */
-#endif
-
#include "mysys_priv.h"
#include "m_string.h"
diff --git a/mysys/mf_iocache2.c b/mysys/mf_iocache2.c
index b3ae18e9932..bdb5d057a16 100644
--- a/mysys/mf_iocache2.c
+++ b/mysys/mf_iocache2.c
@@ -50,7 +50,6 @@
int
my_b_copy_to_file(IO_CACHE *cache, FILE *file)
{
- byte buf[IO_SIZE];
uint bytes_in_cache;
DBUG_ENTER("my_b_copy_to_file");
@@ -58,19 +57,17 @@ my_b_copy_to_file(IO_CACHE *cache, FILE *file)
if (reinit_io_cache(cache, READ_CACHE, 0L, FALSE, FALSE))
DBUG_RETURN(1);
bytes_in_cache= my_b_bytes_in_cache(cache);
- while (bytes_in_cache > 0) {
- uint const read_bytes= min(bytes_in_cache, sizeof(buf));
- DBUG_PRINT("debug", ("Remaining %u bytes - Reading %u bytes",
- bytes_in_cache, read_bytes));
- if (my_b_read(cache, buf, read_bytes))
- DBUG_RETURN(1);
- if (my_fwrite(file, buf, read_bytes, MYF(MY_WME | MY_NABP)) == (uint) -1)
+ do
+ {
+ if (my_fwrite(file, cache->read_pos, bytes_in_cache,
+ MYF(MY_WME | MY_NABP)) == (uint) -1)
DBUG_RETURN(1);
- bytes_in_cache -= read_bytes;
- }
+ cache->read_pos= cache->read_end;
+ } while ((bytes_in_cache= my_b_fill(cache)));
DBUG_RETURN(0);
}
+
my_off_t my_b_append_tell(IO_CACHE* info)
{
/*
diff --git a/mysys/mf_tempdir.c b/mysys/mf_tempdir.c
index 8d3fc40e96d..36eecbeac09 100644
--- a/mysys/mf_tempdir.c
+++ b/mysys/mf_tempdir.c
@@ -26,12 +26,11 @@ my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist)
{
char *end, *copy;
char buff[FN_REFLEN];
- DYNAMIC_ARRAY t_arr;
DBUG_ENTER("init_tmpdir");
DBUG_PRINT("enter", ("pathlist: %s", pathlist ? pathlist : "NULL"));
pthread_mutex_init(&tmpdir->mutex, MY_MUTEX_INIT_FAST);
- if (my_init_dynamic_array(&t_arr, sizeof(char*), 1, 5))
+ if (my_init_dynamic_array(&tmpdir->full_list, sizeof(char*), 1, 5))
goto err;
if (!pathlist || !pathlist[0])
{
@@ -53,19 +52,19 @@ my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist)
strmake(buff, pathlist, (uint) (end-pathlist));
length= cleanup_dirname(buff, buff);
if (!(copy= my_strndup(buff, length, MYF(MY_WME))) ||
- insert_dynamic(&t_arr, (gptr) &copy))
+ insert_dynamic(&tmpdir->full_list, (gptr) &copy))
DBUG_RETURN(TRUE);
pathlist=end+1;
}
while (*end);
- freeze_size(&t_arr);
- tmpdir->list=(char **)t_arr.buffer;
- tmpdir->max=t_arr.elements-1;
+ freeze_size(&tmpdir->full_list);
+ tmpdir->list=(char **)tmpdir->full_list.buffer;
+ tmpdir->max=tmpdir->full_list.elements-1;
tmpdir->cur=0;
DBUG_RETURN(FALSE);
err:
- delete_dynamic(&t_arr); /* Safe to free */
+ delete_dynamic(&tmpdir->full_list); /* Safe to free */
pthread_mutex_destroy(&tmpdir->mutex);
DBUG_RETURN(TRUE);
}
@@ -88,7 +87,7 @@ void free_tmpdir(MY_TMPDIR *tmpdir)
uint i;
for (i=0; i<=tmpdir->max; i++)
my_free(tmpdir->list[i], MYF(0));
- my_free((gptr)tmpdir->list, MYF(0));
+ delete_dynamic(&tmpdir->full_list);
pthread_mutex_destroy(&tmpdir->mutex);
}
diff --git a/mysys/mf_tempfile.c b/mysys/mf_tempfile.c
index 6c412157937..c1108f85054 100644
--- a/mysys/mf_tempfile.c
+++ b/mysys/mf_tempfile.c
@@ -22,15 +22,36 @@
#include <paths.h>
#endif
-#ifdef HAVE_TEMPNAM
-#if !defined(__NETWARE__)
-extern char **environ;
-#endif
-#endif
+
/*
- Create a temporary file in a given directory
- This function should be used instead of my_tempnam() !
+ @brief
+ Create a temporary file with unique name in a given directory
+
+ @details
+ create_temp_file
+ to pointer to buffer where temporary filename will be stored
+ dir directory where to create the file
+ prefix prefix the filename with this
+ mode Flags to use for my_create/my_open
+ MyFlags Magic flags
+
+ @return
+ File descriptor of opened file if success
+ -1 and sets errno if fails.
+
+ @note
+ The behaviour of this function differs a lot between
+ implementation, it's main use is to generate a file with
+ a name that does not already exist.
+
+ When passing O_TEMPORARY flag in "mode" the file should
+ be automatically deleted
+
+ The implementation using mkstemp should be considered the
+ reference implementation when adding a new or modifying an
+ existing one
+
*/
File create_temp_file(char *to, const char *dir, const char *prefix,
@@ -38,41 +59,33 @@ File create_temp_file(char *to, const char *dir, const char *prefix,
myf MyFlags __attribute__((unused)))
{
File file= -1;
+
DBUG_ENTER("create_temp_file");
-#if defined(_MSC_VER)
+ DBUG_PRINT("enter", ("dir: %s, prefix: %s", dir, prefix));
+#if defined (__WIN__)
+
+ /*
+ Use GetTempFileName to generate a unique filename, create
+ the file and release it's handle
+ - uses up to the first three letters from prefix
+ */
+ if (GetTempFileName(dir, prefix, 0, to) == 0)
+ DBUG_RETURN(-1);
+
+ DBUG_PRINT("info", ("name: %s", to));
+
+ /*
+ Open the file without the "open only if file doesn't already exist"
+ since the file has already been created by GetTempFileName
+ */
+ if ((file= my_open(to, (mode & ~O_EXCL), MyFlags)) < 0)
{
- char temp[FN_REFLEN],*end,*res,**old_env,*temp_env[1];
- old_env=environ;
- if (dir)
- {
- end=strend(dir)-1;
- if (!dir[0])
- { /* Change empty string to current dir */
- to[0]= FN_CURLIB;
- to[1]= 0;
- dir=to;
- }
- else if (*end == FN_DEVCHAR)
- { /* Get current dir for drive */
- _fullpath(temp,dir,FN_REFLEN);
- dir=to;
- }
- else if (*end == FN_LIBCHAR && dir < end && end[-1] != FN_DEVCHAR)
- {
- strmake(to,dir,(uint) (end-dir)); /* Copy and remove last '\' */
- dir=to;
- }
- environ=temp_env; /* Force use of dir (dir not checked) */
- temp_env[0]=0;
- }
- if ((res=tempnam((char*) dir,(char *) prefix)))
- {
- strmake(to,res,FN_REFLEN-1);
- (*free)(res);
- file=my_create(to,0, mode | O_EXCL | O_NOFOLLOW, MyFlags);
- }
- environ=old_env;
+ /* Open failed, remove the file created by GetTempFileName */
+ int tmp= my_errno;
+ (void) my_delete(to, MYF(0));
+ my_errno= tmp;
}
+
#elif defined(_ZTC__)
if (!dir)
dir=getenv("TMPDIR");
@@ -101,6 +114,8 @@ File create_temp_file(char *to, const char *dir, const char *prefix,
}
strmov(convert_dirname(to,dir,NullS),prefix_buff);
org_file=mkstemp(to);
+ if (mode & O_TEMPORARY)
+ (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
file=my_register_filename(org_file, to, FILE_BY_MKSTEMP,
EE_CANTCREATEFILE, MyFlags);
/* If we didn't manage to register the name, remove the temp file */
@@ -113,6 +128,10 @@ File create_temp_file(char *to, const char *dir, const char *prefix,
}
#elif defined(HAVE_TEMPNAM)
{
+#if !defined(__NETWARE__)
+ extern char **environ;
+#endif
+
char *res,**old_env,*temp_env[1];
if (dir && !dir[0])
{ /* Change empty string to current dir */
@@ -147,40 +166,7 @@ File create_temp_file(char *to, const char *dir, const char *prefix,
#endif
}
#else
- {
- register long uniq;
- register int length;
- my_string pos,end_pos;
- /* Make an unique number */
- pthread_mutex_lock(&THR_LOCK_open);
- uniq= ((long) getpid() << 20) + (long) _my_tempnam_used++ ;
- pthread_mutex_unlock(&THR_LOCK_open);
- if (!dir && !(dir=getenv("TMPDIR"))) /* Use this if possibly */
- dir=P_tmpdir; /* Use system default */
- length=strlen(dir)+strlen(pfx)+1;
-
- DBUG_PRINT("test",("mallocing %d byte",length+8+sizeof(TMP_EXT)+1));
- if (length+8+sizeof(TMP_EXT)+1 > FN_REFLENGTH)
- errno=my_errno= ENAMETOOLONG;
- else
- {
- end_pos=strmov(to,dir);
- if (end_pos != to && end_pos[-1] != FN_LIBCHAR)
- *end_pos++=FN_LIBCHAR;
- end_pos=strmov(end_pos,pfx);
-
- for (length=0 ; length < 8 && uniq ; length++)
- {
- *end_pos++= _dig_vec_upper[(int) (uniq & 31)];
- uniq >>= 5;
- }
- (void) strmov(end_pos,TMP_EXT);
- file=my_create(to,0,
- (int) (O_RDWR | O_BINARY | O_TRUNC | O_EXCL | O_NOFOLLOW |
- O_TEMPORARY | O_SHORT_LIVED),
- MYF(MY_WME));
- }
- }
+#error No implementation found for create_temp_file
#endif
if (file >= 0)
thread_safe_increment(my_tmp_file_created,&THR_LOCK_open);
diff --git a/mysys/my_open.c b/mysys/my_open.c
index 21bdedddc48..71e243c0173 100644
--- a/mysys/my_open.c
+++ b/mysys/my_open.c
@@ -352,7 +352,12 @@ File my_sopen(const char *path, int oflag, int shflag, int pmode)
return -1; /* return error to caller */
}
- fh= _open_osfhandle((intptr_t)osfh, oflag & (_O_APPEND | _O_RDONLY | _O_TEXT));
+ if ((fh= _open_osfhandle((intptr_t)osfh,
+ oflag & (_O_APPEND | _O_RDONLY | _O_TEXT))) == -1)
+ {
+ _dosmaperr(GetLastError()); /* map error */
+ CloseHandle(osfh);
+ }
return fh; /* return handle */
}
diff --git a/mysys/my_semaphore.c b/mysys/my_semaphore.c
deleted file mode 100644
index efabd4b42d9..00000000000
--- a/mysys/my_semaphore.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* Copyright (C) 2002-2003 MySQL AB
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-/*
- Simple implementation of semaphores, needed to compile MySQL on systems
- that doesn't support semaphores.
-*/
-
-#include <my_global.h>
-#include <my_semaphore.h>
-#include <errno.h>
-
-#if !defined(__WIN__) && !defined(HAVE_SEMAPHORE_H) && defined(THREAD)
-
-int sem_init(sem_t * sem, int pshared, uint value)
-{
- sem->count=value;
- pthread_cond_init(&sem->cond, 0);
- pthread_mutex_init(&sem->mutex, 0);
- return 0;
-}
-
-int sem_destroy(sem_t * sem)
-{
- int err1,err2;
- err1=pthread_cond_destroy(&sem->cond);
- err2=pthread_mutex_destroy(&sem->mutex);
- if (err1 || err2)
- {
- errno=err1 ? err1 : err2;
- return -1;
- }
- return 0;
-}
-
-int sem_wait(sem_t * sem)
-{
- if ((errno=pthread_mutex_lock(&sem->mutex)))
- return -1;
- while (!sem->count)
- pthread_cond_wait(&sem->cond, &sem->mutex);
- if (errno)
- return -1;
- sem->count--; /* mutex is locked here */
- pthread_mutex_unlock(&sem->mutex);
- return 0;
-}
-
-int sem_trywait(sem_t * sem)
-{
- if ((errno=pthread_mutex_lock(&sem->mutex)))
- return -1;
- if (sem->count)
- sem->count--;
- else
- errno=EAGAIN;
- pthread_mutex_unlock(&sem->mutex);
- return errno ? -1 : 0;
-}
-
-
-int sem_post(sem_t * sem)
-{
- if ((errno=pthread_mutex_lock(&sem->mutex)))
- return -1;
- sem->count++;
- pthread_mutex_unlock(&sem->mutex); /* does it really matter what to do */
- pthread_cond_signal(&sem->cond); /* first: x_unlock or x_signal ? */
- return 0;
-}
-
-int sem_post_multiple(sem_t * sem, uint count)
-{
- if ((errno=pthread_mutex_lock(&sem->mutex)))
- return -1;
- sem->count+=count;
- pthread_mutex_unlock(&sem->mutex); /* does it really matter what to do */
- pthread_cond_broadcast(&sem->cond); /* first: x_unlock or x_broadcast ? */
- return 0;
-}
-
-int sem_getvalue(sem_t * sem, uint *sval)
-{
- if ((errno=pthread_mutex_lock(&sem->mutex)))
- return -1;
- *sval=sem->count;
- pthread_mutex_unlock(&sem->mutex);
- return 0;
-}
-
-#endif /* !defined(__WIN__) && !defined(HAVE_SEMAPHORE_H) && defined(THREAD) */
diff --git a/mysys/my_static.c b/mysys/my_static.c
index 95521c49ab7..42dd9d71490 100644
--- a/mysys/my_static.c
+++ b/mysys/my_static.c
@@ -69,11 +69,6 @@ my_bool my_use_large_pages= 0;
uint my_large_page_size= 0;
#endif
- /* from my_tempnam */
-#if !defined(HAVE_TEMPNAM) || defined(HPUX11)
-int _my_tempnam_used=0;
-#endif
-
/* from safe_malloc */
uint sf_malloc_prehunc=0, /* If you have problem with core- */
sf_malloc_endhunc=0, /* dump when malloc-message.... */
diff --git a/mysys/my_static.h b/mysys/my_static.h
index cbd293a0431..b438c936225 100644
--- a/mysys/my_static.h
+++ b/mysys/my_static.h
@@ -60,10 +60,6 @@ extern const char *soundex_map;
extern USED_MEM* my_once_root_block;
extern uint my_once_extra;
-#if !defined(HAVE_TEMPNAM) || defined(HPUX11)
-extern int _my_tempnam_used;
-#endif
-
extern byte *sf_min_adress,*sf_max_adress;
extern uint sf_malloc_count;
extern struct st_irem *sf_malloc_root;
diff --git a/mysys/my_winsem.c b/mysys/my_winsem.c
deleted file mode 100644
index e2713d189b2..00000000000
--- a/mysys/my_winsem.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * -------------------------------------------------------------
- *
- * Module: my_semaphore.c (Original: semaphore.c from pthreads library)
- *
- * Purpose:
- * Semaphores aren't actually part of the PThreads standard.
- * They are defined by the POSIX Standard:
- *
- * POSIX 1003.1b-1993 (POSIX.1b)
- *
- * -------------------------------------------------------------
- *
- * Pthreads-win32 - POSIX Threads Library for Win32
- * Copyright (C) 1998
- *
- * This 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.
- *
- * This 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 this library; if not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
- * MA 02111-1307, USA
- */
-
-/*
- NEED_SEM is not used in MySQL and should only be needed under
- Windows CE.
-
- The big changes compared to the original version was to not allocate
- any additional memory in sem_init() but to instead store everthing
- we need in sem_t.
-
- TODO:
- To get HAVE_CREATESEMAPHORE we have to define the struct
- in my_semaphore.h
-*/
-
-#include "mysys_priv.h"
-#ifdef __WIN__
-#include "my_semaphore.h"
-#include <errno.h>
-
-/*
- DOCPUBLIC
- This function initializes an unnamed semaphore. the
- initial value of the semaphore is 'value'
-
- PARAMETERS
- sem Pointer to an instance of sem_t
-
- pshared If zero, this semaphore may only be shared between
- threads in the same process.
- If nonzero, the semaphore can be shared between
- processes
-
- value Initial value of the semaphore counter
-
- RESULTS
- 0 Successfully created semaphore,
- -1 Failed, error in errno
-
- ERRNO
- EINVAL 'sem' is not a valid semaphore,
- ENOSPC A required resource has been exhausted,
- ENOSYS Semaphores are not supported,
- EPERM The process lacks appropriate privilege
-
-*/
-
-int
-sem_init (sem_t *sem, int pshared, unsigned int value)
-{
- int result = 0;
-
- if (pshared != 0)
- {
- /*
- We don't support creating a semaphore that can be shared between
- processes
- */
- result = EPERM;
- }
- else
- {
-#ifndef HAVE_CREATESEMAPHORE
- sem->value = value;
- sem->event = CreateEvent(NULL,
- FALSE, /* manual reset */
- FALSE, /* initial state */
- NULL);
- if (!sem->event)
- result = ENOSPC;
- else
- {
- if (value)
- SetEvent(sem->event);
- InitializeCriticalSection(&sem->sem_lock_cs);
- }
-#else /* HAVE_CREATESEMAPHORE */
- *sem = CreateSemaphore (NULL, /* Always NULL */
- value, /* Initial value */
- 0x7FFFFFFFL, /* Maximum value */
- NULL); /* Name */
- if (!*sem)
- result = ENOSPC;
-#endif /* HAVE_CREATESEMAPHORE */
- }
- if (result != 0)
- {
- errno = result;
- return -1;
- }
- return 0;
-} /* sem_init */
-
-
-/*
- DOCPUBLIC
- This function destroys an unnamed semaphore.
-
- PARAMETERS
- sem Pointer to an instance of sem_t
-
- RESULTS
- 0 Successfully destroyed semaphore,
- -1 Failed, error in errno
- ERRNO
- EINVAL 'sem' is not a valid semaphore,
- ENOSYS Semaphores are not supported,
- EBUSY Threads (or processes) are currently blocked on 'sem'
-*/
-
-int
-sem_destroy (sem_t * sem)
-{
- int result = 0;
-
-#ifdef EXTRA_DEBUG
- if (sem == NULL || *sem == NULL)
- {
- errno=EINVAL;
- return;
- }
-#endif /* EXTRA_DEBUG */
-
-#ifndef HAVE_CREATESEMAPHORE
- if (! CloseHandle(sem->event))
- result = EINVAL;
- else
- DeleteCriticalSection(&sem->sem_lock_cs);
-#else /* HAVE_CREATESEMAPHORE */
- if (!CloseHandle(*sem))
- result = EINVAL;
-#endif /* HAVE_CREATESEMAPHORE */
- if (result)
- {
- errno = result;
- return -1;
- }
- *sem=0; /* Safety */
- return 0;
-} /* sem_destroy */
-
-
-/*
- DOCPUBLIC
- This function tries to wait on a semaphore. If the
- semaphore value is greater than zero, it decreases
- its value by one. If the semaphore value is zero, then
- this function returns immediately with the error EAGAIN
-
- PARAMETERS
- sem Pointer to an instance of sem_t
-
- RESULTS
- 0 Successfully decreased semaphore,
- -1 Failed, error in errno
-
- ERRNO
- EAGAIN The semaphore was already locked,
- EINVAL 'sem' is not a valid semaphore,
- ENOSYS Semaphores are not supported,
- EINTR The function was interrupted by a signal,
- EDEADLK A deadlock condition was detected.
-*/
-
-int
-sem_trywait(sem_t * sem)
-{
-#ifndef HAVE_CREATESEMAPHORE
- /* not yet implemented! */
- int errno = EINVAL;
- return -1;
-#else /* HAVE_CREATESEMAPHORE */
-#ifdef EXTRA_DEBUG
- if (sem == NULL || *sem == NULL)
- {
- errno=EINVAL;
- return -1;
- }
-#endif /* EXTRA_DEBUG */
- if (WaitForSingleObject (*sem, 0) == WAIT_TIMEOUT)
- {
- errno= EAGAIN;
- return -1;
- }
- return 0;
-#endif /* HAVE_CREATESEMAPHORE */
-
-} /* sem_trywait */
-
-
-#ifndef HAVE_CREATESEMAPHORE
-
-static void
-ptw32_decrease_semaphore(sem_t * sem)
-{
- EnterCriticalSection(&sem->sem_lock_cs);
- DBUG_ASSERT(sem->value != 0);
- sem->value--;
- if (sem->value != 0)
- SetEvent(sem->event);
- LeaveCriticalSection(&sem->sem_lock_cs);
-}
-
-static BOOL
-ptw32_increase_semaphore(sem_t * sem, unsigned int n)
-{
- BOOL result=FALSE;
-
- EnterCriticalSection(&sem->sem_lock_cs);
- if (sem->value + n > sem->value)
- {
- sem->value += n;
- SetEvent(sem->event);
- result = TRUE;
- }
- LeaveCriticalSection(&sem->sem_lock_cs);
- return result;
-}
-
-#endif /* HAVE_CREATESEMAPHORE */
-
-
-/*
- ------------------------------------------------------
- DOCPUBLIC
- This function waits on a semaphore. If the
- semaphore value is greater than zero, it decreases
- its value by one. If the semaphore value is zero, then
- the calling thread (or process) is blocked until it can
- successfully decrease the value or until interrupted by
- a signal.
-
- PARAMETERS
- sem Pointer to an instance of sem_t
-
- RESULTS
- 0 Successfully decreased semaphore,
- -1 Failed, error in errno
-
- ERRNO
- EINVAL 'Sem' is not a valid semaphore,
- ENOSYS Semaphores are not supported,
- EINTR The function was interrupted by a signal,
- EDEADLK A deadlock condition was detected.
-*/
-
-int
-sem_wait(sem_t *sem)
-{
- int result;
-
-#ifdef EXTRA_DEBUG
- if (sem == NULL || *sem == NULL)
- {
- errno=EINVAL;
- return -1;
- }
-#endif /* EXTRA_DEBUG */
-
-#ifndef HAVE_CREATESEMAPHORE
- result=WaitForSingleObject(sem->event, INFINITE);
-#else
- result=WaitForSingleObject(*sem, INFINITE);
-#endif
- if (result == WAIT_FAILED || result == WAIT_ABANDONED_0)
- result = EINVAL;
- else if (result == WAIT_TIMEOUT)
- result = ETIMEDOUT;
- else
- result=0;
- if (result)
- {
- errno = result;
- return -1;
- }
-#ifndef HAVE_CREATESEMAPHORE
- ptw32_decrease_semaphore(sem);
-#endif /* HAVE_CREATESEMAPHORE */
- return 0;
-}
-
-
-/*
- ------------------------------------------------------
- DOCPUBLIC
- This function posts a wakeup to a semaphore. If there
- are waiting threads (or processes), one is awakened;
- otherwise, the semaphore value is incremented by one.
-
- PARAMETERS
- sem Pointer to an instance of sem_t
-
- RESULTS
- 0 Successfully posted semaphore,
- -1 Failed, error in errno
-
- ERRNO
- EINVAL 'sem' is not a valid semaphore,
- ENOSYS Semaphores are not supported,
-
-*/
-
-int
-sem_post (sem_t * sem)
-{
-#ifdef EXTRA_DEBUG
- if (sem == NULL || *sem == NULL)
- {
- errno=EINVAL;
- return -1;
- }
-#endif /* EXTRA_DEBUG */
-
-#ifndef HAVE_CREATESEMAPHORE
- if (! ptw32_increase_semaphore(sem, 1))
-#else /* HAVE_CREATESEMAPHORE */
- if (! ReleaseSemaphore(*sem, 1, 0))
-#endif /* HAVE_CREATESEMAPHORE */
- {
- errno=EINVAL;
- return -1;
- }
- return 0;
-}
-
-
-/*
- ------------------------------------------------------
- DOCPUBLIC
- This function posts multiple wakeups to a semaphore. If there
- are waiting threads (or processes), n <= count are awakened;
- the semaphore value is incremented by count - n.
-
- PARAMETERS
- sem Pointer to an instance of sem_t
- count Counter, must be greater than zero.
-
- RESULTS
- 0 Successfully posted semaphore,
- -1 Failed, error in errno
-
- ERRNO
- EINVAL 'sem' is not a valid semaphore or count is less
- than or equal to zero.
-*/
-
-int
-sem_post_multiple (sem_t * sem, unsigned int count)
-{
-#ifdef EXTRA_DEBUG
- if (sem == NULL || *sem == NULL || count <= 0)
- {
- errno=EINVAL;
- return -1;
- }
-#endif /* EXTRA_DEBUG */
-#ifndef HAVE_CREATESEMAPHORE
- if (! ptw32_increase_semaphore (sem, count))
-#else /* HAVE_CREATESEMAPHORE */
- if (! ReleaseSemaphore(*sem, count, 0))
-#endif /* HAVE_CREATESEMAPHORE */
- {
- errno = EINVAL;
- return -1;
- }
- return 0;
-}
-
-int
-sem_getvalue (sem_t *sem, unsigned int *sval)
-{
- errno = ENOSYS;
- return -1;
-} /* sem_getvalue */
-
-#endif /* __WIN__ */