Ignore:
Timestamp:
Oct 4, 2007, 8:46:12 PM (18 years ago)
Author:
bird
Message:

hacking darwin.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kStuff/kLdr/kLdrDyldSem.c

    r3577 r3598  
    3131#include <k/kDefs.h>
    3232#include <k/kHlpSem.h>
     33#include <k/kHlpAssert.h>
    3334
    34 #if K_OS == K_OS_OS2
     35#if K_OS == K_OS_DARWIN
     36# include <mach/mach.h>
     37
     38#elif K_OS == K_OS_OS2
    3539# define INCL_BASE
    3640# define INCL_ERRORS
    3741# include <os2.h>
     42
    3843#elif  K_OS == K_OS_WINDOWS
    3944# include <Windows.h>
     45
    4046#else
    4147# error "port me"
     
    4753*   Global Variables                                                           *
    4854*******************************************************************************/
    49 #if K_OS == K_OS_OS2
     55#if K_OS == K_OS_DARWIN
     56/** The loader sempahore. */
     57static semaphore_t      g_Semaphore = MACH_PORT_NULL;
     58
     59#elif K_OS == K_OS_OS2
    5060/** The loader sempahore. */
    5161static HMTX             g_hmtx;
     
    5464/** The loader sempahore. */
    5565static CRITICAL_SECTION g_CritSect;
     66
    5667#else
    5768# error "port me"
     
    6475 * @returns 0 on success, non-zero OS status code on failure.
    6576 */
    66 int     kLdrDyldSemInit(void)
     77int kLdrDyldSemInit(void)
    6778{
    68 #if K_OS == K_OS_OS2
     79#if K_OS == K_OS_DARWIN
     80    kern_return_t krc;
     81
     82    krc = semaphore_create(mach_task_self(), &g_Semaphore, SYNC_POLICY_FIFO, 0);
     83    if (krc != KERN_SUCCESS)
     84        return krc;
     85
     86#elif K_OS == K_OS_OS2
    6987    APIRET rc;
    7088    g_hmtx = NULLHANDLE;
     
    86104 * Terminates the loader semaphore.
    87105 */
    88 void    kLdrDyldSemTerm(void)
     106void kLdrDyldSemTerm(void)
    89107{
    90 #if K_OS == K_OS_OS2
     108#if K_OS == K_OS_DARWIN
     109    kern_return_t krc;
     110    semaphore_t Semaphore = g_Semaphore;
     111    g_Semaphore = MACH_PORT_NULL;
     112    krc = semaphore_destroy(mach_task_self(), Semaphore);
     113    kHlpAssert(krc == KERN_SUCCESS); (void)krc;
     114
     115#elif K_OS == K_OS_OS2
    91116    HMTX hmtx = g_hmtx;
    92117    g_hmtx = NULLHANDLE;
     
    108133 * @returns 0 on success, non-zero OS status code on failure.
    109134 */
    110 int     kLdrDyldSemRequest(void)
     135int kLdrDyldSemRequest(void)
    111136{
    112 #if K_OS == K_OS_OS2
     137#if K_OS == K_OS_DARWIN
     138    /* not sure about this... */
     139    kern_return_t krc;
     140    do krc = semaphore_wait(g_Semaphore);
     141    while (krc == KERN_ABORTED);
     142    if (krc == KERN_SUCCESS)
     143        return 0;
     144    return krc;
     145
     146#elif K_OS == K_OS_OS2
    113147    APIRET rc = DosRequestMutexSem(g_hmtx, 5000);
    114148    if (rc == ERROR_TIMEOUT || rc == ERROR_SEM_TIMEOUT || rc == ERROR_INTERRUPT)
     
    140174 * The caller is responsible for making sure it's the semaphore owner!
    141175 */
    142 void    kLdrDyldSemRelease(void)
     176void kLdrDyldSemRelease(void)
    143177{
    144 #if K_OS == K_OS_OS2
     178#if K_OS == K_OS_DARWIN
     179    /* not too sure about this... */
     180    kern_return_t krc = semaphore_signal(g_Semaphore);
     181    kHlpAssert(krc == KERN_SUCCESS); (void)krc;
     182
     183#elif K_OS == K_OS_OS2
    145184    APIRET rc = DosReleaseMutexSem(g_hmtx);
    146185    kHlpAssert(!rc); (void)rc;
     
    152191# error "port me"
    153192#endif
    154 
    155193}
    156194
Note: See TracChangeset for help on using the changeset viewer.