Implemented sigpending().
Forgot to atomically get some thread_debug_info values. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14458 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
50374cbdca
commit
e4d36dd1f4
@ -9,15 +9,14 @@
|
|||||||
|
|
||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <debugger.h>
|
|
||||||
#include <thread.h>
|
#include <thread.h>
|
||||||
#include <team.h>
|
#include <team.h>
|
||||||
#include <int.h>
|
|
||||||
#include <sem.h>
|
#include <sem.h>
|
||||||
#include <ksignal.h>
|
#include <ksignal.h>
|
||||||
#include <syscalls.h>
|
|
||||||
#include <user_debugger.h>
|
#include <user_debugger.h>
|
||||||
|
#include <kernel.h>
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -51,12 +50,12 @@ notify_debugger(struct thread *thread, int signal, struct sigaction *handler,
|
|||||||
|
|
||||||
// first check the ignore signal masks the debugger specified for the thread
|
// first check the ignore signal masks the debugger specified for the thread
|
||||||
|
|
||||||
if (thread->debug_info.ignore_signals_once & signalMask) {
|
if (atomic_get(&thread->debug_info.ignore_signals_once) & signalMask) {
|
||||||
atomic_and(&thread->debug_info.ignore_signals_once, ~signalMask);
|
atomic_and(&thread->debug_info.ignore_signals_once, ~signalMask);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thread->debug_info.ignore_signals & signalMask)
|
if (atomic_get(&thread->debug_info.ignore_signals) & signalMask)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// deliver the event
|
// deliver the event
|
||||||
@ -510,6 +509,26 @@ set_alarm(bigtime_t time, uint32 mode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
sigsuspend(const sigset_t *mask)
|
||||||
|
{
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
sigpending(sigset_t *set)
|
||||||
|
{
|
||||||
|
struct thread *thread = thread_get_current_thread();
|
||||||
|
|
||||||
|
if (set == NULL)
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
|
*set = atomic_get(&thread->sig_pending);
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
@ -572,27 +591,35 @@ _user_sigaction(int signal, const struct sigaction *userAction, struct sigaction
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
_user_sigsuspend(const sigset_t *mask)
|
_user_sigsuspend(const sigset_t *userMask)
|
||||||
{
|
{
|
||||||
sigset_t set;
|
sigset_t mask;
|
||||||
if (mask == NULL)
|
|
||||||
return B_BAD_VALUE;
|
|
||||||
|
|
||||||
if (user_memcpy(&set, mask, sizeof(sigset_t)) < B_OK)
|
if (userMask == NULL)
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
if (user_memcpy(&mask, userMask, sizeof(sigset_t)) < B_OK)
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
// ToDo: implement
|
return sigsuspend(&mask);
|
||||||
return B_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
_user_sigpending(sigset_t *set)
|
_user_sigpending(sigset_t *userSet)
|
||||||
{
|
{
|
||||||
if (set == NULL)
|
sigset_t set;
|
||||||
return B_BAD_VALUE;
|
int status;
|
||||||
|
|
||||||
// ToDo: implement
|
if (userSet == NULL)
|
||||||
return B_ERROR;
|
return B_BAD_VALUE;
|
||||||
|
if (!IS_USER_ADDRESS(userSet))
|
||||||
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
|
status = sigpending(&set);
|
||||||
|
if (status == B_OK
|
||||||
|
&& user_memcpy(userSet, &set, sizeof(sigset_t)) < B_OK)
|
||||||
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user