diff --git a/library/amiga_dotimer.c b/library/amiga_dotimer.c index 4e4d81f..b7bb3b1 100644 --- a/library/amiga_dotimer.c +++ b/library/amiga_dotimer.c @@ -1,5 +1,5 @@ /* - * $Id: amiga_dotimer.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $ + * $Id: amiga_dotimer.c,v 1.3 2005-03-06 09:00:16 obarthel Exp $ * * :ts=4 * @@ -58,18 +58,37 @@ DoTimer(struct timeval *tv,LONG unit,LONG command) assert( tv != NULL ); - mp = AllocVec(sizeof(*mp),MEMF_ANY|MEMF_PUBLIC|MEMF_CLEAR); - if(mp == NULL) + #if defined(__amigaos4__) { - error = IOERR_OPENFAIL; - goto out; - } + mp = AllocSysObjectTags(ASOT_PORT, + ASOPORT_Action, PA_SIGNAL, + ASOPORT_Signal, SIGB_SINGLE, + ASOPORT_Target, FindTask(NULL), + TAG_DONE); - mp->mp_Node.ln_Type = NT_MSGPORT; - mp->mp_Flags = PA_SIGNAL; - mp->mp_SigBit = SIGB_SINGLE; - mp->mp_SigTask = FindTask(NULL); - NewList(&mp->mp_MsgList); + if(mp == NULL) + { + error = IOERR_OPENFAIL; + goto out; + } + } + #else + { + mp = AllocVec(sizeof(*mp),MEMF_ANY|MEMF_PUBLIC|MEMF_CLEAR); + if(mp == NULL) + { + error = IOERR_OPENFAIL; + goto out; + } + + mp->mp_Node.ln_Type = NT_MSGPORT; + mp->mp_Flags = PA_SIGNAL; + mp->mp_SigBit = SIGB_SINGLE; + mp->mp_SigTask = FindTask(NULL); + + NewList(&mp->mp_MsgList); + } + #endif /* __amigaos4__ */ tr = (struct timerequest *)CreateIORequest(mp,sizeof(*tr)); if(tr == NULL) @@ -107,7 +126,16 @@ DoTimer(struct timeval *tv,LONG unit,LONG command) DeleteIORequest((struct IORequest *)tr); } - FreeVec(mp); + #if defined(__amigaos4__) + { + if(mp != NULL) + FreeSysObject(ASOT_PORT,mp); + } + #else + { + FreeVec(mp); + } + #endif /* __amigaos4__ */ return(error); } diff --git a/library/changes b/library/changes index 42fa7a3..2d4f96b 100644 --- a/library/changes +++ b/library/changes @@ -1,3 +1,12 @@ +- DoTimer() now calls AllocSysObject() rather than making up + a MsgPort locally. + +- The record locking semaphore code now builds a semaphore to add + before it tries to find the public one in memory. That way, the + code can spend less time in Forbid() state and, heaven forbid, + refrain from allocating memory while in that state. + + c.lib 1.189 (5.3.2005) - Rewrote the __translate_unix_to_amiga_path_name() function to diff --git a/library/stdio_record_locking.c b/library/stdio_record_locking.c index 919dd21..d204837 100644 --- a/library/stdio_record_locking.c +++ b/library/stdio_record_locking.c @@ -1,5 +1,5 @@ /* - * $Id: stdio_record_locking.c,v 1.5 2005-03-04 09:07:09 obarthel Exp $ + * $Id: stdio_record_locking.c,v 1.6 2005-03-06 09:00:16 obarthel Exp $ * * :ts=4 * @@ -138,6 +138,35 @@ obtain_file_lock_semaphore(BOOL shared) if(FileLockSemaphore == NULL && __file_lock_semaphore_name != NULL && __file_lock_semaphore_name[0] != '\0') { + struct FileLockSemaphore * fls; + + /* We allocate the new semaphore first, so that we don't spend + any time in Forbid() allocating memory. */ + #if defined(__amigaos4__) + { + fls = AllocSysObjectTags(ASOT_SEMAPHORE, + ASOSEM_Size, sizeof(*fls), + ASOSEM_Name, __file_lock_semaphore_name, + ASOSEM_Pri, 1, + TAG_END); + } + #else + { + fls = AllocVec(sizeof(*fls) + strlen(__file_lock_semaphore_name) + 1,MEMF_ANY|MEMF_PUBLIC); + if(fls != NULL) + { + memset(fls,0,sizeof(*fls)); + + InitSemaphore(&fls->fls_Semaphore); + + fls->fls_Semaphore.ss_Link.ln_Name = (char *)(fls + 1); + strcpy(fls->fls_Semaphore.ss_Link.ln_Name,__file_lock_semaphore_name); + + fls->fls_Semaphore.ss_Link.ln_Pri = 1; + } + } + #endif /* __amigaos4__ */ + SHOWMSG("try to find the locking semaphore"); Forbid(); @@ -145,48 +174,29 @@ obtain_file_lock_semaphore(BOOL shared) FileLockSemaphore = (struct FileLockSemaphore *)FindSemaphore((STRPTR)__file_lock_semaphore_name); if(FileLockSemaphore == NULL) { - SHOWMSG("didn't find it; we're going to make our own"); + SHOWMSG("didn't find it; we're going to add our own"); - #if defined(__amigaos4__) - { - FileLockSemaphore = AllocSysObjectTags(ASOT_SEMAPHORE, - ASOSEM_Size, sizeof(*FileLockSemaphore), - ASOSEM_Name, __file_lock_semaphore_name, - ASOSEM_Pri, 1, - TAG_END); - } - #else - { - FileLockSemaphore = AllocMem(sizeof(*FileLockSemaphore) + strlen(__file_lock_semaphore_name)+1,MEMF_ANY|MEMF_PUBLIC); - if(FileLockSemaphore != NULL) - { - memset(FileLockSemaphore,0,sizeof(*FileLockSemaphore)); - - InitSemaphore(&FileLockSemaphore->fls_Semaphore); - - FileLockSemaphore->fls_Semaphore.ss_Link.ln_Name = (char *)(FileLockSemaphore + 1); - strcpy(FileLockSemaphore->fls_Semaphore.ss_Link.ln_Name,__file_lock_semaphore_name); - - FileLockSemaphore->fls_Semaphore.ss_Link.ln_Pri = 1; - } - } - #endif /* __amigaos4__ */ - - if(FileLockSemaphore != NULL) + if(fls != NULL) { SHOWMSG("adding our own semaphore"); - FileLockSemaphore->fls_Size = sizeof(*FileLockSemaphore); - NewList((struct List *)&FileLockSemaphore->fls_LockList); + fls->fls_Size = sizeof(*fls); + NewList((struct List *)&fls->fls_LockList); - AddSemaphore(&FileLockSemaphore->fls_Semaphore); + AddSemaphore(&fls->fls_Semaphore); + + FileLockSemaphore = fls; + fls = NULL; } else { SHOWMSG("not enough memory"); } } - else if (FileLockSemaphore->fls_Size < sizeof(*FileLockSemaphore)) + + Permit(); + + if(FileLockSemaphore != NULL && FileLockSemaphore->fls_Size < sizeof(*FileLockSemaphore)) { SHOWMSG("semaphore found, but it's too short"); @@ -196,7 +206,20 @@ obtain_file_lock_semaphore(BOOL shared) FileLockSemaphore = NULL; } - Permit(); + /* Release the memory allocated for the semaphore, in case + we didn't need it after all. */ + if(fls != NULL) + { + #if defined(__amigaos4__) + { + FreeSysObject(ASOT_SEMAPHORE,fls); + } + #else + { + FreeVec(fls); + } + #endif /* __amigaos4__ */ + } } if(FileLockSemaphore != NULL)