1 /*
2  * Copyright (C) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "callbacks.h"
17 
18 #ifdef FILLP_LINUX
19 
20 #ifndef _GNU_SOURCE
21 #define _GNU_SOURCE
22 #endif
23 
24 #ifndef __USE_GNU
25 #define __USE_GNU
26 #endif
27 #include <stdarg.h>
28 #include <time.h>
29 #include <stdint.h>
30 #include <stdlib.h>
31 #include <stdio.h>
32 #include <sys/ioctl.h>
33 #include <fcntl.h>
34 #include <string.h>
35 #include "semaphore.h"
36 #include <pthread.h>
37 #ifndef FILLP_MAC
38 #include <sys/prctl.h>
39 #endif
40 #include <sched.h>
41 #include <unistd.h>
42 #include <stdlib.h>
43 #include <sys/time.h>
44 #include <errno.h>
45 #if defined(FILLP_LW_LITEOS)
46 #include "los_sem.h"
47 #include "los_typedef.h"
48 #include "los_memory.h"
49 #include "los_atomic.h"
50 #include "los_task.h"
51 #include "lwip/sockets.h"
52 #else
53 #include <sys/socket.h>
54 #include <sys/mman.h>
55 #include <netinet/in.h>
56 #include <arpa/inet.h>
57 #endif
58 #include <math.h>
59 #include "securec.h"
60 #include "securectype.h"
61 
62 #else
63 
64 #include <WinSock2.h>
65 #include <windows.h>
66 #include <WinBase.h>
67 #include <Ws2tcpip.h>
68 
69 #include <stdlib.h>
70 #include <stdio.h>
71 #include <string.h>
72 
73 #include <process.h>
74 #include <windows.h>
75 #include <math.h>
76 
77 #include <tchar.h>
78 #include "securec.h"
79 #include "securectype.h"
80 
81 
82 #ifdef DLL_SUPPORT
83 #ifdef DLL_IMPLEMENT
84 #define DLL_API __declspec(dllexport)
85 #else
86 #define DLL_API __declspec(dllimport)
87 #endif
88 #else
89 #define DLL_API
90 
91 #endif
92 
93 #define FILLP_STDCALL __stdcall
94 
95 
96 #ifndef _WINDOWS
97 #ifdef _WIN32
98 #define _WINDOWS
99 #else
100 
101 #ifdef _WIN64
102 #define _WINDOWS
103 #endif
104 
105 #endif
106 #endif
107 
108 
109 #endif
110 
111 #ifdef __cplusplus
112 extern "C" {
113 #endif
114 
115 #ifdef FILLP_WIN32
116 LARGE_INTEGER g_fillpBasePerformanceFrequency;
117 #endif
118 
119 #ifdef FILLP_MAC
120 mach_port_t g_fillpMacSelf;
121 clock_serv_t g_sclock;
122 static mach_timebase_info_data_t g_macTimeBaseInfo;
123 #endif
124 
125 
126 #ifdef FILLP_LINUX
127 #if defined(FILLP_LW_LITEOS)
FillpSysAdptArchAtomicInc(SysArchAtomic * v,FILLP_INT val)128 static FILLP_INT FillpSysAdptArchAtomicInc(SysArchAtomic *v, FILLP_INT val)
129 {
130     return atomic_add_return(val, v);
131 }
132 
FillpSysAdptArchAtomicIncAndTest(SysArchAtomic * v)133 static FILLP_BOOL FillpSysAdptArchAtomicIncAndTest(SysArchAtomic *v)
134 {
135     return atomic_inc_return(v) == 0;
136 }
137 
FillpSysAdptArchAtomicDec(SysArchAtomic * v,FILLP_INT val)138 static FILLP_INT FillpSysAdptArchAtomicDec(SysArchAtomic *v, FILLP_INT val)
139 {
140     return atomic_add_return(-val, v);
141 }
142 
FillpSysAdptArchAtomicDecAndTest(SysArchAtomic * v)143 static FILLP_BOOL FillpSysAdptArchAtomicDecAndTest(SysArchAtomic *v)
144 {
145     return (FILLP_BOOL)atomic_dec_and_test(v);
146 }
147 
FillpSysAdptArchAtomicRead(SysArchAtomic * v)148 static FILLP_INT FillpSysAdptArchAtomicRead(SysArchAtomic *v)
149 {
150     return atomic_read(v);
151 }
152 
FillpSysAdptArchAtomicSet(SysArchAtomic * target,FILLP_INT newValue)153 static FILLP_INT FillpSysAdptArchAtomicSet(SysArchAtomic *target, FILLP_INT newValue)
154 {
155     return atomic_set(target, newValue);
156 }
157 #else
FillpSysAdptArchAtomicInc(SysArchAtomic * v,FILLP_INT val)158 static FILLP_INT FillpSysAdptArchAtomicInc(SysArchAtomic *v, FILLP_INT val)
159 {
160     return __sync_add_and_fetch(&v->counter, val);
161 }
162 
FillpSysAdptArchAtomicIncAndTest(SysArchAtomic * v)163 static FILLP_BOOL FillpSysAdptArchAtomicIncAndTest(SysArchAtomic *v)
164 {
165     return __sync_add_and_fetch(&v->counter, 1) == 0;
166 }
167 
FillpSysAdptArchAtomicDec(SysArchAtomic * v,FILLP_INT val)168 static FILLP_INT FillpSysAdptArchAtomicDec(SysArchAtomic *v, FILLP_INT val)
169 {
170     return __sync_sub_and_fetch(&v->counter, val);
171 }
172 
FillpSysAdptArchAtomicDecAndTest(SysArchAtomic * v)173 static FILLP_BOOL FillpSysAdptArchAtomicDecAndTest(SysArchAtomic *v)
174 {
175     return __sync_sub_and_fetch(&v->counter, 1) == 0;
176 }
177 
FillpSysAdptArchAtomicRead(SysArchAtomic * v)178 static FILLP_INT FillpSysAdptArchAtomicRead(SysArchAtomic *v)
179 {
180     return v->counter;
181 }
182 
FillpSysAdptArchAtomicSet(SysArchAtomic * target,FILLP_INT newValue)183 static FILLP_INT FillpSysAdptArchAtomicSet(SysArchAtomic *target, FILLP_INT newValue)
184 {
185     return target->counter = newValue;
186 }
187 #endif
188 
189 #else
190 
FillpSysAdptArchAtomicInc(SysArchAtomic * v,long value)191 static FILLP_INT FillpSysAdptArchAtomicInc(SysArchAtomic *v, long value)
192 {
193     return InterlockedExchangeAdd((LONG volatile *)(uintptr_t)v, value) + value;
194 }
195 
FillpSysAdptArchAtomicIncAndTest(SysArchAtomic * v)196 static FILLP_BOOL FillpSysAdptArchAtomicIncAndTest(SysArchAtomic *v)
197 {
198     return InterlockedIncrement((LONG volatile *)(uintptr_t)v) == 0;
199 }
200 
FillpSysAdptArchAtomicDec(SysArchAtomic * v,long value)201 static FILLP_INT FillpSysAdptArchAtomicDec(SysArchAtomic *v, long value)
202 {
203     return InterlockedExchangeAdd((LONG volatile *)(uintptr_t)v, (-value)) - value;
204 }
205 
FillpSysAdptArchAtomicDecAndTest(SysArchAtomic * v)206 static FILLP_BOOL FillpSysAdptArchAtomicDecAndTest(SysArchAtomic *v)
207 {
208     return InterlockedDecrement((LONG volatile *)(uintptr_t)v) == 0;
209 }
210 
FillpSysAdptArchAtomicRead(SysArchAtomic * v)211 static SysArchAtomic FillpSysAdptArchAtomicRead(SysArchAtomic *v)
212 {
213     return *v;
214 }
215 
FillpSysAdptArchAtomicSet(SysArchAtomic * target,IN FILLP_INT value)216 static FILLP_INT FillpSysAdptArchAtomicSet(SysArchAtomic *target, IN FILLP_INT value)
217 {
218     return InterlockedExchange((LONG volatile *)(uintptr_t)target, value);
219 }
220 
221 #endif
222 
223 
224 /*******************************************************************************
225     Adption     : FillpMemCalloc
226 
227     Description : Adp Adption if user has not registered the callback for malloc
228 
229     Input         :
230                     nitems                   : Partition number
231                     size: Requested size to be allocated
232 
233     Output       :None
234 
235     Return       : FILLP_NULL_PTR
236  *******************************************************************************/
FillpMemCalloc(IN FILLP_UINT32 nitems,IN FILLP_UINT32 size)237 void *FillpMemCalloc(IN FILLP_UINT32 nitems, IN FILLP_UINT32 size)
238 {
239     void *ptr;
240 
241     ptr = calloc((size_t)nitems, (size_t)size);
242     return ptr;
243 }
244 
FillpMemAlloc(IN FILLP_UINT32 size)245 void *FillpMemAlloc(IN FILLP_UINT32 size)
246 {
247     void *ptr;
248 
249     ptr = malloc((size_t)size);
250     return ptr;
251 }
252 
253 /*******************************************************************************
254     Adption     : FillpMemFree
255 
256     Description : Adp Adption if user has not registered the callback for free
257 
258     Input         :
259                     addr                   : Base address of memory to be freed
260 
261     Output       :None
262 
263     Return       : FILLP_FAILURE
264  *******************************************************************************/
FillpMemFree(IN void * addr)265 void FillpMemFree(IN void *addr)
266 {
267     if (addr != FILLP_NULL_PTR) {
268         free(addr);
269     }
270 }
271 
FillpMemChr(IN FILLP_CONST void * s,IN FILLP_INT c,IN FILLP_SIZE_T n)272 void *FillpMemChr(IN FILLP_CONST void *s, IN FILLP_INT c, IN FILLP_SIZE_T n)
273 {
274     if (s == FILLP_NULL_PTR) {
275         return FILLP_NULL_PTR;
276     }
277 
278     return (memchr(s, c, n));
279 }
280 
281 /*******************************************************************************
282     Adption     : FillpStrLen
283 
284     Description : Adp function if user has not registered the callback for strlen
285 
286     Input         :
287                     pSrc                    : String
288 
289     Output       :None
290 
291     Return       : FILLP_NULL_PTR
292  *******************************************************************************/
FillpStrLen(IN FILLP_CHAR * str)293 FILLP_UINT32 FillpStrLen(IN FILLP_CHAR *str)
294 {
295     if (str == FILLP_NULL_PTR) {
296         return 0;
297     }
298     return (FILLP_UINT32)strlen(str);
299 }
300 
301 
302 /*******************************************************************************
303     Function     : FillpAdpSelect
304 
305     Description : Adp function if user has not registered the callback for select
306 
307     Input         :
308 
309     Output       :
310 
311     Return       :
312  *******************************************************************************/
FillpSelect(IN FILLP_INT maxFd,IN void * rdFds,IN void * wrFds,IO void * exceptFds,IN void * timeout)313 FILLP_INT FillpSelect(
314     IN FILLP_INT maxFd, /* fd value to be selected */
315     IN void *rdFds, /* fd for read */
316     IN void *wrFds, /* fd for write */
317     IO void *exceptFds, /* fd for errors */
318     IN void *timeout) /* max time for select to wait */
319 {
320 #if defined(FILLP_LW_LITEOS)
321     return lwip_select(maxFd, rdFds, wrFds, exceptFds, timeout);
322 #else
323     return select(maxFd, rdFds, wrFds, exceptFds, timeout);
324 #endif
325 }
326 
327 
FillpFuncFdClr(IN FILLP_UINT sockFd,IN FT_FD_SET clrFdSet)328 void FillpFuncFdClr(
329     IN FILLP_UINT sockFd, /* socket fd */
330     IN FT_FD_SET clrFdSet)
331 {
332     FD_CLR((int)sockFd, (fd_set *)clrFdSet);
333 }
334 
FillpFuncFdSet(IN FILLP_UINT sockFd,IN FT_FD_SET setFd)335 void FillpFuncFdSet(
336     IN FILLP_UINT sockFd, /* socket fd */
337     IN FT_FD_SET setFd)
338 {
339     FD_SET((int)sockFd, (fd_set *)setFd);
340 }
341 
FillpFuncFdIsSet(IN FILLP_INT sockFd,IN FT_FD_SET isSetFd)342 FILLP_INT FillpFuncFdIsSet(
343     IN FILLP_INT sockFd, /* socket fd */
344     IN FT_FD_SET isSetFd)
345 {
346     return FD_ISSET(sockFd, (fd_set *)isSetFd);
347 }
348 
FillpFuncCreateFdSet(void)349 FT_FD_SET FillpFuncCreateFdSet(void)
350 {
351     return FillpMemCalloc(sizeof(fd_set), 1);
352 }
353 
FillpFuncDestroyFdSet(IN FT_FD_SET destroyFdSet)354 void FillpFuncDestroyFdSet(IN FT_FD_SET destroyFdSet)
355 {
356     FillpMemFree(destroyFdSet);
357 }
358 
FillpFuncCopyFdSet(IO FT_FD_SET dstFdSet,IN FT_FD_SET srcFdSet)359 FILLP_INT32 FillpFuncCopyFdSet(IO FT_FD_SET dstFdSet, IN FT_FD_SET srcFdSet)
360 {
361     if ((dstFdSet == FILLP_NULL_PTR) || (srcFdSet == FILLP_NULL_PTR)) {
362         return -1;
363     }
364 
365     return memcpy_s(dstFdSet, sizeof(fd_set), srcFdSet, sizeof(fd_set));
366 }
367 
368 
369 /*******************************************************************************
370     Function     : FillpRand
371 
372     Description : Adp function if user has not registered the callback for rand
373 
374  *******************************************************************************/
FillpRand(IN void)375 FILLP_UINT32 FillpRand(IN void)
376 {
377     return (FILLP_UINT32)rand();
378 }
379 
380 #ifdef FILLP_LINUX
FillpThreadFun(void * param)381 static void *FillpThreadFun(void *param)
382 {
383     struct ThreadParam *threadParam = (struct ThreadParam *)param;
384     threadParam->func(threadParam->param);
385 
386     return 0;
387 }
388 #else
389 
FillpThreadFun(void * param)390 static unsigned int FILLP_STDCALL FillpThreadFun(void *param)
391 {
392     struct ThreadParam *threadParam = (struct ThreadParam *)param;
393     threadParam->func(threadParam->param);
394 
395     return 0;
396 }
397 
398 
399 #endif
400 
401 /*******************************************************************************
402     Function     : FillpCreateThread
403 
404     Description : Adp function if user has not registered the callback for create thread
405 
406  *******************************************************************************/
FillpCreateThread(IN void * param,IO void * threadId)407 FILLP_INT FillpCreateThread(IN void *param, IO void *threadId)
408 {
409 #ifdef FILLP_LINUX
410 
411     return pthread_create((pthread_t *)threadId, FILLP_NULL_PTR, FillpThreadFun, (void *)param);
412 #else /* for Windows */
413 
414     _beginthreadex(FILLP_NULL_PTR, 0, FillpThreadFun, param, 0, threadId);
415     return 0;
416 
417 #endif
418 }
419 
420 
421 /*******************************************************************************
422     Function     : FillpSysArchInit
423 
424     Description : Adp function if user has not registered the callback for  initializing the
425                        use of the Winsock DLL by a process
426 
427  *******************************************************************************/
428 
429 #if defined(FILLP_LINUX) && defined(FILLP_MAC)
430 
431 #define FillpSysArchGetCurTime(time) (*(time) = mach_absolute_time())
432 
FillpSysArchTimeToLonglong(FILLP_CONST FillpSysArchTime * time)433 FILLP_LLONG FillpSysArchTimeToLonglong(FILLP_CONST FillpSysArchTime *time)
434 {
435     if (g_macTimeBaseInfo.denom == 0) {
436         return 0;
437     }
438     FILLP_LLONG l_time = (((*time) * g_macTimeBaseInfo.numer) / (g_macTimeBaseInfo.denom * FILLP_CONST_1K));
439     return l_time;
440 }
441 
442 #elif defined(FILLP_LINUX)
443 
444 #define FillpSysArchGetCurTime(time) (void)clock_gettime(CLOCK_MONOTONIC, time)
445 
FillpSysArchTimeToLonglong(FILLP_CONST FillpSysArchTime * ptime)446 FILLP_LLONG FillpSysArchTimeToLonglong(FILLP_CONST FillpSysArchTime *ptime)
447 {
448     FILLP_LLONG l_time = ((FILLP_LLONG)ptime->tv_sec) * FILLP_CONST_1M + (ptime->tv_nsec / FILLP_CONST_1K);
449     return l_time;
450 }
451 
452 
453 #elif defined(FILLP_WIN32)
454 
FillpSysArchInitTime()455 void FillpSysArchInitTime()
456 {
457     (void)QueryPerformanceFrequency(&g_fillpBasePerformanceFrequency);
458     g_fillpBasePerformanceFrequency.QuadPart /= FILLP_CONST_10K;
459 }
460 
FillpSysArchGetCurTime(FillpSysArchTime * timeValue)461 void FillpSysArchGetCurTime(FillpSysArchTime *timeValue)
462 {
463     /* Windows 2000 and later. ---------------------------------- */
464     QueryPerformanceCounter(&(timeValue->time));
465 }
466 
FillpSysArchTimeToLonglong(FILLP_CONST FillpSysArchTime * timeValue)467 FILLP_LLONG FillpSysArchTimeToLonglong(FILLP_CONST FillpSysArchTime *timeValue)
468 {
469     if (g_fillpBasePerformanceFrequency.QuadPart == 0) {
470         return 0;
471     }
472 
473     return ((FILLP_LLONG)(timeValue->time.QuadPart * FILLP_CONST_100) / g_fillpBasePerformanceFrequency.QuadPart);
474 }
475 
476 #endif
477 
478 
FillpSysAdaptArchGetCurTimeLonglong()479 FILLP_LLONG FillpSysAdaptArchGetCurTimeLonglong()
480 {
481     FillpSysArchTime timeValue;
482     FillpSysArchGetCurTime(&timeValue);
483     return FillpSysArchTimeToLonglong(&timeValue);
484 }
485 
FillpSysArchInit(IN void)486 FILLP_INT FillpSysArchInit(IN void)
487 {
488 #ifdef FILLP_LINUX
489 
490     return ERR_OK;
491 
492 #else /* for Windows */
493 
494     WSADATA wsaData;
495     WORD sockVersion = MAKEWORD(FILLP_CONST_2, FILLP_CONST_2);
496     if (WSAStartup(sockVersion, &wsaData) != 0) {
497         return ERR_FAILURE;
498     }
499     FillpSysArchInitTime();
500     return ERR_OK;
501 
502 #endif
503 }
504 
505 /*******************************************************************************
506     Function     : FillpAdpSysArcGetCurTime
507 
508     Description : Adp function if user has not registered the callback for getting system current time
509  *******************************************************************************/
FillpSysArchGetCurTimeLonglong(IN void)510 FILLP_LLONG FillpSysArchGetCurTimeLonglong(IN void)
511 {
512     return FillpSysAdaptArchGetCurTimeLonglong();
513 }
514 
515 
516 /*******************************************************************************
517     Function     : FillpSysArchAtomicInc
518 
519     Description : Adp function if user has not registered the callback for increment the value
520  *******************************************************************************/
FillpSysArchAtomicInc(IO SysArchAtomic * var,FILLP_INT val)521 FILLP_INT FillpSysArchAtomicInc(IO SysArchAtomic *var, FILLP_INT val)
522 {
523     return FillpSysAdptArchAtomicInc(var, val);
524 }
525 
526 /*******************************************************************************
527     Function     : FillpSysArchAtomicIncAndTest
528 
529     Description : Adp function if user has not registered the callback for increment and test the value
530  *******************************************************************************/
FillpSysArchAtomicIncAndTest(IO SysArchAtomic * var)531 FILLP_BOOL FillpSysArchAtomicIncAndTest(IO SysArchAtomic *var)
532 {
533     return FillpSysAdptArchAtomicIncAndTest(var);
534 }
535 
536 /*******************************************************************************
537     Function     : FillpSysArchAtomicDec
538 
539     Description : Adp function if user has not registered the callback for decrement the value
540  *******************************************************************************/
FillpSysArchAtomicDec(IO SysArchAtomic * var,FILLP_INT val)541 FILLP_INT FillpSysArchAtomicDec(IO SysArchAtomic *var, FILLP_INT val)
542 {
543     return FillpSysAdptArchAtomicDec(var, val);
544 }
545 
546 /*******************************************************************************
547     Function     : FillpSysArchAtomicDecAndTest
548 
549     Description : Adp function if user has not registered the callback for decrement and test the value
550  *******************************************************************************/
FillpSysArchAtomicDecAndTest(IO SysArchAtomic * var)551 FILLP_BOOL FillpSysArchAtomicDecAndTest(IO SysArchAtomic *var)
552 {
553     return FillpSysAdptArchAtomicDecAndTest(var);
554 }
555 
556 /*******************************************************************************
557     Function     : FillpSysArchAtomicDec
558 
559     Description : Adp function if user has not registered the callback for read the value
560  *******************************************************************************/
FillpSysArchAtomicRead(IO SysArchAtomic * var)561 FILLP_INT FillpSysArchAtomicRead(IO SysArchAtomic *var)
562 {
563     return FillpSysAdptArchAtomicRead(var);
564 }
565 
566 /*******************************************************************************
567     Function     : FillpSysArchAtomicSet
568 
569     Description : Adp function if user has not registered the callback for automatic exchange the value
570  *******************************************************************************/
FillpSysArchAtomicSet(IN SysArchAtomic * var,FILLP_INT newValue)571 FILLP_INT FillpSysArchAtomicSet(IN SysArchAtomic *var, FILLP_INT newValue)
572 {
573     return FillpSysAdptArchAtomicSet(var, newValue);
574 }
575 
576 /*******************************************************************************
577     Function     : FillpSysArchCompAndWwap
578 
579     Description : Adp function if user has not registered the callback for compare and swap a value
580  *******************************************************************************/
FillpSysArchCompAndWwap(IO volatile FILLP_ULONG * sem,IN volatile FILLP_ULONG oldValue,IN volatile FILLP_ULONG exchange)581 FILLP_INT FillpSysArchCompAndWwap(
582     IO volatile FILLP_ULONG *sem,
583     IN volatile FILLP_ULONG oldValue,
584     IN volatile FILLP_ULONG exchange)
585 {
586 #ifdef FILLP_LINUX
587     return (FILLP_INT)__sync_bool_compare_and_swap(sem, (FILLP_LLONG)(FILLP_ULLONG)oldValue,
588         (FILLP_LLONG)(FILLP_ULLONG)exchange);
589 #else /* for Windows */
590     return ((InterlockedCompareExchange((LONG volatile *)sem, (LONG)exchange, (LONG)oldValue)) == (LONG)oldValue);
591 #endif
592 }
593 
594 /*******************************************************************************
595     Function     : FillpSysSleepMs
596 
597     Description : Adp function if user has not registered the callback for sleep
598  *******************************************************************************/
599 #ifdef FILLP_LINUX
600 /* use nanosleep as usleep is Obsolete by CC */
601 #define FILLP_ADP_SLEEP_MS(_ms) do  { \
602     struct timespec delay; \
603     delay.tv_sec = (_ms) / FILLP_CONST_1K; \
604     delay.tv_nsec = ((_ms) % FILLP_CONST_1K) * FILLP_CONST_1K * FILLP_CONST_1K; \
605     (void) nanosleep (&delay, FILLP_NULL_PTR); \
606 } while (0)
607 
608 #else
609 
610 #define FILLP_ADP_SLEEP_MS(a) Sleep(a)
611 
612 #endif
613 
FillpSysSleepMs(IN FILLP_UINT timeValue)614 void FillpSysSleepMs(IN FILLP_UINT timeValue) /* In Millseconds */
615 {
616     FILLP_ADP_SLEEP_MS(timeValue);
617 }
618 
FillpSysSleepUs(IN FILLP_UINT timeValue)619 FILLP_INT FillpSysSleepUs(IN FILLP_UINT timeValue) /* In micro seconds */
620 {
621 #ifdef FILLP_LINUX
622     struct timespec tmsp;
623     tmsp.tv_sec = timeValue / FILLP_CONST_1M;
624     tmsp.tv_nsec = (timeValue % FILLP_CONST_1M) * FILLP_CONST_1K;
625     return nanosleep(&tmsp, FILLP_NULL_PTR);
626 #else
627     FILLP_UNUSED_PARA(timeValue);
628     return 0;
629 #endif
630 }
631 
632 
633 /*******************************************************************************
634     Function     : FillpAdpRtePause
635 
636     Description : Adp function if user has not registered the callback for pause
637  *******************************************************************************/
FillpAdpRtePause(void)638 void FillpAdpRtePause(void)
639 {
640 #ifdef FILLP_LINUX
641     (void)sleep(0);
642 #endif
643 }
644 
645 #ifdef FILLP_LINUX
646 
647 #define FILLP_ADAPT_SYS_ARCH_SEM_COND_INIT(sem, value) do { \
648     pthread_condattr_t attr; \
649     (void)pthread_condattr_init(&attr); \
650     (void)pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); \
651     (void)pthread_cond_init(&(sem)->cond, &attr); \
652     (void)pthread_condattr_destroy(&attr); \
653     (sem)->counter = (FILLP_INT)(value); \
654 } while (0)
655 
656 #define FILLP_ADAPT_SYS_ARCH_SEM_INIT(sem, value, ret) do { \
657     if (pthread_mutex_init(&(sem)->mutex, FILLP_NULL_PTR) == 0) { \
658         FILLP_ADAPT_SYS_ARCH_SEM_COND_INIT(sem, value); \
659         (ret) = FILLP_OK; \
660     } else { \
661         (ret) = ERR_NULLPTR; \
662     } \
663 } while (0)
664 
665 #else
666 
667 #define FILLP_ADAPT_SYS_ARCH_SEM_INIT(sem, value, ret) do {                           \
668         HANDLE tempSem = CreateSemaphore(FILLP_NULL_PTR, (FILLP_SLONG)(value),        \
669             0xffffff, FILLP_NULL_PTR);                                                \
670         if (tempSem == FILLP_NULL_PTR) {                                              \
671             (ret) = ERR_NULLPTR;                                                      \
672         } else {                                                                      \
673             *(sem) = tempSem;                                                         \
674             (ret) = FILLP_OK;                                                         \
675         }                                                                             \
676     } while (0)
677 
678 #endif
679 
680 /*******************************************************************************
681     Function     : FillpArchInitSem
682 
683     Description : Adp function if user has not registered the callback for semaphore init
684  *******************************************************************************/
FillpArchInitSem(IO SYS_ARCH_SEM * sem,IN FILLP_ULONG value)685 FILLP_INT FillpArchInitSem(IO SYS_ARCH_SEM *sem, IN FILLP_ULONG value)
686 {
687 #ifndef FILLP_MAC
688     FILLP_INT ret;
689     FILLP_ADAPT_SYS_ARCH_SEM_INIT(sem, value, ret);
690     return ret;
691 #endif
692 
693 #ifdef FILLP_MAC
694     kern_return_t ret;
695     ret = semaphore_create(g_fillpMacSelf, sem, SYNC_POLICY_FIFO, value);
696 
697     return ret;
698 #endif
699 }
700 
701 #ifdef FILLP_LINUX
702 #define FILLP_ADAPT_SYS_ARCH_SEM_TRYWAIT(sem) sem_trywait(sem)
703 
704 #define FILLP_ADAPT_SYS_ARCH_SEM_WAIT(sem) sem_wait(sem)
705 
706 #define FILLP_ADAPT_SYS_ARCH_SEM_POST(sem) sem_post(sem)
707 
708 #define FILLP_ADAPT_SYS_ARCH_SEM_DESTROY(sem) sem_destroy(sem)
709 
710 #if defined(FILLP_LW_LITEOS)
FillpAdaptSysArchRwsemInit(SYS_ARCH_RW_SEM * sem)711 staic FillpErrorType FillpAdaptSysArchRwsemInit(SYS_ARCH_RW_SEM *sem)
712 {
713     int ret = pthread_mutex_init(&sem->readMutex, FILLP_NULL_PTR);
714     if (ret != 0) {
715         return ERR_PARAM;
716     }
717     ret = pthread_mutex_init(&sem->writeMutex, FILLP_NULL_PTR);
718     if (ret != 0) {
719         (void)pthread_mutex_destroy(&sem->readMutex);
720         return ERR_PARAM;
721     }
722     sem->readCount = 0;
723     return ERR_OK;
724 }
725 
FillpAdaptSysArchRwsemTryrdwait(SYS_ARCH_RW_SEM * sem)726 static FillpErrorType FillpAdaptSysArchRwsemTryrdwait(SYS_ARCH_RW_SEM *sem)
727 {
728     int ret = pthread_mutex_trylock(&sem->readMutex);
729     if (ret != 0) {
730         return ERR_EAGAIN;
731     }
732     sem->readCount++;
733     if (sem->readCount == 1) {
734         ret = pthread_mutex_trylock(&sem->writeMutex);
735         if (ret != 0) {
736             sem->readCount--;
737             (void)pthread_mutex_unlock(&sem->readMutex);
738             return ERR_EAGAIN;
739         }
740     }
741     (void)pthread_mutex_unlock(&sem->readMutex);
742     return ERR_OK;
743 }
744 
FillpAdaptSysArchRwsemRdPost(SYS_ARCH_RW_SEM * sem)745 static FillpErrorType FillpAdaptSysArchRwsemRdPost(SYS_ARCH_RW_SEM *sem)
746 {
747     int ret = pthread_mutex_lock(&sem->readMutex);
748     if (ret != 0) {
749         return ERR_PARAM;
750     }
751     sem->readCount--;
752     if (sem->readCount == 0) {
753         (void)pthread_mutex_unlock(&sem->writeMutex);
754     }
755     (void)pthread_mutex_unlock(&sem->readMutex);
756     return ERR_OK;
757 }
758 
FillpAdaptSysArchRwsemTrywrwait(SYS_ARCH_RW_SEM * sem)759 static FillpErrorType FillpAdaptSysArchRwsemTrywrwait(SYS_ARCH_RW_SEM *sem)
760 {
761     int ret = pthread_mutex_trylock(&sem->writeMutex);
762     if (ret != 0) {
763         return ERR_EAGAIN;
764     }
765     return ERR_OK;
766 }
767 
FillpAdaptSysArchRwsemWrPost(SYS_ARCH_RW_SEM * sem)768 static FillpErrorType FillpAdaptSysArchRwsemWrPost(SYS_ARCH_RW_SEM *sem)
769 {
770     (void)pthread_mutex_unlock(&sem->writeMutex);
771     return ERR_OK;
772 }
773 
FillpAdaptSysArchRwsemDestroy(SYS_ARCH_RW_SEM * sem)774 static FillpErrorType FillpAdaptSysArchRwsemDestroy(SYS_ARCH_RW_SEM *sem)
775 {
776     (void)pthread_mutex_destroy(&sem->readMutex);
777     (void)pthread_mutex_destroy(&sem->writeMutex);
778     sem->readCount = 0;
779     return ERR_OK;
780 }
781 
782 #else /* FILLP_LW_LITEOS */
783 #define FillpAdaptSysArchRwsemInit(sem) pthread_rwlock_init((sem), FILLP_NULL_PTR)
784 
785 #define FillpAdaptSysArchRwsemTryrdwait(sem) pthread_rwlock_tryrdlock(sem)
786 
787 #define FillpAdaptSysArchRwsemTrywrwait(sem) pthread_rwlock_trywrlock(sem)
788 
789 #define FillpAdaptSysArchRwsemRdPost(sem) pthread_rwlock_unlock(sem)
790 
791 #define FillpAdaptSysArchRwsemWrPost(sem) pthread_rwlock_unlock(sem) // The same with rdpost in linux
792 
793 #define FillpAdaptSysArchRwsemDestroy(sem) pthread_rwlock_destroy(sem)
794 #endif /* FILLP_LW_LITEOS */
795 
796 #else /* FILLP_LINUX */
797 
798 #define FILLP_ADAPT_SYS_ARCH_SEM_WAIT(sem)      WaitForSingleObject(*(sem), 0xffffff)
799 
800 #define FILLP_ADAPT_SYS_ARCH_SEM_TRYWAIT(sem)   WaitForSingleObject(*(sem), 0)
801 
802 #define FILLP_ADAPT_SYS_ARCH_SEM_POST(sem)      ReleaseSemaphore(*(sem), 1, FILLP_NULL_PTR)
803 
804 #define FILLP_ADAPT_SYS_ARCH_SEM_DESTROY(sem)   CloseHandle(*(sem))
805 
806 
807 #define SYS_ARCH_RWSEM_RD_LOCK_STEP 0x2
808 #define SYS_ARCH_RWSEM_WR_LOCK_FLAG 0x01
809 
810 #define CAS(sem, oldValue, newValue) FillpSysArchCompAndWwap((sem), (oldValue), (newValue))
811 
FillpAdaptSysArchRwsemInit(SYS_ARCH_RW_SEM * sem)812 static FillpErrorType FillpAdaptSysArchRwsemInit(SYS_ARCH_RW_SEM *sem)
813 {
814     sem->sem = 0x0;
815     return ERR_OK;
816 }
817 
FillpAdaptSysArchRwsemTryrdwait(SYS_ARCH_RW_SEM * sem)818 static FillpErrorType FillpAdaptSysArchRwsemTryrdwait(SYS_ARCH_RW_SEM *sem)
819 {
820     FILLP_ULONG oldValue;
821     FILLP_ULONG nextValue;
822 
823     do {
824         oldValue = sem->sem;
825         if (oldValue & SYS_ARCH_RWSEM_WR_LOCK_FLAG) { // Write lock
826             return ERR_FAILURE;
827         }
828         nextValue = oldValue + SYS_ARCH_RWSEM_RD_LOCK_STEP;
829     } while (!CAS(&sem->sem, oldValue, nextValue));
830     return ERR_OK;
831 }
832 
833 
FillpAdaptSysArchRwsemTrywrwait(SYS_ARCH_RW_SEM * sem)834 static FillpErrorType FillpAdaptSysArchRwsemTrywrwait(SYS_ARCH_RW_SEM *sem)
835 {
836     FILLP_ULONG oldValue;
837     FILLP_ULONG nextValue;
838 
839     do {
840         oldValue = sem->sem;
841         if (oldValue != 0x0) {
842             return ERR_FAILURE;
843         }
844         nextValue = oldValue | SYS_ARCH_RWSEM_WR_LOCK_FLAG;
845     } while (!CAS(&sem->sem, oldValue, nextValue));
846 
847     return ERR_OK;
848 }
849 
FillpAdaptSysArchRwsemRdPost(SYS_ARCH_RW_SEM * sem)850 static FillpErrorType FillpAdaptSysArchRwsemRdPost(SYS_ARCH_RW_SEM *sem)
851 {
852     FILLP_ULONG oldValue;
853     FILLP_ULONG nextValue;
854 
855     do {
856         oldValue = sem->sem;
857         nextValue = oldValue - SYS_ARCH_RWSEM_RD_LOCK_STEP;
858     } while (!CAS(&sem->sem, oldValue, nextValue));
859 
860     return ERR_OK;
861 }
862 
FillpAdaptSysArchRwsemWrPost(SYS_ARCH_RW_SEM * sem)863 static FillpErrorType FillpAdaptSysArchRwsemWrPost(SYS_ARCH_RW_SEM *sem)
864 {
865     FILLP_ULONG oldValue;
866     FILLP_ULONG nextValue;
867 
868     do {
869         oldValue = sem->sem;
870         nextValue = oldValue & (~SYS_ARCH_RWSEM_WR_LOCK_FLAG);
871     } while (!CAS(&sem->sem, oldValue, nextValue));
872 
873     return ERR_OK;
874 }
875 
FillpAdaptSysArchRwsemDestroy(SYS_ARCH_RW_SEM * sem)876 static FillpErrorType FillpAdaptSysArchRwsemDestroy(SYS_ARCH_RW_SEM *sem)
877 {
878     if (sem->sem != 0x0) {
879         return ERR_FAILURE;
880     }
881 
882     return ERR_OK;
883 }
884 
885 #endif /* FILLP_LINUX */
886 
887 /*******************************************************************************
888     Function     : FillpSemTryWait
889 
890     Description : Adp function if user has not registered the callback for semaphore try wait
891  *******************************************************************************/
FillpSemTryWait(IN SYS_ARCH_SEM * sem)892 FILLP_INT FillpSemTryWait(IN SYS_ARCH_SEM *sem)
893 {
894 #ifndef FILLP_MAC
895 #ifdef FILLP_LINUX
896     FILLP_INT ret;
897 
898     if (pthread_mutex_trylock(&sem->mutex) != 0) {
899         return -1;
900     }
901     if (sem->counter > 0) {
902         sem->counter--;
903         ret = 0;
904     } else {
905         ret = -1;
906     }
907     (void)pthread_mutex_unlock(&sem->mutex);
908     return ret;
909 #else
910     return (FILLP_INT)FILLP_ADAPT_SYS_ARCH_SEM_TRYWAIT(sem);
911 #endif
912 #else
913     /* sem try wait is not implemented in MAC, so simulate it using sem timeout
914          Below timeout value is arrive by doing the throughput test in 2 mthods:
915          a) Test by registering normal semaphore_wait
916          b) Test by registering semaphore_timedwait with timeout value
917     */
918     mach_timespec_t mts;
919     FILLP_SLONG timeout = 1;
920     mts.tv_sec = 0;
921     mts.tv_nsec = 0;
922     clock_get_time(g_sclock, &mts);
923 
924     mts.tv_sec += timeout / FILLP_CONST_1K;
925     mts.tv_nsec += (timeout % FILLP_CONST_1K) * FILLP_CONST_1M;
926 
927     return semaphore_timedwait(*sem, mts);
928 
929 #endif
930 }
931 
932 /*******************************************************************************
933     Function     : FillpSemWait
934 
935     Description : Adp function if user has not registered the callback for semaphore wait
936  *******************************************************************************/
FillpSemWait(IN SYS_ARCH_SEM * sem)937 FILLP_INT FillpSemWait(IN SYS_ARCH_SEM *sem)
938 {
939 #ifndef FILLP_MAC
940 #ifdef FILLP_LINUX
941     if (pthread_mutex_lock(&sem->mutex) != 0) {
942         return -1;
943     }
944     while (sem->counter <= 0) {
945         if (pthread_cond_wait(&sem->cond, &sem->mutex) != 0) {
946             (void)pthread_mutex_unlock(&sem->mutex);
947             return -1;
948         }
949     }
950     sem->counter--;
951     (void)pthread_mutex_unlock(&sem->mutex);
952     return 0;
953 #else
954     return (FILLP_INT)FILLP_ADAPT_SYS_ARCH_SEM_WAIT(sem);
955 #endif
956 #else
957     kern_return_t ret;
958     ret = semaphore_wait(*sem);
959     return ret;
960 #endif
961 }
962 
963 
964 /*******************************************************************************
965     Function     : FillpSemPost
966 
967     Description : Adp function if user has not registered the callback for semaphore post
968  *******************************************************************************/
FillpSemPost(IN SYS_ARCH_SEM * sem)969 FILLP_INT FillpSemPost(IN SYS_ARCH_SEM *sem)
970 {
971 #ifndef FILLP_MAC
972 #ifdef FILLP_LINUX
973     if (pthread_mutex_lock(&sem->mutex) != 0) {
974         return -1;
975     }
976     sem->counter++;
977     (void)pthread_cond_signal(&sem->cond);
978     (void)pthread_mutex_unlock(&sem->mutex);
979     return 0;
980 #else
981     return (FILLP_ADAPT_SYS_ARCH_SEM_POST(sem) == 0);
982 #endif
983 #else
984     kern_return_t ret;
985     ret = semaphore_signal(*sem);
986     return ret;
987 #endif
988 }
989 
990 /*******************************************************************************
991     Function     : FillpSemDestroy
992 
993     Description : Adp function if user has not registered the callback for semaphore destroy
994  *******************************************************************************/
FillpSemDestroy(IN SYS_ARCH_SEM * sem)995 FILLP_INT FillpSemDestroy(IN SYS_ARCH_SEM *sem)
996 {
997 #ifndef FILLP_MAC
998 #ifdef FILLP_LINUX
999     FILLP_INT ret = pthread_mutex_lock(&(sem->mutex));
1000     if (ret != 0) {
1001         return -1;
1002     }
1003 
1004     if (pthread_cond_destroy(&(sem->cond)) != 0) {
1005         ret = -1;
1006     }
1007     if (pthread_mutex_unlock(&(sem->mutex)) != 0) {
1008         ret = -1;
1009     }
1010     if (pthread_mutex_destroy(&(sem->mutex)) != 0) {
1011         ret = -1;
1012     }
1013     return ret;
1014 #else
1015     return FILLP_ADAPT_SYS_ARCH_SEM_DESTROY(sem);
1016 #endif
1017 #else
1018     kern_return_t ret;
1019     ret = semaphore_destroy(g_fillpMacSelf, *sem);
1020     return ret;
1021 #endif
1022 }
1023 
FillpArchInitRwSem(IO SYS_ARCH_RW_SEM * sem)1024 static FILLP_INT FillpArchInitRwSem(IO SYS_ARCH_RW_SEM *sem)
1025 {
1026     return FillpAdaptSysArchRwsemInit(sem);
1027 }
1028 
1029 
FillpRwSemTryRdWait(IN SYS_ARCH_RW_SEM * sem)1030 FILLP_INT FillpRwSemTryRdWait(IN SYS_ARCH_RW_SEM *sem)
1031 {
1032     return FillpAdaptSysArchRwsemTryrdwait(sem);
1033 }
1034 
FillpRwSemTryWrWait(IN SYS_ARCH_RW_SEM * sem)1035 FILLP_INT FillpRwSemTryWrWait(IN SYS_ARCH_RW_SEM *sem)
1036 {
1037     return FillpAdaptSysArchRwsemTrywrwait(sem);
1038 }
1039 
1040 /*******************************************************************************
1041     Function     : FillpRwSemDestroy
1042 
1043     Description : Adp function if user has not registered the callback for semaphore destroy
1044  *******************************************************************************/
FillpRwSemDestroy(IN SYS_ARCH_RW_SEM * sem)1045 FILLP_INT FillpRwSemDestroy(IN SYS_ARCH_RW_SEM *sem)
1046 {
1047     return FillpAdaptSysArchRwsemDestroy(sem);
1048 }
1049 
1050 /*******************************************************************************
1051     Function     : FillpRwSemWrPost
1052 
1053     Description : Adp function if user has not registered the callback for semaphore post
1054  *******************************************************************************/
FillpRwSemWrPost(IN SYS_ARCH_RW_SEM * sem)1055 FILLP_INT FillpRwSemWrPost(IN SYS_ARCH_RW_SEM *sem)
1056 {
1057     return FillpAdaptSysArchRwsemWrPost(sem);
1058 }
1059 
1060 /*******************************************************************************
1061     Function     : FillpRwSemRdPost
1062 
1063     Description : Adp function if user has not registered the callback for semaphore post
1064  *******************************************************************************/
FillpRwSemRdPost(IN SYS_ARCH_RW_SEM * sem)1065 FILLP_INT FillpRwSemRdPost(IN SYS_ARCH_RW_SEM *sem)
1066 {
1067     return FillpAdaptSysArchRwsemRdPost(sem);
1068 }
1069 
1070 
1071 /*******************************************************************************
1072     Function     : FillpFuncCreateSocket
1073 
1074     Description : Adp function if user has not registered the Create socket callback
1075  *******************************************************************************/
FillpFuncCreateSocket(IN FILLP_INT32 domain,IN FILLP_INT32 type,IN FILLP_INT32 protocol)1076 FILLP_INT32  FillpFuncCreateSocket(
1077     IN FILLP_INT32 domain,   /* the address family */
1078     IN FILLP_INT32 type,     /* new socket */
1079     IN FILLP_INT32 protocol) /* protocol to be used */
1080 {
1081     return (FILLP_INT32)socket((int)domain, (int)type, (int)protocol);
1082 }
1083 
1084 /*******************************************************************************
1085     Function     : FillpFuncBindSocket
1086 
1087     Description : Adp function if user has not registered the Bind socket callback function
1088  *******************************************************************************/
FillpFuncBindSocket(IN FILLP_INT32 sockFd,IN FILLP_CONST void * myAddr,IN FILLP_INT32 addrLen)1089 FILLP_INT32 FillpFuncBindSocket(
1090     IN FILLP_INT32 sockFd, /* socket fd */
1091     IN FILLP_CONST void *myAddr, /* bind addr */
1092     IN FILLP_INT32 addrLen) /* addr length */
1093 {
1094     return (FILLP_INT32)bind(sockFd, myAddr, (socklen_t)addrLen);
1095 }
1096 
FillpFuncConnectSocket(IN FILLP_INT32 sockFd,IN FILLP_CONST void * myAddr,IN FILLP_INT32 addrLen)1097 FILLP_INT32 FillpFuncConnectSocket(
1098     IN FILLP_INT32 sockFd,       /* socket fd */
1099     IN FILLP_CONST void *myAddr, /* bind addr */
1100     IN FILLP_INT32 addrLen)      /* addr length */
1101 {
1102     return connect(sockFd, myAddr, (socklen_t)addrLen);
1103 }
1104 
FillpFuncGetSockName(IN FILLP_INT32 sockFd,IN void * myAddr,IN void * addrLen)1105 FILLP_INT32 FillpFuncGetSockName(
1106     IN FILLP_INT32 sockFd, /* socket fd */
1107     IN void *myAddr,       /* bind addr */
1108     IN void *addrLen)      /* addr length */
1109 {
1110 #ifdef FILLP_WIN32
1111     return getsockname(sockFd, (struct sockaddr *)myAddr, (int *)addrLen);
1112 #else
1113     return getsockname(sockFd, (struct sockaddr *)myAddr, (socklen_t *)addrLen);
1114 #endif
1115 }
1116 
1117 
FillpFuncIoCtlSocket(FILLP_INT fd,FILLP_INT type,FILLP_ULONG * parg)1118 FILLP_INT FillpFuncIoCtlSocket(FILLP_INT fd, FILLP_INT type, FILLP_ULONG *parg)
1119 {
1120 #ifdef FILLP_WIN32
1121     return ioctlsocket(fd, type, (FILLP_ULONG *)parg);
1122 #else
1123     return ioctl(fd, (FILLP_ULONG)type, parg);
1124 
1125 #endif
1126 }
1127 
1128 
FillpFuncFcntl(IN FILLP_INT fd,IN FILLP_INT cmd,IN FILLP_INT val)1129 FILLP_INT FillpFuncFcntl(
1130     IN FILLP_INT fd,  /* connection fd */
1131     IN FILLP_INT cmd, /* command to perform on socket */
1132     IN FILLP_INT val) /* arguments for socket */
1133 {
1134 #if defined(FILLP_LW_LITEOS)
1135     return lwip_fcntl(fd, cmd, val);
1136 #elif defined(FILLP_WIN32)
1137     FILLP_UNUSED_PARA(fd);
1138     FILLP_UNUSED_PARA(cmd);
1139     FILLP_UNUSED_PARA(val);
1140     return 0;
1141 #else
1142     return fcntl(fd, cmd, val);
1143 #endif
1144 }
1145 
FillpFuncSetSockOpt(IN FILLP_INT sockFd,IN FILLP_INT level,IN FILLP_INT optName,IN FILLP_CONST void * optVal,IN FILLP_INT optLen)1146 FILLP_INT FillpFuncSetSockOpt(IN FILLP_INT sockFd, IN FILLP_INT level, IN FILLP_INT optName,
1147     IN FILLP_CONST void *optVal, IN FILLP_INT optLen)
1148 {
1149     return setsockopt(sockFd, level, optName, optVal, (socklen_t)optLen);
1150 }
1151 
FillpFuncGetSockOpt(IN FILLP_INT sockFd,IN FILLP_INT level,IN FILLP_INT optName,IO void * optVal,IO FILLP_INT * optLen)1152 FILLP_INT FillpFuncGetSockOpt(IN FILLP_INT sockFd, IN FILLP_INT level, IN FILLP_INT optName, IO void *optVal,
1153     IO FILLP_INT *optLen)
1154 {
1155 #ifdef FILLP_WIN32
1156     return getsockopt(sockFd, level, optName, (char *)optVal, (int *)optLen);
1157 #else
1158     return getsockopt(sockFd, level, optName, optVal, (socklen_t *)optLen);
1159 #endif
1160 }
1161 
1162 
1163 /*******************************************************************************
1164     Function     : FillpFuncCloseSocket
1165 
1166     Description : Adp function if user has not registered the close socket callback function
1167  *******************************************************************************/
FillpFuncCloseSocket(IN FILLP_INT32 sockFd)1168 FILLP_INT32 FillpFuncCloseSocket(IN FILLP_INT32 sockFd)
1169 {
1170 #ifdef FILLP_LINUX
1171 
1172     return close(sockFd);
1173 
1174 #else /* For Windows */
1175 
1176     return closesocket(sockFd);
1177 
1178 #endif
1179 }
1180 
1181 /*******************************************************************************
1182     Function     : FillpFuncSendTo
1183 
1184     Description : Adp function if user has not registered the sendto callback function
1185  *******************************************************************************/
FillpFuncSendTo(IN FILLP_INT sockFd,IN const void * buf,IN FILLP_SIZE_T len,IN FILLP_INT flags,IN const void * to,IN FILLP_SIZE_T toLen)1186 FILLP_INT FillpFuncSendTo(IN FILLP_INT sockFd, IN const void *buf, IN FILLP_SIZE_T len, IN FILLP_INT flags,
1187     IN const void *to, IN FILLP_SIZE_T toLen)
1188 {
1189 #ifdef FILLP_WIN64
1190     return (FILLP_INT)sendto(sockFd, buf, (FILLP_INT)len, flags, to, (socklen_t)toLen);
1191 #else
1192     return (FILLP_INT)sendto(sockFd, buf, len, flags, to, (socklen_t)toLen);
1193 #endif
1194 }
1195 
1196 /*******************************************************************************
1197     Function     : FillpFuncRecvFrom
1198     Description  : Adp function if user has not registered the receive from callback function
1199  *******************************************************************************/
FillpFuncRecvFrom(IN FILLP_INT sockFd,OUT void * buf,IN FILLP_SIZE_T len,IN FILLP_INT flags,OUT void * from,IO FILLP_SIZE_T * fromLen)1200 FILLP_INT FillpFuncRecvFrom(IN FILLP_INT sockFd, OUT void *buf, IN FILLP_SIZE_T len, IN FILLP_INT flags,
1201     OUT void *from, IO FILLP_SIZE_T *fromLen)
1202 {
1203 #ifdef FILLP_WIN32
1204 #ifdef FILLP_WIN64
1205     return (FILLP_INT)recvfrom(sockFd, buf, (int)len, flags, (struct sockaddr *)from, (int *)fromLen);
1206 #else
1207     return (FILLP_INT)recvfrom(sockFd, buf, len, flags, (struct sockaddr *)from, (int *)fromLen);
1208 #endif
1209 #else
1210     return (FILLP_INT)recvfrom(sockFd, buf, len, flags, from, (socklen_t *)fromLen);
1211 #endif
1212 }
1213 
FillpFuncSend(IN FILLP_INT sockFd,IN const void * buffer,IN FILLP_INT len,IN FILLP_INT flags)1214 FILLP_INT FillpFuncSend(
1215     IN FILLP_INT sockFd,   /* Connection fd */
1216     IN const void *buffer, /* buffer to hold data to be sent */
1217     IN FILLP_INT len,      /* no of bytes to be sent */
1218     IN FILLP_INT flags)    /* flags to tell the status */
1219 {
1220     return (FILLP_INT)send(sockFd, buffer, (FILLP_SIZE_T)(unsigned int)len, flags);
1221 }
1222 
1223 #ifdef FILLP_LINUX
FillpAdaptSysArchSemClose(SYS_ARCH_SEM * sem)1224 FILLP_INT FillpAdaptSysArchSemClose(SYS_ARCH_SEM *sem)
1225 {
1226 #ifndef FILLP_MAC
1227     return FillpSemDestroy(sem);
1228 #endif
1229 
1230     /* Once inited with semaphore_create() in callback sysArchSemInit, it will be destroyed
1231         semaphore_destroy() in sysArchSemDestroy. here is no semaphore_close() in MAC
1232     */
1233 #ifdef FILLP_MAC
1234     FILLP_UNUSED_PARA(sem);
1235     return FILLP_SUCCESS;
1236 #endif
1237 }
1238 
1239 #else
1240 
FillpAdaptSysArchSemClose(SYS_ARCH_SEM * sem)1241 FILLP_INT FillpAdaptSysArchSemClose(SYS_ARCH_SEM *sem)
1242 {
1243     return CloseHandle(*sem);
1244 }
1245 
1246 #endif
1247 
1248 /* callback for sys_arch_named_sem_close */
FillpSysArchSemClose(SYS_ARCH_SEM * sem)1249 FILLP_INT FillpSysArchSemClose(SYS_ARCH_SEM *sem)
1250 {
1251     return FillpAdaptSysArchSemClose(sem);
1252 }
1253 
1254 #ifdef FILLP_LINUX
FillpAdaptSysArchSemWaitTimeout(SYS_ARCH_SEM * sem,FILLP_SLONG timeout)1255 static FILLP_INT FillpAdaptSysArchSemWaitTimeout(SYS_ARCH_SEM *sem, FILLP_SLONG timeout)
1256 {
1257 #ifndef FILLP_MAC
1258     FILLP_LLONG start;
1259     FILLP_LLONG end;
1260     FillpSysArchTime timeValue;
1261 
1262     (void)clock_gettime(CLOCK_MONOTONIC, &timeValue);
1263     start = FillpSysArchTimeToLonglong(&timeValue);
1264     end = start + (timeout * FILLP_CONST_1K);
1265     timeValue.tv_sec = (time_t)(end / FILLP_CONST_1M);
1266     timeValue.tv_nsec = (long)((end % FILLP_CONST_1M) * FILLP_CONST_1K);
1267 
1268     if (pthread_mutex_lock(&sem->mutex) != 0) {
1269         return -1;
1270     }
1271     while (sem->counter <= 0) {
1272         if (pthread_cond_timedwait(&sem->cond, &sem->mutex, &timeValue) != 0) {
1273             (void)pthread_mutex_unlock(&sem->mutex);
1274             return -1;
1275         }
1276     }
1277     sem->counter--;
1278     (void)pthread_mutex_unlock(&sem->mutex);
1279     return 0;
1280 
1281 #endif
1282 
1283 #ifdef FILLP_MAC
1284     mach_timespec_t mts;
1285     mts.tv_sec = 0;
1286     mts.tv_nsec = 0;
1287     clock_get_time(g_sclock, &mts);
1288 
1289     mts.tv_sec += timeout / FILLP_CONST_1K;
1290     mts.tv_nsec += (timeout % FILLP_CONST_1K) * FILLP_CONST_1M;
1291 
1292     return semaphore_timedwait(*sem, mts);
1293 #endif
1294 }
1295 
1296 #else
1297 
FillpAdaptSysArchSemWaitTimeout(SYS_ARCH_SEM * sem,FILLP_SLONG timeout)1298 FILLP_INT FillpAdaptSysArchSemWaitTimeout(SYS_ARCH_SEM *sem, FILLP_SLONG timeout)
1299 {
1300     DWORD ret = WaitForSingleObject(*sem, timeout);
1301     if (ret == WAIT_TIMEOUT) {
1302         return ERR_OK;
1303     } else {
1304         return ERR_COMM;
1305     }
1306 }
1307 
FillpAdaptSysArchSemTryWait(SYS_ARCH_SEM * sem,FILLP_SLONG timeout)1308 FILLP_INT FillpAdaptSysArchSemTryWait(SYS_ARCH_SEM *sem, FILLP_SLONG timeout)
1309 {
1310     return WaitForSingleObject(*sem, timeout);
1311 }
1312 
1313 #endif
1314 
1315 /* callback for sys_arch_named_sem_wait_timeout */
FillpSysArchSemWaitTimeout(SYS_ARCH_SEM * sem,FILLP_SLONG timeout)1316 FILLP_INT FillpSysArchSemWaitTimeout(SYS_ARCH_SEM *sem, FILLP_SLONG timeout)
1317 {
1318     return FillpAdaptSysArchSemWaitTimeout(sem, timeout);
1319 }
1320 
FillpSysArchSchedYield(void)1321 static FILLP_INT FillpSysArchSchedYield(void)
1322 {
1323 #ifdef FILLP_LINUX
1324 #if defined(FILLP_LW_LITEOS)
1325     return LOS_TaskYield();
1326 #else
1327     return sched_yield();
1328 #endif
1329 #else
1330     return FILLP_SUCCESS;
1331 #endif
1332 }
1333 
1334 #if defined(FILLP_MAC)
FillpSysOsInit(IN void)1335 void FillpSysOsInit(IN void)
1336 {
1337     g_fillpMacSelf = mach_task_self();
1338     host_get_clock_service(g_fillpMacSelf, SYSTEM_CLOCK, &g_sclock);
1339     (void)mach_timebase_info(&g_macTimeBaseInfo);
1340 }
1341 #elif defined(FILLP_WIN32)
FillpSysOsInit(IN void)1342 void FillpSysOsInit(IN void)
1343 {
1344     FillpSysArchInitTime();
1345 }
1346 #else
1347 #define FillpSysOsInit()
1348 #endif
1349 
1350 #if defined(FILLP_MAC)
FillpSysOsDeinit(IN void)1351 void FillpSysOsDeinit(IN void)
1352 {
1353     mach_port_deallocate(g_fillpMacSelf, g_sclock);
1354 }
1355 #else
FillpSysOsDeinit(IN void)1356 void FillpSysOsDeinit(IN void)
1357 {
1358     return;
1359 }
1360 #endif
1361 
FillpRegBasicFun(void)1362 static void FillpRegBasicFun(void)
1363 {
1364     /* Basic Os function Registration start */
1365     g_fillpOsBasicLibFun.memCalloc = FillpMemCalloc;
1366     g_fillpOsBasicLibFun.memAlloc = FillpMemAlloc;
1367     g_fillpOsBasicLibFun.memFree = FillpMemFree;
1368     g_fillpOsBasicLibFun.memChr = FillpMemChr;
1369     g_fillpOsBasicLibFun.fillpStrLen = FillpStrLen;
1370     g_fillpOsBasicLibFun.fillpRand = FillpRand;
1371     g_fillpOsBasicLibFun.fillpCreateThread = FillpCreateThread;
1372     g_fillpOsBasicLibFun.sysArcInit = FillpSysArchInit;
1373     g_fillpOsBasicLibFun.sysArcGetCurTimeLongLong = FillpSysArchGetCurTimeLonglong;
1374     g_fillpOsBasicLibFun.sysArchAtomicInc = FillpSysArchAtomicInc;
1375     g_fillpOsBasicLibFun.sysArchAtomicIncAndTest = FillpSysArchAtomicIncAndTest;
1376     g_fillpOsBasicLibFun.sysArchAtomicDec = FillpSysArchAtomicDec;
1377     g_fillpOsBasicLibFun.sysArchAtomicDecAndTest = FillpSysArchAtomicDecAndTest;
1378     g_fillpOsBasicLibFun.sysArchAtomicRead = FillpSysArchAtomicRead;
1379     g_fillpOsBasicLibFun.sysArchAtomicSet = FillpSysArchAtomicSet;
1380     g_fillpOsBasicLibFun.sysArchCompAndSwap = FillpSysArchCompAndWwap;
1381     g_fillpOsBasicLibFun.sysSleepMs = FillpSysSleepMs;
1382     g_fillpOsBasicLibFun.sysUsleep = FillpSysSleepUs;
1383     g_fillpOsBasicLibFun.rtePause = FillpAdpRtePause;
1384     /* product MUST register for this, there is no default callback function for this */
1385     g_fillpOsBasicLibFun.cryptoRand = FILLP_NULL_PTR;
1386 
1387     /* Semaphore function Registration start */
1388     g_fillpOsSemLibFun.sysArchSemClose = FillpSysArchSemClose;
1389     g_fillpOsSemLibFun.sysArchSemInit = FillpArchInitSem;
1390     g_fillpOsSemLibFun.sysArchSemTryWait = FillpSemTryWait;
1391     g_fillpOsSemLibFun.sysArchSemWait = FillpSemWait;
1392     g_fillpOsSemLibFun.sysArchSemPost = FillpSemPost;
1393     g_fillpOsSemLibFun.sysArchSemDestroy = FillpSemDestroy;
1394     g_fillpOsSemLibFun.sysArchSemWaitTimeout = FillpSysArchSemWaitTimeout;
1395     g_fillpOsSemLibFun.sysArchRWSemInit = FillpArchInitRwSem;
1396     g_fillpOsSemLibFun.sysArchRWSemTryRDWait = FillpRwSemTryRdWait;
1397     g_fillpOsSemLibFun.sysArchRWSemTryWRWait = FillpRwSemTryWrWait;
1398     g_fillpOsSemLibFun.sysArchRWSemRDPost = FillpRwSemRdPost;
1399     g_fillpOsSemLibFun.sysArchRWSemWRPost = FillpRwSemWrPost;
1400     g_fillpOsSemLibFun.sysArchRWSemDestroy = FillpRwSemDestroy;
1401     g_fillpOsSemLibFun.sysArchSchedYield = FillpSysArchSchedYield;
1402 }
1403 
1404 /*******************************************************************************
1405     Function     : FillpRegAdpLibSysFunc
1406 
1407     Des            : Adaptor function
1408     Input         : None
1409 
1410 
1411     Output       :None
1412 
1413     Return       :None
1414  *******************************************************************************/
FillpRegLibSysFunc(IN void)1415 void FillpRegLibSysFunc(IN void)
1416 {
1417     FillpSysOsInit();
1418 
1419     FillpRegBasicFun();
1420 
1421     /* Socket function registration Start */
1422     g_fillpOsSocketLibFun.socketCallbackFunc = FillpFuncCreateSocket;
1423     g_fillpOsSocketLibFun.select = FillpSelect;
1424     g_fillpOsSocketLibFun.bindCallbackFunc = FillpFuncBindSocket;
1425     g_fillpOsSocketLibFun.closeSocketCallbackFunc = FillpFuncCloseSocket;
1426     g_fillpOsSocketLibFun.recvFromCallbackFunc = FillpFuncRecvFrom;
1427     g_fillpOsSocketLibFun.sendtoCallbackFunc = FillpFuncSendTo;
1428     g_fillpOsSocketLibFun.ioctl = FillpFuncIoCtlSocket;
1429     g_fillpOsSocketLibFun.fcntl = FillpFuncFcntl;
1430     g_fillpOsSocketLibFun.setSockOpt = FillpFuncSetSockOpt;
1431     g_fillpOsSocketLibFun.getSockOpt = FillpFuncGetSockOpt;
1432     g_fillpOsSocketLibFun.sendCallbackFunc = FillpFuncSend;
1433     g_fillpOsSocketLibFun.getSockNameCallbackFunc = FillpFuncGetSockName;
1434     g_fillpOsSocketLibFun.connectCallbackFunc = FillpFuncConnectSocket;
1435     g_fillpOsSocketLibFun.fillpFuncFdClr = FillpFuncFdClr;
1436     g_fillpOsSocketLibFun.fillpFuncFdSet = FillpFuncFdSet;
1437     g_fillpOsSocketLibFun.fillpFuncFdIsSet = FillpFuncFdIsSet;
1438     g_fillpOsSocketLibFun.fillpFuncCreateFdSet = FillpFuncCreateFdSet;
1439     g_fillpOsSocketLibFun.fillpFuncDestroyFdSet = FillpFuncDestroyFdSet;
1440     g_fillpOsSocketLibFun.fillpFuncCopyFdSet = FillpFuncCopyFdSet;
1441 
1442     /* Other function registration Start */
1443     g_fillpAppCbkFun.fillpSockCloseCbkFunc = FILLP_NULL_PTR;
1444 }
1445 
1446 #ifdef __cplusplus
1447 }
1448 #endif
1449