00001
00002 #define __NQ_INTERNAL_SW__
00003
00004 #include "PlatformSW.h"
00005 #include "NQDeclarations.h"
00006 #include "NQLogging.h"
00007 #include <stdio.h>
00008 #include <stdlib.h>
00009 #include <assert.h>
00010
00011
00012
00013
00014 #include "NQMessage.h"
00015 #include "NQPacketQueue.h"
00016 #include "NQResponseWaitQueue.h"
00017 #include "NQMessagePool.h"
00018 #include "NQPeerList.h"
00019 #include "NQclass.h"
00020
00021 #ifdef __NEED_SOCKET_FUNCTIONS_SW__
00022
00023
00024 #if defined(PLF_UNIX_TCPIPSTACK) || defined(PLF_LWIP_TCPIPSTACK)
00025
00026 const INT32 SOCKET_ERROR = -1;
00027 const INT32 INVALID_SOCKET = -1;
00028 #endif
00029
00030 #ifdef PLF_NICHE_TCPIPSTACK
00031 #define NICHE_SO_SENDBUF_SIZE 4096
00032 #define NICHE_SO_RECVBUF_SIZE 8192
00033 #endif
00034
00035
00036 const INT32 platformMaxFdSets = PLF_MAX_FDSETS;
00037
00038
00039
00040 ONECHAR *platformIPAddrConvert( const UINT32 ip_hostorder )
00041 {
00042 static char buffer[16];
00043 UINT32 networkorder = htonl(ip_hostorder);
00044 unsigned char *b = (unsigned char *) &networkorder;
00045
00046 sprintf(buffer, "%d.%d.%d.%d", b[0], b[1], b[2], b[3]);
00047
00048 return (ONECHAR *) buffer;
00049 }
00050
00051
00052
00053
00054 UINT32 platformIPAddrConvert( const ONECHAR *ip_addr_dotted_string)
00055 {
00056
00057
00058 INT32 ip1, ip2, ip3, ip4;
00059 UINT32 ip_addr;
00060
00061 int ret = sscanf((const char *) ip_addr_dotted_string, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
00062 ret = 1;
00063
00064 if (ip1 < 0 || ip1 > 255) return INADDR_NONE;
00065 if (ip2 < 0 || ip2 > 255) return INADDR_NONE;
00066 if (ip2 < 0 || ip2 > 255) return INADDR_NONE;
00067 if (ip2 < 0 || ip2 > 255) return INADDR_NONE;
00068
00069 #ifndef PLF_ENDIANCHANGE
00070 ip_addr = (ip1&0xff) + ((ip2&0xff)<<8) + ((ip3&0xff)<<16) + ((((UINT32)ip4)&0xff)<<24);
00071 #else
00072 ip_addr = (ip4&0xff) + ((ip3&0xff)<<8) + ((ip2&0xff)<<16) + ((((UINT32)ip1)&0xff)<<24);
00073 #endif
00074
00075 return ip_addr;
00076 }
00077
00078 void platformInitializeSocketSubsystem()
00079 {
00080 #ifdef PLF_WINNT_TCPIPSTACK
00081 WSADATA wsad;
00082
00083 int ret = WSAStartup( 0x0202, &wsad);
00084 if (ret != 0) assert( 1==2 );
00085 #endif
00086 }
00087
00088 void platformDeinitializeSocketSubsystem()
00089 {
00090 #ifdef PLF_WINNT_TCPIPSTACK
00091 WSACleanup();
00092 #endif
00093 }
00094
00095
00109 socktype platformSocketCreateInet( INT32 type )
00110 {
00111 #ifdef PLF_UNIX_TCPIPSTACK
00112 return( socket( PF_INET, type, 0 ) );
00113 #endif
00114
00115 #ifdef PLF_LWIP_TCPIPSTACK
00116 return( lwip_socket( PF_INET, type, 0 ) );
00117 #endif
00118
00119 #ifdef PLF_WINNT_TCPIPSTACK
00120 socktype sockret;
00121 int cc1,cc2;
00122 int optval;
00123
00124 sockret = socket( AF_INET, type, 0 );
00125
00126 if (sockret == INVALID_SOCKET) return INVALID_SOCKET;
00127
00128 optval = SO_RECVBUF_SIZE;
00129 cc1 = setsockopt(sockret,SOL_SOCKET,SO_RCVBUF,(const char *)&optval,sizeof(int));
00130
00131 optval = SO_SENDBUF_SIZE;
00132 cc2 = setsockopt(sockret,SOL_SOCKET,SO_SNDBUF,(const char *)&optval,sizeof(int));
00133
00134 if (cc1 != 0 || cc2 != 0)
00135 {
00136 closesocket( sockret );
00137 return INVALID_SOCKET;
00138 }
00139
00140 return sockret;
00141 #endif
00142
00143 #ifdef PLF_NICHE_TCPIPSTACK
00144 socktype sockret;
00145 int cc1,cc2;
00146 int optval;
00147
00148 sockret = bsd_socket( PF_INET, type, 0 );
00149
00150 if (sockret == INVALID_SOCKET) return INVALID_SOCKET;
00151
00152 optval = NICHE_SO_RECVBUF_SIZE;
00153 cc1 = t_setsockopt(sockret,SOL_SOCKET,SO_RCVBUF,(void *)&optval,sizeof(int));
00154
00155 optval = NICHE_SO_SENDBUF_SIZE;
00156 cc2 = t_setsockopt(sockret,SOL_SOCKET,SO_SNDBUF,(void*)&optval,sizeof(int));
00157
00158 if (cc1 != 0 || cc2 != 0)
00159 {
00160 bsd_close( sockret );
00161 return INVALID_SOCKET;
00162 }
00163
00164 return sockret;
00165 #endif
00166 }
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 INT32 platformSocketConnect(socktype s, const struct sockaddr * Saddr, size_t size_sockaddr)
00184 {
00185 #if defined(PLF_UNIX_TCPIPSTACK) || defined(PLF_WINNT_TCPIPSTACK)
00186 return( connect( s, Saddr, size_sockaddr) );
00187 #endif
00188
00189 #ifdef PLF_LWIP_TCPIPSTACK
00190 return( lwip_connect( s, (sockaddr *) Saddr, size_sockaddr) );
00191 #endif
00192
00193 #ifdef PLF_NICHE_TCPIPSTACK
00194 return( bsd_connect( s, (sockaddr *) Saddr, size_sockaddr) );
00195 #endif
00196
00197 }
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 INT32 platformSocketBind( socktype s, const struct sockaddr * Saddr, size_t size_sockaddr)
00215 {
00216 #if defined(PLF_UNIX_TCPIPSTACK) || defined(PLF_WINNT_TCPIPSTACK)
00217 return( bind( s, Saddr, size_sockaddr) );
00218 #endif
00219
00220 #ifdef PLF_LWIP_TCPIPSTACK
00221 return( lwip_bind( s, (sockaddr *) Saddr, size_sockaddr) );
00222 #endif
00223
00224 #ifdef PLF_NICHE_TCPIPSTACK
00225 return( bsd_bind( s, (sockaddr *) Saddr, size_sockaddr) );
00226 #endif
00227 }
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243 INT32 platformSocketClose( socktype s )
00244 {
00245 #ifdef PLF_UNIX_TCPIPSTACK
00246
00247
00248 return( close( s ) );
00249 #endif
00250
00251 #ifdef PLF_WINNT_TCPIPSTACK
00252 const int SD_SEND_WIN = 0x01;
00253 shutdown(s, SD_SEND_WIN);
00254
00255 return( closesocket( s ) );
00256 #endif
00257
00258 #ifdef PLF_LWIP_TCPIPSTACK
00259 return( lwip_close( s ) );
00260 #endif
00261
00262 #ifdef PLF_NICHE_TCPIPSTACK
00263 return( bsd_close( s ) );
00264 #endif
00265
00266 }
00267
00268 INT32 platformSocketSelect(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
00269 {
00270 #if defined(PLF_UNIX_TCPIPSTACK) || defined(PLF_WINNT_TCPIPSTACK)
00271 return( select( n, readfds, writefds, exceptfds, timeout) );
00272 #endif
00273
00274 #ifdef PLF_LWIP_TCPIPSTACK
00275 return( lwip_select( n, readfds, writefds, exceptfds, timeout) );
00276 #endif
00277
00278 #ifdef PLF_NICHE_TCPIPSTACK
00279 return( bsd_select( n, readfds, writefds, exceptfds, timeout) );
00280 #endif
00281
00282 }
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298 INT32 platformSocketReceiveFromFunction( socktype s, UINT8 *buf, UINT32 buflen, UINT32 *ip_hostorder, UINT16 *port_hostorder)
00299 {
00300 INT32 retval;
00301
00302 struct sockaddr_in fromaddr;
00303
00304 #if defined(PLF_UNIX_TCPIPSTACK) || defined(PLF_LWIP_TCPIPSTACK)
00305 socklen_t addrlen;
00306 #endif
00307 #if defined(PLF_WINNT_TCPIPSTACK) || defined(PLF_NICHE_TCPIPSTACK)
00308 INT32 addrlen;
00309 #endif
00310
00311 addrlen = sizeof(fromaddr);
00312
00313 #if defined(PLF_UNIX_TCPIPSTACK) || defined(PLF_WINNT_TCPIPSTACK)
00314 retval = recvfrom(s, (char *) buf, (INT32) buflen, 0, (sockaddr *) &fromaddr, &addrlen );
00315 #endif
00316
00317 #ifdef PLF_LWIP_TCPIPSTACK
00318 retval = lwip_recvfrom(s, (char *) buf, (INT32) buflen, 0, (sockaddr *) &fromaddr, &addrlen );
00319 #endif
00320
00321 #ifdef PLF_NICHE_TCPIPSTACK
00322 retval = bsd_recvfrom(s, (char *) buf, (INT32) buflen, 0, (sockaddr *) &fromaddr, &addrlen );
00323 #endif
00324
00325 if (retval >= 0)
00326 {
00327 if (ip_hostorder != NULL)
00328 *ip_hostorder = ntohl(fromaddr.sin_addr.s_addr);
00329 if (port_hostorder != NULL)
00330 *port_hostorder = ntohs(fromaddr.sin_port);
00331 }
00332
00333 return retval;
00334 }
00335
00336 INT32 platformSocketSendToFunction( socktype s, const UINT8 *buf, UINT32 buflen, UINT32 ip_hostorder, UINT16 port_hostorder )
00337 {
00338 struct sockaddr_in toaddr;
00339
00340 toaddr.sin_family = AF_INET;
00341 toaddr.sin_port = htons(port_hostorder);
00342 toaddr.sin_addr.s_addr = htonl(ip_hostorder);
00343
00344 #if defined(PLF_UNIX_TCPIPSTACK) || defined(PLF_WINNT_TCPIPSTACK)
00345 return( sendto(s, (const char *) buf, (INT32) buflen, 0, (const sockaddr *) &toaddr, sizeof(toaddr)) );
00346 #endif
00347
00348 #ifdef PLF_LWIP_TCPIPSTACK
00349 return( lwip_sendto(s, (void *) buf, (INT32) buflen, 0, (sockaddr *) &toaddr, sizeof(toaddr)) );
00350 #endif
00351
00352 #ifdef PLF_NICHE_TCPIPSTACK
00353 return( bsd_sendto(s, (char *) buf, (INT32) buflen, 0, (sockaddr *) &toaddr, sizeof(toaddr)) );
00354 #endif
00355 }
00356
00357 INT32 platformSocketDisconnectUDP( socktype s)
00358 {
00359 #if defined(PLF_UNIX_TCPIPSTACK) || defined(PLF_WINNT_TCPIPSTACK)
00360 struct sockaddr disconn;
00361
00362 memset(&disconn, 0, sizeof (disconn));
00363 disconn.sa_family = AF_UNSPEC;
00364 INT32 ret = connect(s, &disconn, sizeof(disconn) );
00365 if (ret == SOCKET_ERROR) return SOCKET_ERROR;
00366
00367 return 0;
00368
00369 #endif
00370
00371 #ifdef PLF_LWIP_TCPIPSTACK
00372
00373 return 0;
00374 #endif
00375
00376 #ifdef PLF_NICHE_TCPIPSTACK
00377 struct sockaddr disconn;
00378
00379 memset(&disconn, 0, sizeof (disconn));
00380 disconn.sa_family = AF_UNSPEC;
00381 INT32 ret = bsd_connect(s, &disconn, sizeof(disconn) );
00382 if (ret == SOCKET_ERROR) return SOCKET_ERROR;
00383
00384 return 0;
00385
00386 #endif
00387
00388 }
00389
00390
00391
00392
00393
00394
00395
00396
00397 INT32 platformSocketSetNonblocking ( socktype s )
00398 {
00399 #ifdef PLF_UNIX_TCPIPSTACK
00400 return fcntl( s, F_SETFL, FNONBLOCK | FASYNC );
00401 #endif
00402
00403 #ifdef PLF_WINNT_TCPIPSTACK
00404 unsigned long nonblock = 1;
00405
00406 return( ioctlsocket( s, FIONBIO, &nonblock) );
00407 #endif
00408
00409 #ifdef PLF_LWIP_TCPIPSTACK
00410 unsigned long nonblock = 1;
00411
00412 return( lwip_ioctl( s, FIONBIO, &nonblock) );
00413 #endif
00414
00415 #ifdef PLF_NICHE_TCPIPSTACK
00416 unsigned long nonblock = 1;
00417
00418 return( bsd_ioctl( s, FIONBIO, &nonblock) );
00419 #endif
00420
00421 }
00422
00423 #endif // __NEED_SOCKET_FUNCTIONS_SW__
00424
00425
00426
00427
00428 #ifdef PLF_USING_PTHREAD
00429
00430
00431 int g_plf_send_prio;
00432 void *internalThreadProcSendStatic( LPVOID p )
00433 {
00434 CNetworkQueue *q;
00435
00436
00437
00438
00439
00440
00441
00442
00443 q = (CNetworkQueue *) p;
00444 q->SendProcessTask();
00445
00446 return NULL;
00447 }
00448
00449
00450 int g_plf_recv_prio;
00451 void *internalThreadProcReceiveStatic( LPVOID p )
00452 {
00453 CNetworkQueue *q;
00454
00455
00456
00457
00458
00459
00460
00461 q = (CNetworkQueue *) p;
00462 q->ReceiveProcessTask();
00463
00464 return NULL;
00465 }
00466
00467
00468
00469 typedef struct
00470 {
00471 pthread_t threadId1;
00472 pthread_attr_t pthread_attr;
00473 } thread_private_struct, *thread_private;
00474
00475
00476
00477 HANDLE platformCreateThread( bool sendthread, VOIDP parameter, UINT32 thread_prio_sw)
00478 {
00479 HANDLE plf_thread;
00480 thread_private hThread;
00481 int rc;
00482 int plf_prio;
00483
00484 switch( thread_prio_sw)
00485 {
00486 case SW_THREAD_PRIORITY_ABOVE_NORMAL:
00487 plf_prio = -5;
00488 break;
00489
00490 case SW_THREAD_PRIORITY_NORMAL:
00491 plf_prio = 0;
00492 break;
00493
00494 case SW_THREAD_PRIORITY_BELOW_NORMAL:
00495 plf_prio = +5;
00496 break;
00497
00498 default: return NULL;
00499 break;
00500 }
00501
00502 hThread = (thread_private) malloc(sizeof(thread_private_struct));
00503 if (hThread == NULL) return NULL;
00504
00505 if ( (rc = pthread_attr_init(&(hThread->pthread_attr))) )
00506 {
00507 NQ_DBG(( "pthread_attr_init ERROR.\n" ));
00508 free( hThread );
00509 return NULL;
00510 }
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523 if (sendthread == true)
00524 {
00525 g_plf_send_prio = plf_prio;
00526 if ( (rc = pthread_create(&(hThread->threadId1), &(hThread->pthread_attr), internalThreadProcSendStatic, parameter )) )
00527 {
00528 NQ_DBG(( "pthread_create ERROR.\n" ));
00529 pthread_attr_destroy(&(hThread->pthread_attr));
00530 free( hThread );
00531
00532 return NULL;
00533 }
00534 }
00535 else
00536 {
00537 g_plf_recv_prio = plf_prio;
00538 if ( (rc = pthread_create(&(hThread->threadId1), &(hThread->pthread_attr), internalThreadProcReceiveStatic, parameter )) )
00539 {
00540 NQ_DBG(( "pthread_create ERROR.\n" ));
00541 pthread_attr_destroy(&(hThread->pthread_attr));
00542 free( hThread );
00543
00544 return NULL;
00545 }
00546 }
00547
00548 plf_thread = hThread;
00549 return plf_thread;
00550 }
00551
00552
00553 bool platformDeleteThread( HANDLE threadhandle )
00554 {
00555 if (threadhandle == NULL) return false;
00556
00557 thread_private hThread = (thread_private) threadhandle;
00558
00559 pthread_attr_destroy(&(hThread->pthread_attr));
00560
00561 free( hThread );
00562
00563 return true;
00564 }
00565
00566
00567 typedef struct
00568 {
00569 pthread_mutex_t mutex;
00570 pthread_cond_t condition;
00571 int semCount;
00572 int semMaxCount;
00573 }sem_private_struct, *sem_private;
00574
00575
00576 HANDLE platformCreateSemaphore( UINT16 maximum_count )
00577 {
00578 HANDLE sem;
00579 int rc;
00580
00581 sem_private token;
00582
00583 token = (sem_private) malloc(sizeof(sem_private_struct));
00584
00585 if ((rc = pthread_mutex_init(&(token->mutex), NULL)))
00586 {
00587 free(token);
00588
00589 return NULL;
00590 }
00591
00592 if ((rc = pthread_cond_init(&(token->condition), NULL)))
00593 {
00594 pthread_mutex_destroy( &(token->mutex) );
00595 free(token);
00596
00597 return NULL;
00598 }
00599
00600 token->semCount = 0;
00601 token->semMaxCount = maximum_count;
00602
00603 sem = token;
00604
00605 return sem;
00606 }
00607
00608
00609 bool platformDeleteSemaphore( HANDLE semaph )
00610 {
00611 sem_private token = (sem_private) semaph;
00612
00613 if (token == NULL) return false;
00614
00615 pthread_mutex_destroy(&(token->mutex));
00616
00617 pthread_cond_destroy(&(token->condition));
00618
00619 free (token);
00620
00621 return true;
00622 }
00623
00624
00625 bool platformWaitForSemaphore( HANDLE semaph, UINT32 timeout_msec )
00626 {
00627 int rc;
00628 struct timespec tm;
00629 struct timeb tp;
00630 long sec, millisec;
00631
00632 sem_private token = (sem_private) semaph;
00633
00634 if ((rc = pthread_mutex_lock(&(token->mutex)))) return false;
00635
00636 if (timeout_msec > 0)
00637 {
00638 sec = timeout_msec / 1000;
00639 millisec = timeout_msec % 1000;
00640 ftime( &tp );
00641 tp.time += sec;
00642 tp.millitm += millisec;
00643
00644 if( tp.millitm > 999 )
00645 {
00646 tp.millitm -= 1000;
00647 tp.time++;
00648 }
00649
00650 tm.tv_sec = tp.time;
00651 tm.tv_nsec = tp.millitm * 1000000 ;
00652 }
00653
00654 while (token->semCount <= 0)
00655 {
00656 if (timeout_msec == 0)
00657 {
00658 rc = pthread_cond_wait(&(token->condition), &(token->mutex));
00659 }
00660 else
00661 {
00662 rc = pthread_cond_timedwait(&(token->condition), &(token->mutex), &tm);
00663 }
00664 if (rc && (errno != EINTR) )
00665 break;
00666 }
00667
00668 if (rc)
00669 {
00670 if ( pthread_mutex_unlock(&(token->mutex)) ) return false;
00671
00672 if ( rc == ETIMEDOUT )
00673 {
00674
00675 return false;
00676 }
00677
00678 return false;
00679 }
00680
00681 token->semCount--;
00682
00683 if ((rc = pthread_mutex_unlock(&(token->mutex)))) return false;
00684
00685 return true;
00686 }
00687
00688
00689 bool platformSignalSemaphore( HANDLE semaphore )
00690 {
00691 bool retval = true;
00692 int rc;
00693
00694 sem_private token = (sem_private) semaphore;
00695
00696 if (token == NULL) return false;
00697
00698 if ((rc = pthread_mutex_lock(&(token->mutex)))) return false;
00699
00700 if (token->semCount < token->semMaxCount)
00701 {
00702 token->semCount ++;
00703 }
00704 else retval = false;
00705
00706 if ((rc = pthread_mutex_unlock(&(token->mutex)))) return false;
00707
00708 if (retval == true) if ((rc = pthread_cond_signal(&(token->condition)))) return false;
00709
00710 return retval;
00711 }
00712
00713
00714 bool platformIsSemaphoreSignalled( HANDLE semaph )
00715 {
00716 int rc;
00717 bool retval = true;
00718
00719 assert( semaph != NULL );
00720
00721 sem_private token = (sem_private) semaph;
00722
00723 if ((rc = pthread_mutex_lock(&(token->mutex)))) return false;
00724
00725
00726
00727 if (token->semCount <= 0) retval = false;
00728 if (retval == true) token->semCount--;
00729
00730 if ((rc = pthread_mutex_unlock(&(token->mutex)))) return false;
00731
00732 return retval;
00733 }
00734
00735
00736 typedef struct
00737 {
00738 pthread_mutex_t mutex;
00739 pthread_cond_t condition;
00740 bool mutex_set;
00741 }mtx_private_struct, *mutex_private;
00742
00743
00744 HANDLE platformCreateMutex()
00745 {
00746 mutex_private mutexstruct;
00747 int rc=0;
00748 HANDLE mutex_ret;
00749
00750 mutexstruct = (mutex_private) malloc(sizeof(mtx_private_struct));
00751 if (mutexstruct == NULL) return NULL;
00752
00753
00754 if ( (rc = pthread_mutex_init( &(mutexstruct->mutex), NULL) ))
00755 {
00756 free( mutexstruct );
00757 return NULL;
00758 }
00759
00760 if( (rc = pthread_cond_init(&(mutexstruct->condition), NULL)) )
00761 {
00762 pthread_mutex_destroy( &(mutexstruct->mutex) );
00763 free(mutexstruct);
00764
00765 return NULL;
00766 }
00767
00768 mutexstruct->mutex_set = false;
00769
00770 mutex_ret = mutexstruct;
00771
00772 return mutex_ret;
00773 }
00774
00775
00776 bool platformDeleteMutex( HANDLE mutex )
00777 {
00778 if (mutex == NULL) return false;
00779 int rc;
00780 mutex_private mutexstruct = (mutex_private) mutex;
00781
00782 if ( (rc = pthread_cond_destroy(&(mutexstruct->condition))) ) return false;
00783 if ( (rc = pthread_mutex_destroy(&(mutexstruct->mutex))) ) return false;
00784
00785 free(mutexstruct);
00786
00787 return true;
00788 }
00789
00790
00791 bool platformWaitForMutex( HANDLE mutex, UINT32 timeout_msec )
00792 {
00793 if (mutex == NULL) return false;
00794
00795 mutex_private mutexstruct = (mutex_private) mutex;
00796 int rc=0;
00797 struct timespec tm;
00798 struct timeb tp;
00799 long sec, millisec;
00800
00801
00802 if ((rc = pthread_mutex_lock(&(mutexstruct->mutex)))) return false;
00803
00804 if (mutexstruct->mutex_set == false)
00805 {
00806 return true;
00807 }
00808
00809 if (timeout_msec > 0)
00810 {
00811 sec = timeout_msec / 1000;
00812 millisec = timeout_msec % 1000;
00813 ftime( &tp );
00814 tp.time += sec;
00815 tp.millitm += millisec;
00816
00817 if( tp.millitm > 999 )
00818 {
00819 tp.millitm -= 1000;
00820 tp.time++;
00821 }
00822
00823 tm.tv_sec = tp.time;
00824 tm.tv_nsec = tp.millitm * 1000000 ;
00825 }
00826
00827 do
00828 {
00829 if (timeout_msec == 0)
00830 {
00831 rc = pthread_cond_wait(&(mutexstruct->condition), &(mutexstruct->mutex));
00832 }
00833 else
00834 {
00835 rc = pthread_cond_timedwait(&(mutexstruct->condition), &(mutexstruct->mutex), &tm);
00836 }
00837 if (rc && (errno != EINTR) ) break;
00838 }
00839 while (mutexstruct->mutex_set == true);
00840
00841
00842 if (rc)
00843 {
00844 if ( pthread_mutex_unlock(&(mutexstruct->mutex)) ) return false;
00845
00846 if ( rc == ETIMEDOUT ) return false;
00847
00848 return false;
00849 }
00850
00851 if ((rc = pthread_mutex_lock(&(mutexstruct->mutex)))) return false;
00852 mutexstruct->mutex_set = true;
00853
00854
00855 return true;
00856 }
00857
00858
00859 bool platformSignalMutex( HANDLE mutex )
00860 {
00861
00862
00863 if (mutex == NULL) return false;
00864 mutex_private mutexstruct = (mutex_private) mutex;
00865 int rc=0;
00866
00867 if ((rc = pthread_mutex_unlock(&(mutexstruct->mutex))) ) return false;
00868 mutexstruct->mutex_set = false;
00869 pthread_cond_signal(&(mutexstruct->condition));
00870
00871 return true;
00872 }
00873
00874 #endif // PLF_USING_PTHREAD only
00875
00876 #if defined(PLF_SYSTEM_SOLARIS) || defined(PLF_SYSTEM_LINUX) || defined(PLF_SYSTEM_NIOS2)
00877
00878
00879 UINT32 platformGetLastError()
00880 {
00881 return( errno );
00882 }
00883
00884
00885 INT32 platformSocketGetLastError()
00886 {
00887 return( errno );
00888 }
00889
00890
00891 ONECHAR *platformGetOSErrorString( UINT32 intOSLastError, ONECHAR *lasterrorstr, UINT32 maxlength_lasterrorstr)
00892 {
00893 char *lbuf = strerror( intOSLastError );
00894 unsigned int len = strlen(lbuf);
00895
00896 if (len >= maxlength_lasterrorstr) len = maxlength_lasterrorstr - 1;
00897 memcpy(lasterrorstr, lbuf, len);
00898 lasterrorstr[len] = 0;
00899
00900 return lasterrorstr;
00901 }
00902
00903
00904 #endif // unix, solaris, nios2 only
00905
00906
00907
00908 #ifdef PLF_SYSTEM_WINNT
00909
00910
00911 UINT32 platformGetLastError()
00912 {
00913 return( GetLastError() );
00914 }
00915
00916
00917 INT32 platformSocketGetLastError()
00918 {
00919 INT32 lasterr = WSAGetLastError();
00920 INT32 retcode;
00921
00922 switch( lasterr )
00923 {
00924 case WSAEADDRNOTAVAIL: retcode = EADDRNOTAVAIL;
00925 break;
00926
00927 case WSAEAFNOSUPPORT: retcode = EAFNOSUPPORT;
00928 break;
00929
00930 case WSAEALREADY: retcode = EALREADY;
00931 break;
00932
00933 case WSAEBADF: retcode = EBADF;
00934 break;
00935
00936 case WSAECONNREFUSED: retcode = ECONNREFUSED;
00937 break;
00938
00939 case WSAEINPROGRESS: retcode = EINPROGRESS;
00940 break;
00941
00942 case WSAEINTR: retcode = EINTR;
00943 break;
00944
00945 case WSAEISCONN: retcode = EISCONN;
00946 break;
00947
00948 case WSAENETUNREACH: retcode = ENETUNREACH;
00949 break;
00950
00951 case WSAENOTSOCK: retcode = ENOTSOCK;
00952 break;
00953
00954 case WSAEPROTOTYPE: retcode = EPROTOTYPE;
00955 break;
00956
00957 case WSAETIMEDOUT: retcode = ETIMEDOUT;
00958 break;
00959
00960 case WSAEADDRINUSE: retcode = EADDRINUSE;
00961 break;
00962
00963 case WSAECONNRESET: retcode = ECONNRESET;
00964 break;
00965
00966 case WSAEHOSTUNREACH: retcode = EHOSTUNREACH;
00967 break;
00968
00969 case WSAEINVAL: retcode = EINVAL;
00970 break;
00971
00972 case WSAEHOSTDOWN: retcode = EHOSTDOWN;
00973 break;
00974
00975 case WSAENAMETOOLONG: retcode = ENAMETOOLONG;
00976 break;
00977
00978 case WSAENETDOWN: retcode = ENETDOWN;
00979 break;
00980
00981 case WSAEWOULDBLOCK: retcode = EAGAIN;
00982 break;
00983
00984 default: retcode = EUNKNOWN;
00985 break;
00986
00987 }
00988
00989 return retcode;
00990 }
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013 ONECHAR *platformGetOSErrorString( UINT32 intOSLastError, ONECHAR *lasterrorstr, UINT32 maxlength_lasterrorstr)
01014 {
01015 assert( lasterrorstr != NULL );
01016
01017 LPSTR MessageBuffer;
01018 DWORD dwBufferLength;
01019
01020 DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
01021 FORMAT_MESSAGE_IGNORE_INSERTS |
01022 FORMAT_MESSAGE_FROM_SYSTEM ;
01023
01024
01025
01026
01027
01028
01029
01030 strcpy((char *) lasterrorstr, "Unknown error.");
01031
01032 dwBufferLength = FormatMessageA(dwFormatFlags,
01033 NULL,
01034 intOSLastError,
01035 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
01036 (LPSTR) &MessageBuffer,
01037 0,
01038 NULL);
01039 if (dwBufferLength > 0)
01040 {
01041
01042 if (MessageBuffer[strlen(MessageBuffer)-1] == 10) MessageBuffer[strlen(MessageBuffer)-1] = 0;
01043 if (MessageBuffer[strlen(MessageBuffer)-1] == 13) MessageBuffer[strlen(MessageBuffer)-1] = 0;
01044
01045
01046 unsigned int len = strlen(MessageBuffer);
01047
01048 if (len >= maxlength_lasterrorstr) len = maxlength_lasterrorstr - 1;
01049 memcpy(lasterrorstr, MessageBuffer, len);
01050 lasterrorstr[len] = 0;
01051
01052 LocalFree(MessageBuffer);
01053 }
01054
01055 return lasterrorstr;
01056 }
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078 int g_plf_send_prio;
01079 HANDLE g_plf_send_thread;
01080
01081 DWORD WINAPI internalThreadProcSendStatic( LPVOID p )
01082 {
01083 CNetworkQueue *q;
01084
01085 BOOL ret = SetThreadPriority( g_plf_send_thread, g_plf_send_prio);
01086 assert( ret == TRUE );
01087
01088 q = (CNetworkQueue *) p;
01089 q->SendProcessTask();
01090
01091 return 0;
01092 }
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107 int g_plf_recv_prio;
01108 HANDLE g_plf_recv_thread;
01109
01110 DWORD WINAPI internalThreadProcReceiveStatic( LPVOID p )
01111 {
01112 CNetworkQueue *q;
01113
01114 BOOL ret = SetThreadPriority( g_plf_recv_thread, g_plf_recv_prio);
01115 assert( ret == TRUE );
01116
01117 q = (CNetworkQueue *) p;
01118 q->ReceiveProcessTask();
01119
01120 return 0;
01121 }
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142 HANDLE platformCreateThread( bool sendthread, VOIDP parameter, UINT32 thread_prio_sw)
01143 {
01144 HANDLE plf_thread;
01145 int plf_prio;
01146
01147 switch( thread_prio_sw)
01148 {
01149
01150 case SW_THREAD_PRIORITY_ABOVE_NORMAL:
01151 plf_prio = THREAD_PRIORITY_ABOVE_NORMAL;
01152 break;
01153
01154 case SW_THREAD_PRIORITY_NORMAL:
01155 plf_prio = THREAD_PRIORITY_NORMAL;
01156 break;
01157
01158 case SW_THREAD_PRIORITY_BELOW_NORMAL:
01159 plf_prio = THREAD_PRIORITY_BELOW_NORMAL;
01160 break;
01161
01162 default: return NULL;
01163 break;
01164
01165 }
01166
01167 if (sendthread == true)
01168 {
01169 DWORD dummy_thread_id_send;
01170 plf_thread = CreateThread(NULL, 0, internalThreadProcSendStatic, parameter, CREATE_SUSPENDED, &dummy_thread_id_send );
01171 if (plf_thread != NULL)
01172 {
01173 g_plf_send_prio = plf_prio;
01174 g_plf_send_thread = plf_thread;
01175 ResumeThread(g_plf_send_thread);
01176 }
01177 }
01178 else
01179 {
01180 DWORD dummy_thread_id_recv;
01181 plf_thread = CreateThread(NULL, 0, internalThreadProcReceiveStatic, parameter, CREATE_SUSPENDED, &dummy_thread_id_recv );
01182 if (plf_thread != NULL)
01183 {
01184 g_plf_recv_prio = plf_prio;
01185 g_plf_recv_thread = plf_thread;
01186 ResumeThread(g_plf_recv_thread);
01187 }
01188 }
01189
01190 if (plf_thread == NULL) return NULL;
01191
01192 return plf_thread;
01193 }
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205 bool platformDeleteThread( HANDLE threadhandle )
01206 {
01207 if (threadhandle == NULL) return false;
01208
01209 if (CloseHandle( threadhandle ) == TRUE) return true;
01210
01211 return false;
01212 }
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232 HANDLE platformCreateSemaphore( UINT16 maximum_count )
01233 {
01234 HANDLE sem;
01235
01236 sem = CreateSemaphore(NULL, 0, maximum_count, NULL);
01237 if (sem == NULL) return( NULL );
01238
01239 return sem;
01240 }
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251 bool platformDeleteSemaphore( HANDLE semaph )
01252 {
01253 if (semaph == NULL) return false;
01254
01255 if (CloseHandle( semaph ) == TRUE) return true;
01256
01257 return false;
01258 }
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275 bool platformWaitForSemaphore( HANDLE semaph, UINT32 timeout_msec )
01276 {
01277 assert( semaph != NULL);
01278
01279 if (timeout_msec == 0) timeout_msec = INFINITE;
01280
01281 DWORD ret = WaitForSingleObject(semaph, timeout_msec);
01282 if (ret == WAIT_OBJECT_0) return true;
01283
01284 return false;
01285 }
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304 bool platformIsSemaphoreSignalled( HANDLE semaph )
01305 {
01306 assert( semaph != NULL);
01307
01308 DWORD ret = WaitForSingleObject(semaph, 0);
01309 if (ret == WAIT_OBJECT_0) return true;
01310
01311 return false;
01312 }
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329 bool platformSignalSemaphore( HANDLE semaphore )
01330 {
01331 assert( semaphore != NULL );
01332
01333 BOOL ret = ReleaseSemaphore( semaphore, 1, NULL);
01334
01335 if (ret == TRUE) return true;
01336
01337 return false;
01338 }
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357 HANDLE platformCreateMutex()
01358 {
01359 HANDLE sem;
01360
01361 sem = CreateSemaphore(NULL, 1, 1, NULL);
01362 if (sem == NULL) return( NULL );
01363
01364 return sem;
01365 }
01366
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376 bool platformDeleteMutex( HANDLE binsem )
01377 {
01378 if (binsem == NULL) return false;
01379
01380 if (CloseHandle( binsem ) == TRUE) return true;
01381
01382 return false;
01383 }
01384
01385
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395
01396
01397
01398
01399
01400
01401 bool platformWaitForMutex( HANDLE binsem, UINT32 timeout_msec )
01402 {
01403 UINT32 iter=0;
01404 bool retval = false;
01405
01406 assert( binsem != NULL );
01407
01408 if (timeout_msec == 0) timeout_msec = INFINITE;
01409
01410
01411 while( 1==1 )
01412 {
01413 iter++;
01414 DWORD ret = WaitForSingleObject(binsem, timeout_msec);
01415 if (ret == WAIT_OBJECT_0)
01416 {
01417 retval = true;
01418 break;
01419 }
01420
01421 NQ_DEBUGMODE_ONLY(if (ret == WAIT_FAILED) NQ_DBG(("plfWaitForMutex(win): WAIT_FAILED glerror=%d\n", GetLastError())));
01422 NQ_DEBUGMODE_ONLY(if (ret == WAIT_ABANDONED) NQ_DBG(("plfWaitForMutex(win): WAIT_ABANDONED glerror=%d\n", GetLastError() )));
01423
01424 if ((ret == WAIT_FAILED) || (ret == WAIT_ABANDONED)) break;
01425 }
01426
01427 NQ_DEBUGMODE_ONLY(if (iter > 1) NQ_DBG(("plfWaitForMutex(win): required %u iterations of %u msec before mutex was signalled.\n", iter, timeout_msec)));
01428
01429 return retval;
01430 }
01431
01432
01433
01434
01435
01436
01437
01438
01439
01440
01441
01442
01443
01444
01445
01446
01447
01448 bool platformSignalMutex( HANDLE binsem )
01449 {
01450 assert( binsem != NULL );
01451
01452 if (ReleaseSemaphore(binsem,1, NULL) == TRUE) return true;
01453
01454 return false;
01455 }
01456
01457 #endif // PLF_SYSTEM_WINNT
01458
01459 #ifdef SYSTEM_NIOS2_NICHE
01460
01461 void internalThreadProcSendStatic( LPVOID p )
01462 {
01463 CNetworkQueue *q;
01464
01465 q = (CNetworkQueue *) p;
01466 q->SendProcessTask();
01467 OSTaskDel(OS_PRIO_SELF);
01468 }
01469
01470
01471 void internalThreadProcReceiveStatic( LPVOID p )
01472 {
01473 CNetworkQueue *q;
01474
01475 q = (CNetworkQueue *) p;
01476 q->ReceiveProcessTask();
01477 OSTaskDel(OS_PRIO_SELF);
01478 }
01479
01480
01481
01482
01483
01484
01485
01486 TK_OBJECT(to_internalThreadProcReceiveStatic);
01487 TK_ENTRY(internalThreadProcReceiveStatic);
01488
01489 TK_OBJECT(to_internalThreadProcSendStatic);
01490 TK_ENTRY(internalThreadProcSendStatic);
01491
01492
01493
01494 struct inet_taskinfo SendStatic = {
01495 &to_internalThreadProcSendStatic,
01496 "send task (network queue)",
01497 internalThreadProcSendStatic,
01498 SENDTASK_PRIO_SW,
01499 TASK_STACK_SIZE_SW,
01500 };
01501
01502
01503
01504 struct inet_taskinfo ReceiveStatic = {
01505 &to_internalThreadProcReceiveStatic,
01506 "recv task (network queue)",
01507 internalThreadProcReceiveStatic,
01508 RECVTASK_PRIO_SW,
01509 TASK_STACK_SIZE_SW,
01510
01511 };
01512
01513 HANDLE platformCreateThread( bool sendthread, VOIDP parameter, UINT32 prio_not_used)
01514 {
01515 int err;
01516 INT32U prio;
01517
01518 if (sendthread == true)
01519 {
01520 SendStatic.task_parameter = parameter;
01521 err = TK_NEWTASK(&SendStatic);
01522 prio = SendStatic.priority;
01523 }
01524 else
01525 {
01526 ReceiveStatic.task_parameter = parameter;
01527 err = TK_NEWTASK(&ReceiveStatic);
01528 prio = ReceiveStatic.priority;
01529 }
01530
01531 if (err == 0)
01532 {
01533 return (OS_EVENT *) prio;
01534 }
01535
01536 return NULL;
01537 }
01538
01539 bool platformDeleteThread( HANDLE threadhandle )
01540 {
01541 INT32U tmp = (INT32U) threadhandle;
01542 INT8U prio = (INT8U) tmp;
01543
01544 if (threadhandle == NULL) return false;
01545 INT8U err = OSTaskDel(prio);
01546 if (err == OS_NO_ERR) return true;
01547
01548 return false;
01549 }
01550 #endif
01551
01552 #ifdef SYSTEM_NIOS2_LWIP
01553
01554
01555
01556
01557
01558
01559
01560 UINT32 internalThreadProcSendStatic( LPVOID p )
01561 {
01562 CNetworkQueue *q;
01563
01564 q = (CNetworkQueue *) p;
01565 q->SendProcessTask();
01566 OSTaskDel(OS_PRIO_SELF);
01567
01568 return 0;
01569 }
01570
01571
01572 UINT32 internalThreadProcReceiveStatic( LPVOID p )
01573 {
01574 CNetworkQueue *q;
01575
01576 q = (CNetworkQueue *) p;
01577 q->ReceiveProcessTask();
01578 OSTaskDel(OS_PRIO_SELF);
01579
01580 return 0;
01581 }
01582
01583
01584
01585 static OS_STK SendTaskStack[TASK_STACK_SIZE_SW/sizeof(OS_STK)];
01586
01587
01588 static OS_STK ReceiveTaskStack[TASK_STACK_SIZE_SW/sizeof(OS_STK)];
01589
01590
01591
01592 HANDLE platformCreateThread( bool sendthread, VOIDP parameter, UINT32 prio_not_used)
01593 {
01594 INT8U err;
01595 INT32U prio;
01596
01597 if (sendthread == true)
01598 {
01599
01600 #if OS_STK_GROWTH == 0
01601 err = OSTaskCreateExt((void(*)(void*))internalThreadProcSendStatic, parameter,
01602 &SendTaskStack[0], SENDTASK_PRIO_SW, SENDTASK_PRIO_SW,
01603 &SendTaskStack[(TASK_STACK_SIZE_SW/sizeof(OS_STK))-1], (TASK_STACK_SIZE_SW/sizeof(OS_STK)),
01604 NULL, TASK_STACK_CHECKING_SW);
01605 #else
01606 err = OSTaskCreateExt((void(*)(void*))internalThreadProcSendStatic, parameter,
01607 &SendTaskStack[(TASK_STACK_SIZE_SW/sizeof(OS_STK))-1], SENDTASK_PRIO_SW,
01608 SENDTASK_PRIO_SW, &SendTaskStack[0], (TASK_STACK_SIZE_SW/sizeof(OS_STK)),
01609 NULL, TASK_STACK_CHECKING_SW);
01610 #endif
01611 prio = SENDTASK_PRIO_SW;
01612 }
01613 else
01614 {
01615 #if OS_STK_GROWTH == 0
01616 err = OSTaskCreateExt((void(*)(void*))internalThreadProcReceiveStatic, parameter,
01617 &ReceiveTaskStack[0], RECVTASK_PRIO_SW, RECVTASK_PRIO_SW,
01618 &ReceiveTaskStack[(TASK_STACK_SIZE_SW/sizeof(OS_STK))-1], (TASK_STACK_SIZE_SW/sizeof(OS_STK)),
01619 NULL, TASK_STACK_CHECKING_SW);
01620 #else
01621 err = OSTaskCreateExt((void(*)(void*))internalThreadProcReceiveStatic, parameter,
01622 &ReceiveTaskStack[(TASK_STACK_SIZE_SW/sizeof(OS_STK))-1], RECVTASK_PRIO_SW,
01623 RECVTASK_PRIO_SW, &ReceiveTaskStack[0], (TASK_STACK_SIZE_SW/sizeof(OS_STK)),
01624 NULL, TASK_STACK_CHECKING_SW);
01625 #endif
01626 prio = RECVTASK_PRIO_SW;
01627 }
01628
01629 if (err == OS_NO_ERR)
01630 {
01631 return (OS_EVENT *) prio;
01632 }
01633
01634 return NULL;
01635 }
01636
01637
01638 bool platformDeleteThread( HANDLE threadhandle )
01639 {
01640 INT32U tmp = (INT32U) threadhandle;
01641 INT8U prio = (INT8U) tmp;
01642
01643 if (threadhandle == NULL) return false;
01644 INT8U err = OSTaskDel(prio);
01645 if (err == OS_NO_ERR) return true;
01646
01647 return false;
01648 }
01649 #endif
01650
01651 #ifdef PLF_SYSTEM_NIOS2
01652
01653
01654
01655
01656
01657
01658
01659
01660
01661
01662
01663 typedef struct
01664 {
01665 OS_EVENT *binlock;
01666 OS_EVENT *ucosSemaphore;
01667 UINT16 semMaxCount;
01668 }sem_private_struct, *sem_private;
01669
01670
01671 HANDLE platformCreateSemaphore( UINT16 maximum_count )
01672 {
01673 sem_private token;
01674 INT8U err;
01675
01676 if (maximum_count < 1) return NULL;
01677
01678 token = (sem_private) malloc(sizeof(sem_private_struct));
01679 if (token == NULL) return NULL;
01680
01681 token->semMaxCount = maximum_count;
01682 token->ucosSemaphore = OSSemCreate(0);
01683 if (token->ucosSemaphore == NULL )
01684 {
01685 free( token );
01686 return NULL;
01687 }
01688
01689 token->binlock = OSSemCreate(1);
01690 if (token->binlock == NULL )
01691 {
01692 OSSemDel( token->ucosSemaphore, OS_DEL_ALWAYS, &err);
01693 free( token );
01694 return NULL;
01695 }
01696
01697 return (HANDLE) token;
01698 }
01699
01700
01701
01702 bool platformDeleteSemaphore( HANDLE semaph )
01703 {
01704 INT8U err;
01705
01706 sem_private token = (sem_private) semaph;
01707 if (token == NULL) return false;
01708
01709 double bintimeouttmp = (BINLOCK_SEM_TIMEOUT / 1000.0)*(OS_TICKS_PER_SEC*1.0);
01710 INT16U bintimeout_ticks = (INT16U) bintimeouttmp;
01711
01712 OSSemPend(token->binlock, bintimeout_ticks, &err);
01713 if (err != OS_NO_ERR) return false;
01714
01715 OSSemDel( token->ucosSemaphore, OS_DEL_NO_PEND, &err);
01716 if (err != OS_NO_ERR)
01717 {
01718 OSSemPost(token->binlock);
01719 return false;
01720 }
01721
01722 OSSemDel( token->binlock, OS_DEL_ALWAYS, &err);
01723 if (err != OS_NO_ERR) return false;
01724
01725 free( token );
01726
01727 return true;
01728 }
01729
01730
01731 bool platformWaitForSemaphore( HANDLE semaph, UINT32 timeout_msec )
01732 {
01733 INT8U err;
01734 bool retval=true;
01735
01736 sem_private token = (sem_private) semaph;
01737 if (token == NULL) return false;
01738
01739 INT16U timeout_ticks = (INT16U) ((timeout_msec*OS_TICKS_PER_SEC)/1000);
01740
01741 OSSemPend(token->ucosSemaphore, timeout_ticks, &err);
01742 if (err != OS_NO_ERR) retval = false;
01743
01744
01745 return retval;
01746 }
01747
01748
01749 bool platformSignalSemaphore( HANDLE semaphore )
01750 {
01751 static INT16U bintimeout_ticks=0;
01752 OS_SEM_DATA sembuf;
01753 INT8U err;
01754 bool retval = true;
01755
01756 sem_private token = (sem_private) semaphore;
01757 if (token == NULL) return false;
01758
01759 if (bintimeout_ticks == 0)
01760 {
01761 double bintimeouttmp = (BINLOCK_SEM_TIMEOUT / 1000.0)*(OS_TICKS_PER_SEC*1.0);
01762 bintimeout_ticks = (INT16U) bintimeouttmp;
01763 }
01764
01765 OSSemPend(token->binlock, bintimeout_ticks, &err);
01766 if (err != OS_NO_ERR) return false;
01767
01768 OSSemQuery(token->ucosSemaphore, &sembuf);
01769
01770 if (sembuf.OSCnt < token->semMaxCount)
01771 {
01772 err = OSSemPost(token->ucosSemaphore);
01773 if (err != OS_NO_ERR) retval = false;
01774 }
01775
01776 err = OSSemPost(token->binlock);
01777 if (err != OS_NO_ERR) retval = false;
01778
01779 return retval;
01780 }
01781
01782
01783 bool platformIsSemaphoreSignalled( HANDLE semaph )
01784 {
01785 INT16U retval;
01786
01787 assert( semaph != NULL);
01788
01789 sem_private token = (sem_private) semaph;
01790
01791 retval = OSSemAccept(token->ucosSemaphore);
01792 if (retval == 0) return( false );
01793
01794 return true;
01795 }
01796
01797
01798
01799
01800
01801
01802
01803
01804
01805 HANDLE platformCreateMutex()
01806 {
01807 return OSSemCreate(1);
01808 }
01809
01810
01811 bool platformDeleteMutex( HANDLE mutex )
01812 {
01813 INT8U err;
01814
01815 if (mutex == NULL) return false;
01816 OSSemDel( mutex, OS_DEL_NO_PEND, &err);
01817 if (err == OS_NO_ERR) return true;
01818
01819 return false;
01820 }
01821
01822
01823 bool platformWaitForMutex( HANDLE mutex, UINT32 timeout_msec )
01824 {
01825 INT8U err;
01826
01827 if (mutex == NULL) return false;
01828
01829 double timeouttmp = (timeout_msec / 1000)*(OS_TICKS_PER_SEC*1.0);
01830 INT16U timeout_ticks = (INT16U) timeouttmp;
01831
01832 OSSemPend(mutex, timeout_ticks, &err);
01833 if (err == OS_NO_ERR) return true;
01834
01835 return false;
01836 }
01837
01838
01839 bool platformSignalMutex( HANDLE mutex )
01840 {
01841 if (mutex == NULL) return false;
01842
01843 INT8U err = OSSemPost(mutex);
01844
01845 if (err == OS_NO_ERR) return true;
01846
01847 return false;
01848 }
01849
01850 #endif // PLF_SYSTEM_NIOS2
01851
01852
01853
01854 #ifndef PLF_SYSTEM_WINNT
01855
01856 #define MAXLEN 1024
01857
01859
01861
01862 void stoupper(char *s)
01863 {
01864 char *p = (char *) s;
01865
01866 if (p == NULL) return;
01867
01868 while (*p != 0)
01869 {
01870 if( islower(*p) ) *p = _toupper(*p);
01871 ++p;
01872 }
01873 }
01874
01875 static char strtmp1[MAXLEN];
01876 static char strtmp2[MAXLEN];
01877
01879
01881 int _strnicmp( const char *string1, const char *string2, size_t count)
01882 {
01883 if (count > (MAXLEN-1)) return -1;
01884
01885 strncpy(strtmp1, string1, count);
01886 strtmp1[count] = 0;
01887
01888 strncpy(strtmp2, string2, count);
01889 strtmp2[count] = 0;
01890
01891 stoupper(strtmp1);
01892 stoupper(strtmp2);
01893
01894 return strncmp( strtmp1, strtmp2, count );
01895 }
01896
01897 #endif // NO PLF_SYSTEM_WINNT
01898
01899
01900
01901
01902
01903
01904
01905
01906
01907 VOID platformSleepMilliseconds( UINT32 msec )
01908 {
01909 #if defined(PLF_SYSTEM_SOLARIS) || defined(PLF_SYSTEM_LINUX)
01910
01911 struct timespec req={0};
01912
01913 req.tv_sec=(int)(msec/1000);
01914 req.tv_nsec=(msec%1000)*1000000L;
01915
01916 while(nanosleep(&req,&req)==-1)
01917 {
01918 }
01919
01920 #endif
01921
01922 #ifdef PLF_SYSTEM_WINNT
01923 Sleep( msec );
01924 #endif
01925
01926 #ifdef PLF_SYSTEM_NIOS2
01927 INT8U lsec = (INT8U) (msec / 1000) % 60;
01928 INT16U lmsec = (INT16U) (msec % 1000);
01929 INT8U lmin = (INT8U) (((msec / 1000) / 60) % 60);
01930 INT8U lhour = (INT8U) (((msec / 1000) / 60) / 60);
01931
01932 OSTimeDlyHMSM(lhour,lmin,lsec,lmsec);
01933 #endif
01934 }
01935
01936
01937
01938
01939
01940
01941
01942
01943
01944
01945 UINT32 platformGetTickCount()
01946 {
01947 #ifdef PLF_SYSTEM_SOLARIS
01948 struct timeb current_timeval;
01949
01950 static bool first_time_set=false;
01951 static timeb first_timeval;
01952
01953 int ret = ftime(¤t_timeval);
01954 assert(ret == 0);
01955 ret=ret;
01956
01957 if (first_time_set == false)
01958 {
01959 first_timeval = current_timeval;
01960 first_time_set = true;
01961 return 0;
01962 }
01963 else
01964 {
01965 double passedmilliseconds = difftime(current_timeval.time, first_timeval.time) * 1000.0;
01966
01967 passedmilliseconds -= ((double)first_timeval.millitm);
01968 passedmilliseconds += ((double)current_timeval.millitm);
01969
01970 return( (UINT32) passedmilliseconds );
01971 }
01972
01973 #endif
01974
01975 #ifdef PLF_SYSTEM_LINUX
01976 static long tickssincestart = -1;
01977
01978 if (tickssincestart == -1) tickssincestart = sysconf(_SC_CLK_TCK);
01979
01980 struct tms tm;
01981 return (UINT32)((times(&tm)*1000.0)/tickssincestart);
01982 #endif
01983
01984 #ifdef PLF_SYSTEM_WINNT
01985 return (UINT32) ::GetTickCount();
01986 #endif
01987
01988 #ifdef PLF_SYSTEM_NIOS2
01989 INT32U tickssincestart;
01990 UINT32 msecsincestart;
01991
01992 tickssincestart = OSTimeGet();
01993
01994 msecsincestart = (UINT32) ((tickssincestart*1.0) / (1000.0/(OS_TICKS_PER_SEC*1.0)));
01995
01996 return msecsincestart;
01997 #endif
01998
01999 }
02000
02001 #if defined(PLF_SYSTEM_SOLARIS) || defined(PLF_SYSTEM_LINUX)
02002 static struct termios initial_settings, new_settings;
02003 static int peek_character = -1;
02004 static bool runinitonetime = false;
02005 #endif
02006
02007 #ifdef PLF_SYSTEM_NIOS2
02008 static int peek_character = -1;
02009 static int fd_initialized = 0;
02010 static int unix_fd=0;
02011 static FILE* stream_fd;
02012 #endif
02013
02014
02015
02016
02017
02018
02019 void platformInitializeConsoleInput()
02020 {
02021 #if defined(PLF_SYSTEM_SOLARIS) || defined(PLF_SYSTEM_LINUX)
02022 fflush(stdout);
02023
02024 if (runinitonetime == false)
02025 {
02026 tcgetattr(0,&initial_settings);
02027 runinitonetime = true;
02028 }
02029
02030 tcgetattr(0, &new_settings);
02031 new_settings.c_lflag &= ~ICANON;
02032 new_settings.c_lflag &= ~ECHO;
02033 new_settings.c_lflag &= ~ISIG;
02034 new_settings.c_cc[VMIN] = 1;
02035 new_settings.c_cc[VTIME] = 0;
02036 tcsetattr(0, TCSANOW, &new_settings);
02037 #endif
02038
02039 #ifdef PLF_SYSTEM_NIOS2
02040 if (fd_initialized == 0)
02041 {
02042 fd_initialized = 1;
02043
02044 unix_fd = open("/dev/uart1", O_NONBLOCK | O_RDWR);
02045 stream_fd = fdopen(unix_fd, "rw");
02046 }
02047 #endif
02048 }
02049
02050 void platformDeinitializeConsoleInput()
02051 {
02052 #if defined(PLF_SYSTEM_SOLARIS) || defined(PLF_SYSTEM_LINUX)
02053 if (runinitonetime == true) tcsetattr(0, TCSANOW, &initial_settings);
02054 #endif
02055
02056 #ifdef PLF_SYSTEM_NIOS2
02057 if (fd_initialized == 1)
02058 {
02059 fclose(stream_fd);
02060
02061
02062 fd_initialized = 0;
02063 }
02064 #endif
02065 }
02066
02067
02068
02069 INT32 platformgetch()
02070 {
02071 #if defined(PLF_SYSTEM_SOLARIS) || defined(PLF_SYSTEM_LINUX)
02072 char ch;
02073
02074 if(peek_character != -1)
02075 {
02076 ch = peek_character;
02077 peek_character = -1;
02078 return ch;
02079 }
02080 read(0,&ch,1);
02081 return ch;
02082 #endif
02083
02084 #ifdef PLF_SYSTEM_WINNT
02085
02086 return( getch() );
02087
02088 #endif
02089
02090 #ifdef PLF_SYSTEM_NIOS2
02091 int my_char;
02092
02093 if(peek_character != -1)
02094 {
02095 my_char = peek_character;
02096 peek_character = -1;
02097 return my_char;
02098 }
02099
02100 my_char = getc(stream_fd);
02101 clearerr(stream_fd);
02102
02103 if (my_char == EOF) return -1; else return my_char;
02104 #endif
02105 }
02106
02107
02108
02109 INT32 platformkbhit()
02110 {
02111 #if defined(PLF_SYSTEM_SOLARIS) || defined(PLF_SYSTEM_LINUX)
02112 unsigned char ch;
02113 int nread;
02114
02115 if (peek_character != -1) return 1;
02116 new_settings.c_cc[VMIN]=0;
02117 tcsetattr(0, TCSANOW, &new_settings);
02118 nread = read(0,&ch,1);
02119 new_settings.c_cc[VMIN]=1;
02120 tcsetattr(0, TCSANOW, &new_settings);
02121
02122 if(nread == 1)
02123 {
02124 peek_character = ch;
02125 return 1;
02126 }
02127 return 0;
02128 #endif
02129
02130 #ifdef PLF_SYSTEM_WINNT
02131 return( kbhit() );
02132 #endif
02133
02134 #ifdef PLF_SYSTEM_NIOS2
02135 int my_char;
02136
02137 if(peek_character != -1) return 1;
02138
02139 my_char = getc(stream_fd);
02140 clearerr(stream_fd);
02141
02142 peek_character = -1;
02143
02144 if (my_char != EOF)
02145 {
02146 peek_character = my_char;
02147 return 1;
02148 }
02149
02150 return 0;
02151 #endif
02152 }
02153
02154
02155 #ifdef PLF_ENDIANCHANGE
02156
02157
02158
02159
02160 void platform_put_double_at( UINT8 *p_bufpos, DOUBLE data )
02161 {
02162 UINT8 *datap = (UINT8 *) &data;
02163 UINT8 *bufpos = (UINT8 *) p_bufpos;
02164
02165 bufpos[0] = datap[7];
02166 bufpos[1] = datap[6];
02167 bufpos[2] = datap[5];
02168 bufpos[3] = datap[4];
02169 bufpos[4] = datap[3];
02170 bufpos[5] = datap[2];
02171 bufpos[6] = datap[1];
02172 bufpos[7] = datap[0];
02173 }
02174
02175
02176 DOUBLE platform_get_double_at( UINT8 *p_bufpos )
02177 {
02178 DOUBLE dataloc;
02179 UINT8 *locp = (UINT8 *) &dataloc;
02180 UINT8 *bufpos = (UINT8 *) p_bufpos;
02181
02182 locp[7] = bufpos[0];
02183 locp[6] = bufpos[1];
02184 locp[5] = bufpos[2];
02185 locp[4] = bufpos[3];
02186 locp[3] = bufpos[4];
02187 locp[2] = bufpos[5];
02188 locp[1] = bufpos[6];
02189 locp[0] = bufpos[7];
02190
02191 return dataloc;
02192 }
02193
02194
02195 void platform_put_float_at( UINT8 *p_bufpos, FLOAT data )
02196 {
02197 UINT8 *datap = (UINT8 *) &data;
02198 UINT8 *bufpos = (UINT8 *) p_bufpos;
02199
02200 bufpos[0] = datap[3];
02201 bufpos[1] = datap[2];
02202 bufpos[2] = datap[1];
02203 bufpos[3] = datap[0];
02204 }
02205
02206
02207 FLOAT platform_get_float_at( UINT8 *p_bufpos )
02208 {
02209 FLOAT dataloc;
02210 UINT8 *locp = (UINT8 *) &dataloc;
02211 UINT8 *bufpos = (UINT8 *) p_bufpos;
02212
02213 locp[3] = bufpos[0];
02214 locp[2] = bufpos[1];
02215 locp[1] = bufpos[2];
02216 locp[0] = bufpos[3];
02217
02218 return dataloc;
02219 }
02220
02221
02222 void platform_put_uint16_at( UINT8 *p_bufpos, UINT16 data )
02223 {
02224 UINT8 *datap = (UINT8 *) &data;
02225 UINT8 *bufpos = (UINT8 *) p_bufpos;
02226
02227 bufpos[0] = datap[1];
02228 bufpos[1] = datap[0];
02229 }
02230
02231
02232 UINT16 platform_get_uint16_at( UINT8 *p_bufpos )
02233 {
02234 UINT16 dataloc;
02235 UINT8 *locp = (UINT8 *) &dataloc;
02236 UINT8 *bufpos = (UINT8 *) p_bufpos;
02237
02238 locp[1] = bufpos[0];
02239 locp[0] = bufpos[1];
02240
02241 return dataloc;
02242 }
02243
02244
02245 void platform_put_uint32_at( UINT8 *p_bufpos, UINT32 data )
02246 {
02247 UINT8 *datap = (UINT8 *) &data;
02248 UINT8 *bufpos = (UINT8 *) p_bufpos;
02249
02250 bufpos[0] = datap[3];
02251 bufpos[1] = datap[2];
02252 bufpos[2] = datap[1];
02253 bufpos[3] = datap[0];
02254 }
02255
02256
02257 UINT32 platform_get_uint32_at( UINT8 *p_bufpos )
02258 {
02259 UINT32 dataloc;
02260 UINT8 *locp = (UINT8 *) &dataloc;
02261 UINT8 *bufpos = (UINT8 *) p_bufpos;
02262
02263 locp[3] = bufpos[0];
02264 locp[2] = bufpos[1];
02265 locp[1] = bufpos[2];
02266 locp[0] = bufpos[3];
02267
02268 return dataloc;
02269 }
02270
02271
02272 void platform_put_uint8_at( UINT8 *p_bufpos, UINT8 data )
02273 {
02274 *((UINT8 *) p_bufpos) = data;
02275 }
02276
02277
02278 UINT8 platform_get_uint8_at( UINT8 *p_bufpos )
02279 {
02280 return *((UINT8 *) p_bufpos);
02281 }
02282
02283
02284 void platform_put_int16_at( UINT8 *p_bufpos, INT16 data )
02285 {
02286 UINT8 *datap = (UINT8 *) &data;
02287 UINT8 *bufpos = (UINT8 *) p_bufpos;
02288
02289 bufpos[0] = datap[1];
02290 bufpos[1] = datap[0];
02291 }
02292
02293
02294 INT16 platform_get_int16_at( UINT8 *p_bufpos )
02295 {
02296 INT16 dataloc;
02297 UINT8 *locp = (UINT8 *) &dataloc;
02298 UINT8 *bufpos = (UINT8 *) p_bufpos;
02299
02300 locp[1] = bufpos[0];
02301 locp[0] = bufpos[1];
02302
02303 return dataloc;
02304 }
02305
02306
02307 void platform_put_int32_at( UINT8 *p_bufpos, INT32 data )
02308 {
02309 UINT8 *datap = (UINT8 *) &data;
02310 UINT8 *bufpos = (UINT8 *) p_bufpos;
02311
02312 bufpos[0] = datap[3];
02313 bufpos[1] = datap[2];
02314 bufpos[2] = datap[1];
02315 bufpos[3] = datap[0];
02316 }
02317
02318
02319 INT32 platform_get_int32_at( UINT8 *p_bufpos )
02320 {
02321 INT32 dataloc;
02322 UINT8 *locp = (UINT8 *) &dataloc;
02323 UINT8 *bufpos = (UINT8 *) p_bufpos;
02324
02325 locp[3] = bufpos[0];
02326 locp[2] = bufpos[1];
02327 locp[1] = bufpos[2];
02328 locp[0] = bufpos[3];
02329
02330 return dataloc;
02331 }
02332
02333
02334 void platform_put_int8_at( UINT8 *bufpos, INT8 data )
02335 {
02336 *((INT8 *) bufpos) = data;
02337 }
02338
02339
02340 INT8 platform_get_int8_at( UINT8 *bufpos )
02341 {
02342 return *((INT8 *) bufpos);
02343 }
02344
02345 #endif // PLF_ENDIANCHANGE
02346