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