Ignore:
Timestamp:
Oct 4, 2018, 11:50:21 PM (3 years ago)
Author:
alain
Message:

Complete restructuration of kernel locks.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kernel/syscalls/sys_mutex.c

    r508 r566  
    3232
    3333
     34#if DEBUG_SYS_MUTEX
     35////////////////////////////////////////////////////
     36static char * sys_mutex_op_str( uint32_t operation )
     37{
     38        if     ( operation == MUTEX_INIT     ) return "INIT";
     39        else if( operation == MUTEX_LOCK     ) return "LOCK";
     40        else if( operation == MUTEX_UNLOCK   ) return "UNLOCK";
     41        else if( operation == MUTEX_TRYLOCK  ) return "TRYLOCK";
     42        else if( operation == MUTEX_DESTROY  ) return "DESTROY";
     43        else                                   return "undefined";
     44}
     45#endif
     46
    3447/////////////////////////////////
    3548int sys_mutex( void     * vaddr,
     
    3851{
    3952        error_t     error;
    40     vseg_t    * vseg;
     53    vseg_t    * vseg;      // for vaddr check
    4154
    4255    thread_t  * this    = CURRENT_THREAD;
    4356    process_t * process = this->process;
     57
     58#if DEBUG_SYS_MUTEX
     59uint64_t    tm_start;
     60uint64_t    tm_end;
     61tm_start = hal_get_cycles();
     62if( DEBUG_SYS_MUTEX < tm_start )
     63printk("\n[DBG] %s : thread %x in process %x enter for %s / cycle %d\n",
     64__FUNCTION__, this->trdid, process->pid, sys_mutex_op_str( operation ), (uint32_t)tm_start );
     65#endif
    4466
    4567    // check vaddr in user vspace
     
    148170            else                          // success
    149171            {
    150                 remote_mutex_unlock( mutex_xp );
     172                error = remote_mutex_unlock( mutex_xp );
     173
     174                if( error )
     175                {
     176
     177#if DEBUG_SYSCALLS_ERROR
     178printk("\n[ERROR] in %s : mutex %x not owned in UNLOCK / thread %x / process %x\n",
     179__FUNCTION__ , (intptr_t)vaddr , this->trdid , process->pid );
     180#endif
     181                    this->errno = EINVAL;
     182                    return -1;
     183                }
     184            }
     185            break;
     186        }
     187        ///////////////////
     188            case MUTEX_TRYLOCK:
     189        {
     190            xptr_t mutex_xp = remote_mutex_from_ident( (intptr_t)vaddr );
     191
     192            if( mutex_xp == XPTR_NULL )     // user error
     193            {
     194
     195#if DEBUG_SYSCALLS_ERROR
     196printk("\n[ERROR] in %s : mutex %x not registered / thread %x / process %x\n",
     197__FUNCTION__ , (intptr_t)vaddr , this->trdid , process->pid );
     198#endif
     199                this->errno = EINVAL;
     200                return -1;
     201            }
     202            else                          // success
     203            {
     204                error = remote_mutex_trylock( mutex_xp );
     205
     206                if( error ) // non fatal : mutex already taken
     207                {
     208                    this->errno = EBUSY;
     209                    return -1;
     210                }
    151211            }
    152212            break;
    153213        }
    154214        ////////
    155         default: {
     215        default:
     216        {
    156217            assert ( false, "illegal operation type <%x>", operation );
    157218        }
    158219        }
    159220
     221    hal_fence();
     222
     223#if DEBUG_SYS_MUTEX
     224tm_end = hal_get_cycles();
     225if( DEBUG_SYS_MUTEX < tm_start )
     226printk("\n[DBG] %s : thread %x in process %x exit for %s / cost %d / cycle %d\n",
     227__FUNCTION__, this->trdid, process->pid, sys_mutex_op_str( operation ),
     228(uint32_t)(tm_end - tm_start), (uint32_t)tm_end );
     229#endif
     230
    160231        return 0;
    161232
Note: See TracChangeset for help on using the changeset viewer.