diff --git a/Documentation/NuttxUserGuide.html b/Documentation/NuttxUserGuide.html
index c4bc4c839d..9efb520f46 100644
--- a/Documentation/NuttxUserGuide.html
+++ b/Documentation/NuttxUserGuide.html
@@ -203,49 +203,51 @@ paragraphs.
2.1.3 task_activate
2.1.4 task_delete
2.1.5 task_restart
+ 2.1.6 task_setcancelstate
Standard interfaces
Standard vfork and exec[v|l] interfaces:
Standard posix_spawn interfaces:
Non-standard task control interfaces inspired by posix_spawn:
@@ -597,7 +599,59 @@ VxWorks provides the following similar interface:
-
+
+
+Function Prototype:
+
+
+ #include <sched.h>
+ int task_setcancelstate(int state, int *oldstate);
+
+
+Description:
+
+
+The task_setcancelstate() function atomically
+sets both the calling task's cancelability state to the indicated
+state and returns the previous cancelability state at the location
+referenced by oldstate.
+Legal values for state are TASK_CANCEL_ENABLE and TASK_CANCEL_DISABLE.
+
+
+Any pending thread cancellation may occur at the time that the
+cancellation state is set to TASK_CANCEL_ENABLE.
+
+
+The cancelability state and type of any newly created tasks are TASK_CANCEL_ENABLE and TASK_CANCEL_DEFERRED respectively.
+
+Input Parameters:
+
+
+
+state
+New cancellation state. One of PTHREAD_CANCEL_ENABLE or PTHREAD_CANCEL_DISABLE.
+oldstate.
+Location to return the previous cancellation state.
+
+
+
+Returned Value:
+
+
+Zero (OK) on success; ERROR is returned on any failure with the errno value set appropriately:
+
+
+
+ESRCH.
+No thread could be found corresponding to that specified by the given thread ID.
+
+
+Assumptions/Limitations:
+
+POSIX Compatibility: This is a non-standard interface. It extends the functionality of pthread_setcancelstate() to tasks and supports use of task_delete.
+
+
+
Function Prototype:
@@ -643,7 +697,7 @@ And the UNIX interface:
The code parameter is ignored.
-
+
Function Prototype:
@@ -671,7 +725,7 @@ level.
Compatible with the POSIX interface of the same name.
-
+
Function Prototype:
@@ -705,7 +759,7 @@ pid_t vfork(void);
Compatible with the Unix interface of the same name.
-
+
Function Prototype:
@@ -791,7 +845,7 @@ int execv(FAR const char *path, FAR char *const argv[]);
There are, however, several compatibility issues as detailed in the description above.
-
+
Function Prototype:
@@ -835,7 +889,7 @@ int execl(FAR const char *path, ...);
There are, however, several compatibility issues as detailed in the description of execv().
-
+
Function Prototype:
@@ -978,7 +1032,7 @@ int posix_spawnp(FAR pid_t *pid, FAR const char *file,
For the caller of posix_spawn(), the provided argv[0] will correspond to argv[1] received by the new task.
-
+
Function Prototype:
@@ -1004,7 +1058,7 @@ int posix_spawn_file_actions_init(FAR posix_spawn_file_actions_t *file_actions);
On success, this function returns 0; on failure it will return an error number from <errno.h>.
-
+
Function Prototype:
@@ -1031,7 +1085,7 @@ int posix_spawn_file_actions_destroy(FAR posix_spawn_file_actions_t *file_action
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1062,7 +1116,7 @@ int posix_spawn_file_actions_addclose(FAR posix_spawn_file_actions_t *file_actio
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1099,7 +1153,7 @@ int posix_spawn_file_actions_adddup2(FAR posix_spawn_file_actions_t *file_action
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1144,7 +1198,7 @@ int posix_spawn_file_actions_addopen(FAR posix_spawn_file_actions_t *file_action
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1180,7 +1234,7 @@ int posix_spawnattr_init(FAR posix_spawnattr_t *attr);
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1210,7 +1264,7 @@ int posix_spawnattr_getflags(FAR const posix_spawnattr_t *attr, FAR short *flags
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1240,7 +1294,7 @@ int posix_spawnattr_getschedparam(FAR const posix_spawnattr_t *attr, FAR struct
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1270,7 +1324,7 @@ int posix_spawnattr_getschedpolicy(FAR const posix_spawnattr_t *attr, FAR int *p
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1302,7 +1356,7 @@ int posix_spawnattr_getsigmask(FAR const posix_spawnattr_t *attr, FAR sigset_t *
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1332,7 +1386,7 @@ int posix_spawnattr_setflags(FAR posix_spawnattr_t *attr, short flags);
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1362,7 +1416,7 @@ int posix_spawnattr_setschedparam(FAR posix_spawnattr_t *attr, FAR const struct
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1392,7 +1446,7 @@ int posix_spawnattr_setschedpolicy(FAR posix_spawnattr_t *attr, int policy);
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1424,7 +1478,7 @@ int posix_spawnattr_setsigmask(FAR posix_spawnattr_t *attr, FAR const sigset_t *
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1538,7 +1592,7 @@ int task_spawn(FAR pid_t *pid, FAR const char *name, main_t entry,
This is a non-standard interface inspired by posix_spawn().
-
+
Function Prototype:
@@ -1568,7 +1622,7 @@ int task_spawnattr_getstacksize(FAR const posix_spawnattr_t *attr, FAR size_t *s
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -1598,7 +1652,7 @@ int task_spawnattr_setstacksize(FAR posix_spawnattr_t *attr, size_t stacksize);
On success, this function returns 0; on failure it will return an error number from <errno.h>
-
+
Function Prototype:
@@ -10194,10 +10248,10 @@ notify a task when a message is available on a queue.
pthread_once
pthread_self
pthread_setcancelstate
+ pthread_setcanceltype
pthread_setschedparam
pthread_setspecific
pthread_sigmask
- pthread_setcanceltype
pthread_testcancel
pthread_yield
puts
@@ -10268,6 +10322,7 @@ notify a task when a message is available on a queue.
task_init
task_restart
Task Scheduling Interfaces
+ task_setcancelstate
task_spawn
task_spawnattr_getstacksize
task_spawnattr_setstacksize
diff --git a/include/sched.h b/include/sched.h
index 31526f923e..44877c2341 100644
--- a/include/sched.h
+++ b/include/sched.h
@@ -229,6 +229,8 @@ int task_create(FAR const char *name, int priority, int stack_size,
int task_delete(pid_t pid);
int task_restart(pid_t pid);
+int task_setcancelstate(int state, FAR int *oldstate);
+
/* Task Scheduling Interfaces (based on POSIX APIs) */
int sched_setparam(pid_t pid, const struct sched_param *param);
diff --git a/include/sys/syscall.h b/include/sys/syscall.h
index 99fd22b454..06aa183658 100644
--- a/include/sys/syscall.h
+++ b/include/sys/syscall.h
@@ -128,8 +128,9 @@
# define SYS_task_delete __SYS_task_delete
# define SYS_task_restart (__SYS_task_delete+1)
-# define SYS_up_assert (__SYS_task_delete+2)
-# define __SYS_vfork (__SYS_task_delete+3)
+# define SYS_task_setcancelstate (__SYS_task_delete+2)
+# define SYS_up_assert (__SYS_task_delete+3)
+# define __SYS_vfork (__SYS_task_delete+4)
/* The following can be individually enabled */
@@ -400,18 +401,17 @@
# define SYS_pthread_mutex_trylock (__SYS_pthread+20)
# define SYS_pthread_mutex_unlock (__SYS_pthread+21)
# define SYS_pthread_once (__SYS_pthread+22)
-# define SYS_pthread_setcancelstate (__SYS_pthread+23)
-# define SYS_pthread_setschedparam (__SYS_pthread+24)
-# define SYS_pthread_setschedprio (__SYS_pthread+25)
-# define SYS_pthread_setspecific (__SYS_pthread+26)
-# define SYS_pthread_yield (__SYS_pthread+27)
+# define SYS_pthread_setschedparam (__SYS_pthread+23)
+# define SYS_pthread_setschedprio (__SYS_pthread+24)
+# define SYS_pthread_setspecific (__SYS_pthread+25)
+# define SYS_pthread_yield (__SYS_pthread+26)
# ifdef CONFIG_CANCELLATION_POINTS
-# define SYS_pthread_setcanceltype (__SYS_pthread+28)
-# define SYS_pthread_testcancel (__SYS_pthread+29)
-# define __SYS_pthread_smp (__SYS_pthread+30)
+# define SYS_pthread_setcanceltype (__SYS_pthread+27)
+# define SYS_pthread_testcancel (__SYS_pthread+28)
+# define __SYS_pthread_smp (__SYS_pthread+29)
# else
-# define __SYS_pthread_smp (__SYS_pthread+28)
+# define __SYS_pthread_smp (__SYS_pthread+27)
# endif
# ifdef CONFIG_SMP
diff --git a/sched/pthread/Make.defs b/sched/pthread/Make.defs
index c8ef588422..362a6d63bf 100644
--- a/sched/pthread/Make.defs
+++ b/sched/pthread/Make.defs
@@ -42,7 +42,7 @@ CSRCS += pthread_mutexlock.c pthread_mutextrylock.c pthread_mutexunlock.c
CSRCS += pthread_condinit.c pthread_conddestroy.c
CSRCS += pthread_condwait.c pthread_condsignal.c pthread_condbroadcast.c
CSRCS += pthread_barrierinit.c pthread_barrierdestroy.c pthread_barrierwait.c
-CSRCS += pthread_cancel.c pthread_setcancelstate.c
+CSRCS += pthread_cancel.c
CSRCS += pthread_keycreate.c pthread_setspecific.c pthread_getspecific.c
CSRCS += pthread_keydelete.c
CSRCS += pthread_initialize.c pthread_completejoin.c pthread_findjoininfo.c
diff --git a/sched/task/Make.defs b/sched/task/Make.defs
index e173a8b246..9819db2879 100644
--- a/sched/task/Make.defs
+++ b/sched/task/Make.defs
@@ -35,8 +35,9 @@
CSRCS += task_create.c task_init.c task_setup.c task_activate.c
CSRCS += task_start.c task_delete.c task_exit.c task_exithook.c
-CSRCS += task_recover.c task_restart.c task_spawnparms.c task_terminate.c
-CSRCS += task_getgroup.c task_prctl.c task_getpid.c exit.c
+CSRCS += task_getgroup.c task_getpid.c task_prctl.c task_recover.c
+CSRCS += task_restart.c task_spawnparms.c task_setcancelstate.c
+CSRCS += task_terminate.c exit.c
ifeq ($(CONFIG_ARCH_HAVE_VFORK),y)
ifeq ($(CONFIG_SCHED_WAITPID),y)
diff --git a/sched/pthread/pthread_setcancelstate.c b/sched/task/task_setcancelstate.c
similarity index 77%
rename from sched/pthread/pthread_setcancelstate.c
rename to sched/task/task_setcancelstate.c
index bcc5d24f6b..c8fc0460c4 100644
--- a/sched/pthread/pthread_setcancelstate.c
+++ b/sched/task/task_setcancelstate.c
@@ -1,7 +1,7 @@
/****************************************************************************
- * sched/pthread/pthread_setcancelstate.c
+ * sched/task/task_setcancelstate.c
*
- * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007, 2008, 2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
*
* Redistribution and use in source and binary forms, with or without
@@ -39,33 +39,39 @@
#include
-#include
#include
-#include "task/task.h"
#include "sched/sched.h"
+#include "task/task.h"
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
- * Name: pthread_setcancelstate
+ * Name: task_setcancelstate
*
* Description:
- * The pthread_setcancelstate() function atomically both sets the calling
- * thread's cancelability state to the indicated state and returns the
+ * The task_setcancelstate() function atomically both sets the calling
+ * task's cancelability state to the indicated state and returns the
* previous cancelability state at the location referenced by oldstate.
- * Legal values for state are PTHREAD_CANCEL_ENABLE and
- * PTHREAD_CANCEL_DISABLE.
+ * Legal values for state are TASK_CANCEL_ENABLE and TASK_CANCEL_DISABLE.
*
- * The cancelability state and type of any newly created threads,
- * including the thread in which main() was first invoked, are
- * PTHREAD_CANCEL_ENABLE and PTHREAD_CANCEL_DEFERRED respectively.
+ * The cancelability state and type of any newly created tasks are
+ * TASK_CANCEL_ENABLE and TASK_CANCEL_DEFERRED respectively.
+ *
+ * Input Parameters:
+ * state - the new cancellability state, either TASK_CANCEL_ENABLE or
+ * TASK_CANCEL_DISABLE
+ * oldstate - The location to return the old cancellability state.
+ *
+ * Returned Value:
+ * Zero (OK) on success; ERROR is returned on any failure with the
+ * errno value set appropriately.
*
****************************************************************************/
-int pthread_setcancelstate(int state, FAR int *oldstate)
+int task_setcancelstate(int state, FAR int *oldstate)
{
FAR struct tcb_s *tcb = this_task();
int ret = OK;
@@ -124,7 +130,17 @@ int pthread_setcancelstate(int state, FAR int *oldstate)
*/
tcb->flags &= ~TCB_FLAG_CANCEL_PENDING;
- pthread_exit(PTHREAD_CANCELED);
+
+#ifndef CONFIG_DISABLE_PTHREAD
+ if ((tcb->flags & TCB_FLAG_TTYPE_MASK) == TCB_FLAG_TTYPE_PTHREAD)
+ {
+ pthread_exit(PTHREAD_CANCELED);
+ }
+ else
+#endif
+ {
+ exit(EXIT_FAILURE);
+ }
}
}
}
@@ -136,7 +152,8 @@ int pthread_setcancelstate(int state, FAR int *oldstate)
}
else
{
- ret = EINVAL;
+ set_errno(EINVAL);
+ ret = ERROR;
}
sched_unlock();
diff --git a/syscall/syscall.csv b/syscall/syscall.csv
index 19ff12aed6..0687ee4d4d 100644
--- a/syscall/syscall.csv
+++ b/syscall/syscall.csv
@@ -89,7 +89,6 @@
"pthread_mutex_unlock","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_mutex_t*"
"pthread_once","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_once_t*","CODE void (*)(void)"
"pthread_setaffinity_np","pthread.h","!defined(CONFIG_DISABLE_PTHREAD) && defined(CONFIG_SMP)","int","pthread_t","size_t","FAR const cpu_set_t*"
-"pthread_setcancelstate","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","int","FAR int*"
"pthread_setcanceltype","pthread.h","!defined(CONFIG_DISABLE_PTHREAD) && defined(CONFIG_CANCELLATION_POINTS)","int","int","FAR int*"
"pthread_setschedparam","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","pthread_t","int","FAR const struct sched_param*"
"pthread_setschedprio","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","pthread_t","int"
@@ -152,6 +151,7 @@
#"task_create","sched.h","","int","const char*","int","main_t","FAR char * const []|FAR char * const *"
"task_delete","sched.h","","int","pid_t"
"task_restart","sched.h","","int","pid_t"
+"task_setcancelstate","sched.h","","int","int","FAR int*"
"telldir","dirent.h","CONFIG_NFILE_DESCRIPTORS > 0","off_t","FAR DIR*"
"timer_create","time.h","!defined(CONFIG_DISABLE_POSIX_TIMERS)","int","clockid_t","FAR struct sigevent*","FAR timer_t*"
"timer_delete","time.h","!defined(CONFIG_DISABLE_POSIX_TIMERS)","int","timer_t"
diff --git a/syscall/syscall_lookup.h b/syscall/syscall_lookup.h
index 9381c36b0c..f7e2165351 100644
--- a/syscall/syscall_lookup.h
+++ b/syscall/syscall_lookup.h
@@ -86,6 +86,7 @@ SYSCALL_LOOKUP(pgalloc, 2, STUB_pgalloc)
#endif
SYSCALL_LOOKUP(task_delete, 1, STUB_task_delete)
SYSCALL_LOOKUP(task_restart, 1, STUB_task_restart)
+SYSCALL_LOOKUP(task_setcancelstate, 2, STUB_task_setcancelstate)
SYSCALL_LOOKUP(up_assert, 2, STUB_up_assert)
/* The following can be individually enabled */
@@ -290,7 +291,6 @@ SYSCALL_LOOKUP(up_assert, 2, STUB_up_assert)
SYSCALL_LOOKUP(pthread_mutex_trylock, 1, STUB_pthread_mutex_trylock)
SYSCALL_LOOKUP(pthread_mutex_unlock, 1, STUB_pthread_mutex_unlock)
SYSCALL_LOOKUP(pthread_once, 2, STUB_pthread_once)
- SYSCALL_LOOKUP(pthread_setcancelstate, 2, STUB_pthread_setcancelstate)
SYSCALL_LOOKUP(pthread_setschedparam, 3, STUB_pthread_setschedparam)
SYSCALL_LOOKUP(pthread_setschedprio, 2, STUB_pthread_setschedprio)
SYSCALL_LOOKUP(pthread_setspecific, 2, STUB_pthread_setspecific)
diff --git a/syscall/syscall_stublookup.c b/syscall/syscall_stublookup.c
index 3004dedcce..34e60fd1fa 100644
--- a/syscall/syscall_stublookup.c
+++ b/syscall/syscall_stublookup.c
@@ -96,6 +96,8 @@ uintptr_t STUB_task_create(int nbr, uintptr_t parm1, uintptr_t parm2,
uintptr_t parm3, uintptr_t parm4, uintptr_t parm5);
uintptr_t STUB_task_delete(int nbr, uintptr_t parm1);
uintptr_t STUB_task_restart(int nbr, uintptr_t parm1);
+uintptr_t STUB_task_setcancelstate(int nbr, uintptr_t parm1,
+ uintptr_t parm2);
uintptr_t STUB_up_assert(int nbr, uintptr_t parm1, uintptr_t parm2);
/* The following can be individually enabled */
@@ -290,8 +292,6 @@ uintptr_t STUB_pthread_mutex_lock(int nbr, uintptr_t parm1);
uintptr_t STUB_pthread_mutex_trylock(int nbr, uintptr_t parm1);
uintptr_t STUB_pthread_mutex_unlock(int nbr, uintptr_t parm1);
uintptr_t STUB_pthread_once(int nbr, uintptr_t parm1, uintptr_t parm2);
-uintptr_t STUB_pthread_setcancelstate(int nbr, uintptr_t parm1,
- uintptr_t parm2);
uintptr_t STUB_pthread_setschedparam(int nbr, uintptr_t parm1,
uintptr_t parm2, uintptr_t parm3);
uintptr_t STUB_pthread_setschedprio(int nbr, uintptr_t parm1,