diff packages/compat/posix/current/src/sem.cxx @ 115:6ed91473a1cd ecos-sw-2000-08-21

Merge from eCos master repository on 2000-08-21-22:40:54-BST
author jlarmour
date Fri, 25 Aug 2000 17:32:38 +0000
parents
children 25e238959bae
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/compat/posix/current/src/sem.cxx
@@ -0,0 +1,227 @@
+//==========================================================================
+//
+//      sem.cxx
+//
+//      POSIX semaphore implementation
+//
+//==========================================================================
+//####COPYRIGHTBEGIN####
+//                                                                          
+// -------------------------------------------                              
+// The contents of this file are subject to the Red Hat eCos Public License 
+// Version 1.1 (the "License"); you may not use this file except in         
+// compliance with the License.  You may obtain a copy of the License at    
+// http://www.redhat.com/                                                   
+//                                                                          
+// Software distributed under the License is distributed on an "AS IS"      
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the 
+// License for the specific language governing rights and limitations under 
+// the License.                                                             
+//                                                                          
+// The Original Code is eCos - Embedded Configurable Operating System,      
+// released September 30, 1998.                                             
+//                                                                          
+// The Initial Developer of the Original Code is Red Hat.                   
+// Portions created by Red Hat are                                          
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.                             
+// All Rights Reserved.                                                     
+// -------------------------------------------                              
+//                                                                          
+//####COPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):           nickg
+// Contributors:        nickg
+// Date:                2000-03-27
+// Purpose:             POSIX semaphore implementation
+// Description:         This file contains the implementation of the POSIX semaphore
+//                      functions.
+//              
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <pkgconf/hal.h>
+#include <pkgconf/kernel.h>
+#include <pkgconf/posix.h>
+
+#include <cyg/kernel/ktypes.h>          // base kernel types
+#include <cyg/infra/cyg_trac.h>         // tracing macros
+#include <cyg/infra/cyg_ass.h>          // assertion macros
+
+#include <semaphore.h>                  // our header
+
+#include "pprivate.h"                   // POSIX private header
+
+#include <cyg/kernel/thread.hxx>        // Kernel threads
+
+#include <cyg/kernel/thread.inl>        // Cyg_ThreadQueue::empty()
+
+#include <cyg/kernel/sema.hxx>          // Kernel semaphores
+
+// -------------------------------------------------------------------------
+// Internal definitions
+
+// Handle entry to a pthread package function. 
+#define SEMA_ENTRY() CYG_REPORT_FUNCTYPE( "returning %d" );
+
+// Do a semaphore package defined return. This requires the error code
+// to be placed in errno, and if it is non-zero, -1 returned as the
+// result of the function. This also gives us a place to put any
+// generic tidyup handling needed for things like signal delivery and
+// cancellation.
+#define SEMA_RETURN(err)                        \
+CYG_MACRO_START                                 \
+    int __retval = 0;                           \
+    if( err != 0 ) __retval = -1, errno = err;  \
+    CYG_REPORT_RETVAL( __retval );              \
+    return __retval;                            \
+CYG_MACRO_END
+
+//-----------------------------------------------------------------------------
+// new operator to allow us to invoke the Cyg_Thread constructor on the
+// user's semaphore object.
+
+inline void *operator new(size_t size,  void *ptr) { return (void *)ptr; };
+
+// -------------------------------------------------------------------------
+// Initialize semaphore to value.
+// pshared is not supported under eCos.
+
+externC int sem_init  (sem_t *sem, int pshared, unsigned int value)
+{
+    SEMA_ENTRY();
+
+    if( value > SEM_VALUE_MAX )
+        SEMA_RETURN(EINVAL);
+
+    Cyg_Counting_Semaphore *sema;
+
+    sema = new((void *)sem) Cyg_Counting_Semaphore(value);
+
+    sema=sema;
+    
+    SEMA_RETURN(0);
+}
+
+// -------------------------------------------------------------------------
+// Destroy the semaphore.
+
+externC int sem_destroy  (sem_t *sem)
+{
+    SEMA_ENTRY();
+
+    Cyg_Counting_Semaphore *sema = (Cyg_Counting_Semaphore *)sem;
+
+    // Check that the semaphore has no waiters
+    if( sema->waiting() )
+        SEMA_RETURN(EBUSY);
+
+    // Call the destructor
+    sema->~Cyg_Counting_Semaphore();
+    
+    SEMA_RETURN(0);
+}
+
+// -------------------------------------------------------------------------
+// Decrement value if >0 or wait for a post.
+
+externC int sem_wait  (sem_t *sem)
+{
+    int retval = 0;
+    
+    SEMA_ENTRY();
+
+    Cyg_Counting_Semaphore *sema = (Cyg_Counting_Semaphore *)sem;
+
+    if( !sema->wait() ) retval = EINTR;
+    
+    SEMA_RETURN(retval);
+}
+
+// -------------------------------------------------------------------------
+// Decrement value if >0, return -1 if not.
+
+externC int sem_trywait  (sem_t *sem)
+{
+    int retval = 0;
+    
+    SEMA_ENTRY();
+
+    Cyg_Counting_Semaphore *sema = (Cyg_Counting_Semaphore *)sem;
+
+    if( !sema->trywait() ) retval = EAGAIN;
+    
+    SEMA_RETURN(0);
+}
+
+// -------------------------------------------------------------------------
+// Increment value and wake a waiter if one is present.
+
+externC int sem_post  (sem_t *sem)
+{
+    SEMA_ENTRY();
+
+    Cyg_Counting_Semaphore *sema = (Cyg_Counting_Semaphore *)sem;
+
+    sema->post();
+    
+    SEMA_RETURN(0);
+}
+    
+
+// -------------------------------------------------------------------------
+// Get current value
+
+externC int sem_getvalue  (sem_t *sem, int *sval)
+{
+    int retval;
+    
+    SEMA_ENTRY();
+
+    Cyg_Counting_Semaphore *sema = (Cyg_Counting_Semaphore *)sem;
+
+    retval = sema->peek();
+
+    CYG_REPORT_RETVAL( retval );
+    return retval;
+}
+
+// -------------------------------------------------------------------------
+// Open an existing named semaphore, or create it.
+
+externC sem_t *sem_open  (const char *name, int oflag, ...)
+{
+    SEMA_ENTRY();
+
+    errno = ENOSYS;
+
+    CYG_REPORT_RETVAL( SEM_FAILED );
+    return SEM_FAILED;
+}
+
+// -------------------------------------------------------------------------
+// Close descriptor for semaphore.
+
+externC int sem_close  (sem_t *sem)
+{
+    SEMA_ENTRY();
+
+    SEMA_RETURN(ENOSYS);
+}   
+
+// -------------------------------------------------------------------------
+// Remove named semaphore
+
+externC int sem_unlink  (const char *name)
+{
+    SEMA_ENTRY();
+
+    SEMA_RETURN(ENOSYS);
+}    
+
+// -------------------------------------------------------------------------
+// EOF sem.cxx