From 15a4403f244f70234dce8f6a89ea94796dee3022 Mon Sep 17 00:00:00 2001
From: NIIBE Yutaka <gniibe@fsij.org>
Date: Tue, 28 Jun 2016 15:48:15 +0900
Subject: chopstx_poll change

---
 ChangeLog               | 11 +++++++++++
 NEWS                    | 11 +++++++++++
 chopstx.c               | 22 ++++++----------------
 chopstx.h               |  7 ++++++-
 contrib/adc-mkl27z.c    |  7 ++++---
 contrib/adc-stm32f103.c |  3 ++-
 eventflag.c             |  3 ++-
 7 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 851df3d..c3f7f08 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2016-06-28  NIIBE Yutaka  <gniibe@fsij.org>
+
+	* chopstx.h (struct chx_poll_head): Declare here.
+
+	* chopstx.c (chopstx_poll): Don't use varargs, but use
+	an array of pointer.
+	(chopstx_intr_wait): Follow the change of chopstx_poll.
+	* eventflag.c (eventflag_wait_timeout): Likewise.
+	* contrib/adc-stm32f103.c (adc_wait_completion): Likewise.
+	* contrib/adc-mkl27z.c (adc_wait_completion): Likewise.
+
 2016-06-16  Niibe Yutaka  <gniibe@fsij.org>
 
 	* VERSION: 1.0.
diff --git a/NEWS b/NEWS
index 16fe07a..a1ac1c5 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,17 @@
 NEWS - Noteworthy changes
 
 
+* Major changes in Chopstx 1.1
+
+  Released 2016-07-XX
+
+** API change: chopstx_poll
+In version 1.0, chopstx_poll has variable arguments.  It found
+that it's challenging for ffi or lower level C implementation.
+An example is that a program touches FPU registers for varargs.
+So, we decided to avoid use of varargs in Chopstx.
+
+
 * Major changes in Chopstx 1.0
 
   Released 2016-06-16
diff --git a/chopstx.c b/chopstx.c
index d27acb0..b6bf1e7 100644
--- a/chopstx.c
+++ b/chopstx.c
@@ -335,11 +335,6 @@ struct chx_thread {		/* inherits PQ */
   struct chx_cleanup *clp;
 };
 
-struct chx_poll_head {
-  uint16_t type;
-  uint16_t ready;
-};
-
 
 static void
 chx_cpu_sched_lock (void)
@@ -1464,7 +1459,7 @@ chx_intr_hook (struct chx_px *px, struct chx_poll_head *pd)
 void
 chopstx_intr_wait (chopstx_intr_t *intr)
 {
-  chopstx_poll (NULL, 1, intr);
+  chopstx_poll (NULL, 1, (struct chx_poll_head **)&intr);
 }
 
 
@@ -1749,17 +1744,17 @@ chx_proxy_init (struct chx_px *px, uint32_t *cp)
  * chopstx_poll - wait for condition variable, thread's exit, or IRQ
  * @usec_p: Pointer to usec for timeout.  Forever if NULL.
  * @n: Number of poll descriptors
- * @VARARGS: Pointers to an object which should be one of:
+ * @pd_array: Pointer to an array of poll descriptor pointer which
+ * should be one of:
  *           chopstx_poll_cond_t, chopstx_poll_join_t, or chopstx_intr_t.
  *
  * Returns number of active descriptors.
  */
 int
-chopstx_poll (uint32_t *usec_p, int n, ...)
+chopstx_poll (uint32_t *usec_p, int n, struct chx_poll_head *pd_array[])
 {
   uint32_t counter = 0;
   int i;
-  va_list ap;
   struct chx_px px[n];
   struct chx_poll_head *pd;
   int r = 0;
@@ -1769,10 +1764,9 @@ chopstx_poll (uint32_t *usec_p, int n, ...)
   for (i = 0; i < n; i++)
     chx_proxy_init (&px[i], &counter);
 
-  va_start (ap, n);
   for (i = 0; i < n; i++)
     {
-      pd = va_arg (ap, struct chx_poll_head *);
+      pd = pd_array[i];
       pd->ready = 0;
       px[i].ready_p = &pd->ready;
       if (pd->type == CHOPSTX_POLL_COND)
@@ -1782,7 +1776,6 @@ chopstx_poll (uint32_t *usec_p, int n, ...)
       else
 	chx_join_hook (&px[i], pd);
     }
-  va_end (ap);
 
   chx_cpu_sched_lock ();
   chx_spin_lock (&px->lock);
@@ -1818,11 +1811,9 @@ chopstx_poll (uint32_t *usec_p, int n, ...)
       while (r == 0);
     }
 
