Changeset 26676

Show
Ignore:
Timestamp:
07/29/08 08:03:41 (4 months ago)
Author:
axeld
Message:

First patch by Salvatore to implement XSI semaphores with a few changes
by myself:
* renamed xsi_do_undo() to xsi_sem_undo() (there is more to XSI than sems).
* Fixed coding style issues in sys/sem.h and xsi_sem.cpp.
* Added _kern_*() syscall prototypes to syscalls.h.
* Added a TODO in xsi_sem.cpp and xsi_semaphore.h about moving union semun to

a shared header.

* Made the team::xsi_sem_undo_requests int32 - due to padding, it would have

needed 4 bytes anyway; please always use specific types over int/short/long.

* xsi_sem_undo() now checks if it needs to do anything - the calls in team.cpp

no longer needs to do this.

Location:
haiku/trunk
Files:
5 added
8 modified

Legend:

Unmodified
Added
Removed
  • haiku/trunk/headers/posix/sys/ipc.h

    r25663 r26676  
    77 
    88 
     9#include <sys/cdefs.h> 
    910#include <sys/types.h> 
    10 #error functionality has not yet been implemented 
    1111 
    1212 
     
    1818/* Control commands for msgctl(), semctl(), and shmctl() */ 
    1919#define IPC_RMID        0               /* remove identifier */ 
    20 #define IPC_SET         1 
    21 #define IPC_STAT        2 
     20#define IPC_SET         1               /* set options */ 
     21#define IPC_STAT        2               /* get options */ 
    2222 
    2323/* Private key */ 
    24 #define IPC_PRIVATE     0 
     24#define IPC_PRIVATE             (key_t)0 
    2525 
    2626 
    2727struct ipc_perm { 
    28         key_t   key; 
     28        key_t   key;                    /* IPC identifier */ 
    2929        uid_t   uid;                    /* owner's user ID */ 
    3030        gid_t   gid;                    /* owner's group ID */ 
     
    3535 
    3636 
    37 #ifdef __cplusplus 
    38 extern "C" { 
    39 #endif 
     37__BEGIN_DECLS 
    4038 
    4139key_t ftok(const char *path, int id); 
    4240 
    43 #ifdef __cplusplus 
    44 } 
    45 #endif 
     41__END_DECLS 
    4642 
    4743#endif  /* _SYS_IPC_H */ 
  • haiku/trunk/headers/private/kernel/thread_types.h

    r25704 r26676  
    183183        void                    *io_context; 
    184184        struct realtime_sem_context     *realtime_sem_context; 
     185        int32                   xsi_sem_undo_requests; 
    185186        sem_id                  death_sem;              // semaphore to wait on for dying threads 
    186187        struct list             dead_threads; 
  • haiku/trunk/headers/private/system/syscalls.h

    r26119 r26676  
    3131struct stat; 
    3232struct _sem_t; 
     33struct sembuf; 
     34union semun; 
    3335 
    3436struct disk_device_job_progress_info; 
     
    5658 
    5759extern status_t         _kern_shutdown(bool reboot); 
    58 extern status_t         _kern_get_safemode_option(const char *parameter, char *buffer, size_t *_bufferSize); 
     60extern status_t         _kern_get_safemode_option(const char *parameter, 
     61                                                char *buffer, size_t *_bufferSize); 
    5962 
    6063extern ssize_t          _kern_wait_for_objects(object_wait_info* infos, int numInfos, 
    6164                                                uint32 flags, bigtime_t timeout); 
    62  
    6365 
    6466/* sem functions */ 
     
    6668extern status_t         _kern_delete_sem(sem_id id); 
    6769extern status_t         _kern_switch_sem(sem_id releaseSem, sem_id id); 
    68 extern status_t         _kern_switch_sem_etc(sem_id releaseSem, sem_id id, uint32 count, 
    69                                                 uint32 flags, bigtime_t timeout); 
     70extern status_t         _kern_switch_sem_etc(sem_id releaseSem, sem_id id, 
     71                                                uint32 count, uint32 flags, bigtime_t timeout); 
    7072extern status_t         _kern_acquire_sem(sem_id id); 
    71 extern status_t         _kern_acquire_sem_etc(sem_id id, uint32 count, uint32 flags, bigtime_t timeout); 
     73extern status_t         _kern_acquire_sem_etc(sem_id id, uint32 count, uint32 flags, 
     74                                                bigtime_t timeout); 
    7275extern status_t         _kern_release_sem(sem_id id); 
    7376extern status_t         _kern_release_sem_etc(sem_id id, uint32 count, uint32 flags); 
    7477extern status_t         _kern_get_sem_count(sem_id id, int32* thread_count); 
    75 extern status_t         _kern_get_sem_info(sem_id semaphore, struct sem_info *info, size_t size); 
     78extern status_t         _kern_get_sem_info(sem_id semaphore, struct sem_info *info, 
     79                                                size_t size); 
    7680extern status_t         _kern_get_next_sem_info(team_id team, int32 *cookie, 
    7781                                                struct sem_info *info, size_t size); 
     
    9094extern status_t         _kern_realtime_sem_wait(sem_id semID, bigtime_t timeout); 
    9195 
     96/* POSIX XSI semaphore syscalls */ 
     97extern int                      _kern_xsi_semget(key_t key, int numSems, int flags); 
     98extern int                      _kern_xsi_semctl(int semID, int semNumber, int command, 
     99                                                union semun* args); 
     100extern status_t         _kern_xsi_semop(int semID, struct sembuf *semOps, 
     101                                                size_t numSemOps); 
     102 
    92103/* team & thread syscalls */ 
    93  
    94104extern thread_id        _kern_load_image(const char* const* flatArgs, 
    95105                                                size_t flatArgsSize, int32 argCount, int32 envCount, 
  • haiku/trunk/src/system/kernel/main.cpp

    r26625 r26676  
    3838#include <port.h> 
    3939#include <posix/realtime_sem.h> 
     40#include <posix/xsi_semaphore.h> 
    4041#include <real_time_clock.h> 
    4142#include <sem.h> 
     
    175176                kernel_daemon_init(); 
    176177                arch_platform_init_post_thread(&sKernelArgs); 
     178                TRACE("init posix semaphores\n"); 
    177179                realtime_sem_init(); 
     180                xsi_ipc_init(); 
    178181 
    179182                TRACE("init VM threads\n"); 
  • haiku/trunk/src/system/kernel/posix/Jamfile

    r26253 r26676  
    55KernelMergeObject kernel_posix.o :  
    66        realtime_sem.cpp 
     7        xsi_semaphore.cpp 
    78 
    89        : $(TARGET_KERNEL_PIC_CCFLAGS) 
  • haiku/trunk/src/system/kernel/syscalls.cpp

    r25812 r26676  
    1818#include <thread.h> 
    1919#include <posix/realtime_sem.h> 
     20#include <posix/xsi_semaphore.h> 
    2021#include <sem.h> 
    2122#include <port.h> 
  • haiku/trunk/src/system/kernel/team.cpp

    r26622 r26676  
    3232#include <port.h> 
    3333#include <posix/realtime_sem.h> 
     34#include <posix/xsi_semaphore.h> 
    3435#include <sem.h> 
    3536#include <syscall_process_info.h> 
     
    700701        team->address_space = NULL; 
    701702        team->realtime_sem_context = NULL; 
     703        team->xsi_sem_undo_requests = 0; 
    702704        team->thread_list = NULL; 
    703705        team->main_thread = NULL; 
     
    13231325        delete_team_user_data(team); 
    13241326        vm_delete_areas(team->address_space); 
     1327        xsi_sem_undo(team->id, team->xsi_sem_undo_requests); 
    13251328        delete_owned_ports(team->id); 
    13261329        sem_delete_owned_sems(team->id); 
     
    23392342        vfs_free_io_context(team->io_context); 
    23402343        delete_realtime_sem_context(team->realtime_sem_context); 
     2344        xsi_sem_undo(team->id, team->xsi_sem_undo_requests); 
    23412345        delete_owned_ports(teamID); 
    23422346        sem_delete_owned_sems(teamID); 
  • haiku/trunk/src/system/libroot/posix/sys/Jamfile

    r25486 r26676  
    88        flock.c 
    99        ftime.c 
     10        ftok.c 
    1011        getrusage.c 
    1112        gettimeofday.c 
     
    2425        utimes.c 
    2526        wait.c 
     27        xsi_sem.cpp 
    2628;