Jelajahi Sumber

Use eventfd instead of pthread_cond (step 8/?) - test ALTERNATIVE_QUEUE in CI tests

bel2125 9 tahun lalu
induk
melakukan
45873a5590
1 mengubah file dengan 28 tambahan dan 29 penghapusan
  1. 28 29
      src/civetweb.c

+ 28 - 29
src/civetweb.c

@@ -208,7 +208,7 @@ clock_gettime(int clk_id, struct timespec *t)
 mg_static_assert(MAX_WORKER_THREADS >= 1,
                  "worker threads must be a positive number");
 
-mg_static_assert(sizeof(size_t) == 4 || sizeof(size_t) == 8, 
+mg_static_assert(sizeof(size_t) == 4 || sizeof(size_t) == 8,
                  "size_t data type size check");
 
 #if defined(_WIN32)                                                            \
@@ -1428,7 +1428,7 @@ struct mg_context {
 
 #ifdef ALTERNATIVE_QUEUE
 	struct socket *client_socks;
-	int *client_wait_events;
+	void **client_wait_events;
 #else
 	struct socket queue[MGSQLEN]; /* Accepted sockets */
 	volatile int sq_head;         /* Head of the socket queue */
@@ -1595,7 +1595,7 @@ typedef struct tagTHREADNAME_INFO {
 
 #if defined(ALTERNATIVE_QUEUE) && 0 /* XXX:remove && 0 */
 
-static int
+static void *
 event_create(void)
 {
 	int ret = eventfd(0, EFD_CLOEXEC);
@@ -1604,15 +1604,15 @@ event_create(void)
 		/* However, Linux does not return 0 on success either. */
 		return 0;
 	}
-	return ret;
+	return (void *)ret;
 }
 
 
 static int
-event_wait(int eventhdl)
+event_wait(void *eventhdl)
 {
 	uint64_t u;
-	int s = (int)read(eventhdl, &u, sizeof(u));
+	int s = (int)read((int)eventhdl, &u, sizeof(u));
 	if (s != sizeof(uint64_t)) {
 		/* error */
 		return 0;
@@ -1623,10 +1623,10 @@ event_wait(int eventhdl)
 
 
 static int
-event_signal(int eventhdl)
+event_signal(void *eventhdl)
 {
 	uint64_t u = 1;
-	int s = (int)write(eventhdl, &u, sizeof(u));
+	int s = (int)write((int)eventhdl, &u, sizeof(u));
 	if (s != sizeof(uint64_t)) {
 		/* error */
 		return 0;
@@ -1636,26 +1636,25 @@ event_signal(int eventhdl)
 
 
 static void
-event_destroy(int eventhdl)
+event_destroy(void *eventhdl)
 {
-	close(eventhdl);
+	close((int)eventhdl);
 }
 #endif
 
 #endif
 
 
-#if /* XXX:uncomment !defined(__linux__) &&*/ !defined(_WIN32) && defined(ALTERNATIVE_QUEUE)
+#if /* XXX:uncomment !defined(__linux__) &&*/ !defined(_WIN32)                 \
+    && defined(ALTERNATIVE_QUEUE)
 
 struct posix_event {
 	pthread_mutex_t mutex;
 	pthread_cond_t cond;
 };
 
-mg_static_assert(sizeof(struct posix_event *) == sizeof(int), "data type size check");
-
 
-static int
+static void *
 event_create(void)
 {
 	struct posix_event *ret = mg_malloc(sizeof(struct posix_event));
@@ -1663,36 +1662,36 @@ event_create(void)
 		/* out of memory */
 		return 0;
 	}
-	if (0!=pthread_mutex_init(&(ret->mutex), NULL)) {
+	if (0 != pthread_mutex_init(&(ret->mutex), NULL)) {
 		/* pthread mutex not available */
 		mg_free(ret);
 		return 0;
 	}
-	if (0!=pthread_cond_init(&(ret->cond), NULL)) {
+	if (0 != pthread_cond_init(&(ret->cond), NULL)) {
 		/* pthread cond not available */
 		pthread_mutex_destroy(&(ret->mutex));
 		mg_free(ret);
 		return 0;
 	}
-	return (int)ret;
+	return (void *)ret;
 }
 
 
 static int
-event_wait(int eventhdl)
+event_wait(void *eventhdl)
 {
-	struct posix_event *ev = (struct posix_event*)eventhdl;
+	struct posix_event *ev = (struct posix_event *)eventhdl;
 	pthread_mutex_lock(&(ev->mutex));
-	pthread_cond_wait(&(ev->cond));
+	pthread_cond_wait(&(ev->cond), &(ev->mutex));
 	pthread_mutex_unlock(&(ev->mutex));
 	return 1;
 }
 
 
 static int
-event_signal(int eventhdl)
+event_signal(void *eventhdl)
 {
-	struct posix_event *ev = (struct posix_event*)eventhdl;
+	struct posix_event *ev = (struct posix_event *)eventhdl;
 	pthread_mutex_lock(&(ev->mutex));
 	pthread_cond_signal(&(ev->cond));
 	pthread_mutex_unlock(&(ev->mutex));
@@ -1701,9 +1700,9 @@ event_signal(int eventhdl)
 
 
 static void
-event_destroy(int eventhdl)
+event_destroy(void *eventhdl)
 {
-	struct posix_event *ev = (struct posix_event*)eventhdl;
+	struct posix_event *ev = (struct posix_event *)eventhdl;
 	pthread_cond_destroy(&(ev->cond));
 	pthread_mutex_destroy(&(ev->mutex));
 	mg_free(ev);
@@ -3132,15 +3131,15 @@ pthread_cond_destroy(pthread_cond_t *cv)
 
 
 #ifdef ALTERNATIVE_QUEUE
-static int
+static void *
 event_create(void)
 {
-	return (int)CreateEvent(NULL, FALSE, FALSE, NULL);
+	return (void *)CreateEvent(NULL, FALSE, FALSE, NULL);
 }
 
 
 static int
-event_wait(int eventhdl)
+event_wait(void *eventhdl)
 {
 	int res = WaitForSingleObject((HANDLE)eventhdl, INFINITE);
 	return (res == WAIT_OBJECT_0);
@@ -3148,14 +3147,14 @@ event_wait(int eventhdl)
 
 
 static int
-event_signal(int eventhdl)
+event_signal(void *eventhdl)
 {
 	return (int)SetEvent((HANDLE)eventhdl);
 }
 
 
 static void
-event_destroy(int eventhdl)
+event_destroy(void *eventhdl)
 {
 	CloseHandle((HANDLE)eventhdl);
 }