-  va_start (ap, n);
   for (i = 0; i < n; i++)
     {
-      pd = va_arg (ap, struct chx_poll_head *);
-
+      pd = pd_array[i];
       chx_cpu_sched_lock ();
       chx_spin_lock (&px[i].lock);
       if (pd->type == CHOPSTX_POLL_COND)
@@ -1864,7 +1855,6 @@ chopstx_poll (uint32_t *usec_p, int n, ...)
       chx_spin_unlock (&px[i].lock);
       chx_cpu_sched_unlock ();
     }
-  va_end (ap);
 
   if (r < 0)
     chopstx_exit (CHOPSTX_CANCELED);
diff --git a/chopstx.h b/chopstx.h
index e1a8cd8..b8daa0e 100644
--- a/chopstx.h
+++ b/chopstx.h
@@ -121,6 +121,11 @@ enum {
   CHOPSTX_POLL_JOIN,
 };
 
+struct chx_poll_head {
+  uint16_t type;
+  uint16_t ready;
+};
+
 struct chx_poll_cond {
   uint16_t type;
   uint16_t ready;
@@ -153,6 +158,6 @@ void chopstx_claim_irq (chopstx_intr_t *intr, uint8_t irq_num);
 void chopstx_intr_wait (chopstx_intr_t *intr); /* DEPRECATED */
 
 
-int chopstx_poll (uint32_t *usec_p, int n, ...);
+int chopstx_poll (uint32_t *usec_p, int n, struct chx_poll_head *pd_array[]);
 
 #define CHOPSTX_THREAD_SIZE 64
diff --git a/contrib/adc-mkl27z.c b/contrib/adc-mkl27z.c
index 19f9f5b..d5b679e 100644
--- a/contrib/adc-mkl27z.c
+++ b/contrib/adc-mkl27z.c
@@ -295,12 +295,13 @@ adc_stop (void)
 int
 adc_wait_completion (void)
 {
+  struct chx_poll_head *pd_array[1] = { (struct chx_poll_head *)&adc_intr };
+  int i;
+
   while (1)
     {
-      int i;
-
       /* Wait DMA completion */
-      chopstx_poll (NULL, 1, &adc_intr);
+      chopstx_poll (NULL, 1, pd_array);
 
       DMA0->DSR_BCR = (1 << 24);
       DMA1->DSR_BCR = (1 << 24);
diff --git a/contrib/adc-stm32f103.c b/contrib/adc-stm32f103.c
index 6a8076e..a44942f 100644
--- a/contrib/adc-stm32f103.c
+++ b/contrib/adc-stm32f103.c
@@ -298,10 +298,11 @@ int
 adc_wait_completion (void)
 {
   uint32_t flags;
+  struct chx_poll_head *pd_array[1] = { (struct chx_poll_head *)&adc_intr };
 
   while (1)
     {
-      chopstx_poll (NULL, 1, &adc_intr);
+      chopstx_poll (NULL, 1, pd_array);
       flags = DMA1->ISR & STM32_DMA_ISR_MASK; /* Channel 1 interrupt cause.  */
       /*
        * Clear interrupt cause of channel 1.
diff --git a/eventflag.c b/eventflag.c
index 6271dbc..c6a871e 100644
--- a/eventflag.c
+++ b/eventflag.c
@@ -111,9 +111,10 @@ eventmask_t
 eventflag_wait_timeout (struct eventflag *ev, uint32_t usec)
 {
   chopstx_poll_cond_t poll_desc;
+  struct chx_poll_head *pd_array[1] = { (struct chx_poll_head *)&poll_desc };
 
   eventflag_prepare_poll (ev, &poll_desc);
-  chopstx_poll (&usec, 1, &poll_desc);
+  chopstx_poll (&usec, 1, pd_array);
   return eventflag_get (ev);
 }
 
-- 
cgit v1.2.3