24#include "arch/sys_arch.h"
28static arch_message msg_pool[SYS_MAX_MESSAGES];
29static arch_message *free_head;
32static inline arch_message *alloc_msg(
void);
33static void free_msg(arch_message *msg);
34static int WaitSemaTimeout(
int sema,
unsigned int msec);
36static int MsgCountSema;
40static inline arch_message *try_alloc_msg(
void)
42 arch_message *message;
44 if(PollSema(MsgCountSema)==MsgCountSema)
49 free_head = free_head->next;
57static inline arch_message *alloc_msg(
void)
59 arch_message *message;
61 WaitSema(MsgCountSema);
65 free_head = free_head->next;
72static void free_msg(arch_message *msg)
76 msg->next = free_head;
80 SignalSema(MsgCountSema);
94 thp.stack_size = stacksize;
95 thp.stack = malloc(stacksize);
96 thp.initial_priority = prio;
99 if((tid = CreateThread(&thp)) < 0)
101 dbgprintf(
"sys_thread_new: CreateThread failed, EC: %d\n", tid);
105 if((rv = StartThread(tid, arg)) < 0)
107 dbgprintf(
"sys_thread_new: StartThread failed, EC: %d\n", rv);
112 dbgprintf(
"sys_thread_new(): %d\n", tid);
114 return((sys_thread_t)tid);
126 if((MBox=malloc(
sizeof(
struct MboxData)))!=NULL)
129 MBox->LastMessage=MBox->FirstMessage=NULL;
132 sema.option = (u32)
"PS2IP-msgcount";
134 sema.max_count=SYS_MAX_MESSAGES;
135 if((MBox->MessageCountSema=CreateSema(&sema))<0)
137 printf(
"sys_mbox_new: CreateMbx failed. Code: %d\n", MBox->MessageCountSema);
143 printf(
"sys_mbox_new: Out of memory.\n");
147 dbgprintf(
"sys_mbox_new(): sema %d\n", MBox->MessageCountSema);
157 arch_message *Message, *NextMessage;
160 Message=(*pMBox)->FirstMessage;
163 NextMessage=Message->next;
169 DeleteSema((*pMBox)->MessageCountSema);
171 (*pMBox)=SYS_MBOX_NULL;
176 return((*
mbox)!=SYS_MBOX_NULL);
184static void RetrieveMbxInternal(sys_mbox_t mBox, arch_message **message)
186 arch_message *NextMessage;
190 *message=mBox->FirstMessage;
193 NextMessage=((*message != NULL) && ((
unsigned int)(*message)->next!=0xFFFFFFFF))?(*message)->next:NULL;
196 if(mBox->FirstMessage == mBox->LastMessage)
197 mBox->LastMessage = NULL;
199 mBox->FirstMessage = NextMessage;
204static int WaitSemaTimeout(
int sema,
unsigned int msec)
211 if (PollSema(sema) < 0) {
219 if (msec > 0 && msec != UINT32_MAX) {
220 timeoutUsec = msec * 1000;
221 timeoutPtr = &timeoutUsec;
231static int ReceiveMbx(arch_message **message, sys_mbox_t mBox, u32_t timeout)
236 result = WaitSemaTimeout(mBox->MessageCountSema, timeout);
238 result = WaitSema(mBox->MessageCountSema);
241 if(result == mBox->MessageCountSema)
243 RetrieveMbxInternal(mBox, message);
251static int PollMbx(arch_message **message, sys_mbox_t mBox)
255 if(PollSema(mBox->MessageCountSema)==mBox->MessageCountSema)
257 RetrieveMbxInternal(mBox, message);
265static u32_t sys_arch_mbox_fetch_internal(sys_mbox_t pMBox,
void** ppvMSG, u32_t u32Timeout,
char block)
268 unsigned int TimeElasped;
278 if((result=ReceiveMbx(&pmsg, pMBox, u32Timeout))==0){
279 TimeElasped = (clock() - start) / (1000);
292 if(ppvMSG!=NULL) *ppvMSG = pmsg->sys_msg;
303 return sys_arch_mbox_fetch_internal(*pMBox, ppvMSG, u32Timeout, 1);
308 return sys_arch_mbox_fetch_internal(*pMBox, ppvMSG, 0, 0);
311static void SendMbx(sys_mbox_t *
mbox, arch_message *msg,
void *sys_msg){
315 msg->sys_msg = sys_msg;
317 if((*mbox)->FirstMessage==NULL) (*mbox)->FirstMessage=msg;
318 if((*mbox)->LastMessage!=NULL) (*mbox)->LastMessage->next=msg;
319 (*mbox)->LastMessage=msg;
322 SignalSema((*mbox)->MessageCountSema);
331 if((msg=try_alloc_msg())!=NULL){
332 SendMbx(
mbox, msg, sys_msg);
352 SendMbx(
mbox, alloc_msg(), sys_msg);
360 sema.init_count =
count;
363 sema.option = (u32)
"PS2IP";
365 if((*sem=CreateSema(&sema))<0)
367 printf(
"sys_sem_new: CreateSema failed, EC: %d\n", *sem);
371 dbgprintf(
"sys_sem_new: CreateSema (CNT: %d) %d\n",
count, *sem);
398 if(WaitSemaTimeout(*sema, timeout) == *sema)
400 WaitTime=(clock()-start)/(1000);
401 result=(WaitTime <= timeout ? WaitTime : timeout);
439static int s_protect_sem;
440static int s_protect_count = 0;
441static int s_protect_owner;
443sys_prot_t sys_arch_protect(
void)
445 int tid = GetThreadId();
446 if (s_protect_count > 0 && s_protect_owner == tid)
451 WaitSema(s_protect_sem);
452 s_protect_owner = tid;
457void sys_arch_unprotect(sys_prot_t level)
462 if (s_protect_count > 0)
470 SignalSema(s_protect_sem);
479 dbgprintf(
"sys_init: Initializing...\n");
482 sema.option = (u32)
"PS2IP";
483 sema.init_count = sema.max_count = SYS_MAX_MESSAGES;
484 MsgCountSema=CreateSema(&sema);
488 sema.option = (u32)
"PS2IP_PROTECT";
491 s_protect_sem = CreateSema(&sema);
495 free_head = &msg_pool[0];
498 for(i = 1; i < SYS_MAX_MESSAGES; i++)
500 prev->next = &msg_pool[i];
510 return(clock()/1000);
513void *ps2ip_calloc64(
size_t n,
size_t size)
516 size_t sz = n * size;
518 if ((ptr = memalign(64, sz)) == NULL)
void sys_mbox_set_invalid(sys_mbox_t *mbox)
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
int sys_mbox_valid(sys_mbox_t *mbox)
void sys_mbox_post(sys_mbox_t *mbox, void *msg)
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
err_t sys_mbox_new(sys_mbox_t *mbox, int size)
void sys_mbox_free(sys_mbox_t *mbox)
err_t sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg)
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
int sys_sem_valid(sys_sem_t *sem)
void sys_sem_set_invalid(sys_sem_t *sem)
void sys_sem_free(sys_sem_t *sem)
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
void sys_sem_signal(sys_sem_t *sem)
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
s32 WaitSemaEx(s32 semaid, int signal, u64 *timeout)
void(*) lwip_thread_fn(void *arg)
u32 count
start sector of fragmented bd/file