00001
00002
00003
00004
00005
00006
00007 #include <iostream>
00008 #include <errno.h>
00009 #include <string.h>
00010
00011
00012 #include "SysPlusPlus/syscall.h"
00013 #include <stdio.h>
00014 #include "ComPlusPlus/Sem.h"
00015 #include "SysPlusPlus/ComException.h"
00016
00017 #include <semaphore.h>
00018
00023 compp::Sem::Sem( bool remote, const int id){
00024
00025
00026
00027 if ( remote ) {
00028 sm = new compp::ShMem ( id, sizeof ( sem_t) ,0644, false ) ;
00029 sm->Attach ();
00030 if ( NULL == ( SemIdP = (sem_t *) sm->getStartAddr() ))
00031 throw syspp::ComException ( "Cannot create shared Sempahore." );
00032
00033
00034 sem_t dummy;
00035 memset ( (void*) &dummy, 0, sizeof ( dummy ) );
00036
00037 if ( 0 == memcmp ( (void*) &dummy, (void*) SemIdP, sizeof (dummy) ) ) {
00038
00039 if ( 0 != syspp::Call::Sem_init( SemIdP, 1, 0) ) {
00040 perror ( "Sem_Init");
00041 throw syspp::ComException ( "Cannot create local Sempahore." );
00042 }
00043 }
00044
00045 } else {
00046 SemIdP = & SemId;
00047 sm = NULL;
00048 if ( 0 != syspp::Call::Sem_init( SemIdP, 1, 0) ) {
00049 perror ( "Sem_Init");
00050 throw syspp::ComException ( "Cannot create local Sempahore." );
00051 }
00052 }
00053 }
00054
00060 compp::Sem::Sem(const int Val, bool remote, const int id ) {
00061
00062
00063 if ( remote ) {
00064 sm = new compp::ShMem ( id, sizeof ( sem_t) ,0644, false ) ;
00065 sm->Attach ();
00066 if ( NULL == ( SemIdP = (sem_t *) sm->getStartAddr()))
00067 throw syspp::ComException ( "Cannot create shared Sempahores." );
00068
00069
00070 sem_t dummy;
00071 memset ( (void*) &dummy, 0, sizeof ( dummy ) );
00072
00073 if ( 0 == memcmp ( (void*) &dummy, (void*) SemIdP, sizeof (dummy) ) ) {
00074
00075 if ( 0 != syspp::Call::Sem_init( SemIdP, 1, 0) ) {
00076 perror ( "Sem_Init");
00077 throw syspp::ComException ( "Cannot create local Sempahore." );
00078 }
00079 }
00080
00081 } else {
00082 SemIdP = & SemId;
00083 sm = NULL;
00084 if ( 0 != syspp::Call::Sem_init( SemIdP, 1, Val) ) {
00085
00086 }
00087 }
00088 }
00089
00094 compp::Sem::~Sem(){
00095
00096 syspp::Call::Sem_destroy ( SemIdP );
00097 if ( sm != NULL )
00098 delete sm;
00099 }
00100
00105 bool compp::Sem::Post(){
00106
00107 if ( 0 != syspp::Call::Sem_post ( SemIdP ) ) {
00108 return false;
00109 }
00110
00111 return true;
00112 }
00113
00118 bool compp::Sem::Post(int count){
00119
00120 for ( int i=0; i <count; ++i ){
00121 if ( 0 != syspp::Call::Sem_post ( SemIdP ) ) {
00122 return false;
00123 }
00124 }
00125
00126 return true;
00127 }
00128
00136 bool compp::Sem::Wait(){
00137
00138 if ( syspp::Call::Sem_wait(SemIdP) != 0 ) {
00139 return false;
00140 }
00141 return true;
00142 }
00143
00148 bool compp::Sem::TryWait(){
00149
00150 if ( syspp::Call::Sem_trywait(SemIdP) != 0 ) {
00151 return false;
00152 }
00153 return true;
00154 }
00155
00163 int compp::Sem::Wait (int count) {
00164 int i=0;
00165 if ( count <= 0)
00166 return 0;
00167
00168 for ( i=1; i <= count; ++i ) {
00169 if ( 0 != syspp::Call::Sem_trywait ( SemIdP ) ) {
00170 if ( errno == EAGAIN )
00171 return i;
00172 else
00173 return -1;
00174 }
00175 }
00176
00177 return i-1;
00178 }
00179
00180
00181
00182 #ifdef SPECIALDEBUG
00183
00184 int main ( int argc, char *argv [] ) {
00185 int i;
00186
00187
00188 gen::Sem *g = new gen::Sem (0);
00189
00190 for ( i = 1 ; i < 100; ++ i ) {
00191
00192 g->Post();
00193 g->Wait();
00194
00195 }
00196
00197 return 0;
00198 }
00199
00200 #endif