attempting to support thread resource in http server
This commit is contained in:
		@ -1508,13 +1508,54 @@ oops:
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
int mio_svc_htts_dothrfunc (mio_svc_htts_t* htts, mio_dev_sck_t* csck, mio_htre_t* req, mio_svc_htts_func_t func)
 | 
			
		||||
struct thr_state_t
 | 
			
		||||
{
 | 
			
		||||
	MIO_SVC_HTTS_RSRC_HEADER;
 | 
			
		||||
	pthread_t thr;
 | 
			
		||||
	mio_svc_htts_thr_func_t func;
 | 
			
		||||
	mio_dev_t* p1; /* change it to pipe */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct thr_state_t thr_state_t;
 | 
			
		||||
 | 
			
		||||
static void thr_state_on_kill (thr_state_t* thr_state)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void* thr_state_run_func (void* arg)
 | 
			
		||||
{
 | 
			
		||||
	thr_state_t* thr_state = (thr_state_t*)arg;
 | 
			
		||||
 | 
			
		||||
//	thr_state->func (thr_state->XXX, thr_state->p1->fd); /* pass the pointer to data that can be accessed safely inside a thread. mostly these must be duplicates of core data */
 | 
			
		||||
	return MIO_NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mio_svc_htts_dothr (mio_svc_htts_t* htts, mio_dev_sck_t* csck, mio_htre_t* req, mio_svc_htts_thr_func_t func)
 | 
			
		||||
{
 | 
			
		||||
	mio_t* mio = htts->mio;
 | 
			
		||||
//	mio_svc_htts_cli_t* cli = mio_dev_sck_getxtn(csck);
 | 
			
		||||
	thr_state_t* thr_state = MIO_NULL;
 | 
			
		||||
 | 
			
		||||
	thr_state = (thr_state_t*)mio_svc_htts_rsrc_make(htts, MIO_SIZEOF(*thr_state), thr_state_on_kill);
 | 
			
		||||
	if (MIO_UNLIKELY(!thr_state)) goto oops;
 | 
			
		||||
 | 
			
		||||
	thr_state->func = func;
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
	thr_state->p1 = mio_dev_pipe_make(mio);
 | 
			
		||||
	if (MIO_UNLIKELY(!thr_state->p1)) goto oops;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (pthread_create(&thr_state->thr, MIO_NULL, thr_state_run_func, thr_state) != 0)
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
oops:
 | 
			
		||||
	//if (thr_state) thr_state_halt_particiapting_devices (thr_state);
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -116,6 +116,8 @@ struct mio_svc_htts_rsrc_t
 | 
			
		||||
#define MIO_SVC_HTTS_RSRC_DETACH(rsrc_var) do { if (--(rsrc_var)->rsrc_refcnt == 0) { mio_svc_htts_rsrc_t* __rsrc_tmp = (rsrc_var); (rsrc_var) = MIO_NULL; mio_svc_htts_rsrc_kill(__rsrc_tmp); } else { (rsrc_var) = MIO_NULL; } } while(0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -------------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
typedef int (*mio_svc_htts_proc_req_t) (
 | 
			
		||||
	mio_svc_htts_t* htts,
 | 
			
		||||
	mio_dev_sck_t*  sck,
 | 
			
		||||
@ -124,6 +126,14 @@ typedef int (*mio_svc_htts_proc_req_t) (
 | 
			
		||||
 | 
			
		||||
/* -------------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
typedef int (*mio_svc_htts_thr_func_t) (
 | 
			
		||||
	mio_svc_htts_t* htts,
 | 
			
		||||
	mio_dev_sck_t*  sck,
 | 
			
		||||
	mio_htre_t*     req
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/* -------------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
#if defined(__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
@ -249,6 +259,13 @@ MIO_EXPORT int mio_svc_htts_docgi (
 | 
			
		||||
	const mio_bch_t* script
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_svc_htts_dothr (
 | 
			
		||||
	mio_svc_htts_t*         htts,
 | 
			
		||||
	mio_dev_sck_t*          csck,
 | 
			
		||||
	mio_htre_t*             req,
 | 
			
		||||
	mio_svc_htts_thr_func_t func
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT mio_svc_htts_rsrc_t* mio_svc_htts_rsrc_make (
 | 
			
		||||
	mio_svc_htts_t*              htts,
 | 
			
		||||
	mio_oow_t                    rsrc_size,
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										141
									
								
								mio/lib/mio-pipe.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								mio/lib/mio-pipe.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,141 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id$
 | 
			
		||||
 *
 | 
			
		||||
    Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved.
 | 
			
		||||
 | 
			
		||||
    Redistribution and use in source and binary forms, with or without
 | 
			
		||||
    modification, are permitted pipevided that the following conditions
 | 
			
		||||
    are met:
 | 
			
		||||
    1. Redistributions of source code must retain the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer.
 | 
			
		||||
    2. Redistributions in binary form must repipeduce the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
       documentation and/or other materials pipevided with the distribution.
 | 
			
		||||
 | 
			
		||||
    THIS SOFTWARE IS PIPEVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 | 
			
		||||
    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WAfRRANTIES
 | 
			
		||||
    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
			
		||||
    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
			
		||||
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
			
		||||
    NOT LIMITED TO, PIPECUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
    DATA, OR PIPEFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
			
		||||
    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _MIO_PIPE_H_
 | 
			
		||||
#define _MIO_PIPE_H_
 | 
			
		||||
 | 
			
		||||
#include <mio.h>
 | 
			
		||||
 | 
			
		||||
typedef struct mio_dev_pipe_t mio_dev_pipe_t;
 | 
			
		||||
 | 
			
		||||
typedef int (*mio_dev_pipe_on_read_t) (
 | 
			
		||||
	mio_dev_pipe_t*    dev,
 | 
			
		||||
	const void*        data,
 | 
			
		||||
	mio_iolen_t        len
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
typedef int (*mio_dev_pipe_on_write_t) (
 | 
			
		||||
	mio_dev_pipe_t*    dev,
 | 
			
		||||
	mio_iolen_t        wrlen,
 | 
			
		||||
	void*              wrctx
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
typedef void (*mio_dev_pipe_on_close_t) (
 | 
			
		||||
	mio_dev_pipe_t*    dev
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
struct mio_dev_pipe_t
 | 
			
		||||
{
 | 
			
		||||
	MIO_DEV_HEADER;
 | 
			
		||||
 | 
			
		||||
	int pfd[2];
 | 
			
		||||
 | 
			
		||||
	mio_dev_pipe_on_read_t on_read;
 | 
			
		||||
	mio_dev_pipe_on_write_t on_write;
 | 
			
		||||
	mio_dev_pipe_on_close_t on_close;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct mio_dev_pipe_make_t mio_dev_pipe_make_t;
 | 
			
		||||
struct mio_dev_pipe_make_t
 | 
			
		||||
{
 | 
			
		||||
	mio_dev_pipe_on_write_t on_write; /* mandatory */
 | 
			
		||||
	mio_dev_pipe_on_read_t on_read; /* mandatory */
 | 
			
		||||
	mio_dev_pipe_on_close_t on_close; /* optional */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum mio_dev_pipe_ioctl_cmd_t
 | 
			
		||||
{
 | 
			
		||||
	MIO_DEV_PIPE_CLOSE,
 | 
			
		||||
	MIO_DEV_PIPE_KILL_CHILD
 | 
			
		||||
};
 | 
			
		||||
typedef enum mio_dev_pipe_ioctl_cmd_t mio_dev_pipe_ioctl_cmd_t;
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT  mio_dev_pipe_t* mio_dev_pipe_make (
 | 
			
		||||
	mio_t*                     mio,
 | 
			
		||||
	mio_oow_t                  xtnsize,
 | 
			
		||||
	const mio_dev_pipe_make_t* data
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
#if defined(MIO_HAVE_INLINE)
 | 
			
		||||
static MIO_INLINE mio_t* mio_dev_pipe_getmio (mio_dev_pipe_t* pipe) { return mio_dev_getmio((mio_dev_t*)pipe); }
 | 
			
		||||
#else
 | 
			
		||||
#	define mio_dev_pipe_getmio(pipe) mio_dev_getmio(pipe)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MIO_HAVE_INLINE)
 | 
			
		||||
static MIO_INLINE void* mio_dev_pipe_getxtn (mio_dev_pipe_t* pipe) { return (void*)(pipe + 1); }
 | 
			
		||||
#else
 | 
			
		||||
#	define mio_dev_pipe_getxtn(pipe) ((void*)(((mio_dev_pipe_t*)pipe) + 1))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT void mio_dev_pipe_kill (
 | 
			
		||||
	mio_dev_pipe_t* pipe
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT void mio_dev_pipe_halt (
 | 
			
		||||
	mio_dev_pipe_t* pipe
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_dev_pipe_read (
 | 
			
		||||
	mio_dev_pipe_t*     pipe,
 | 
			
		||||
	int                 enabled
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_dev_pipe_timedread (
 | 
			
		||||
	mio_dev_pipe_t*     pipe,
 | 
			
		||||
	int                 enabled,
 | 
			
		||||
	const mio_ntime_t*  tmout
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_dev_pipe_write (
 | 
			
		||||
	mio_dev_pipe_t*     pipe,
 | 
			
		||||
	const void*         data,
 | 
			
		||||
	mio_iolen_t         len,
 | 
			
		||||
	void*               wrctx
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_dev_pipe_timedwrite (
 | 
			
		||||
	mio_dev_pipe_t*     pipe,
 | 
			
		||||
	const void*         data,
 | 
			
		||||
	mio_iolen_t         len,
 | 
			
		||||
	const mio_ntime_t*  tmout,
 | 
			
		||||
	void*               wrctx
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_dev_pipe_close (
 | 
			
		||||
	mio_dev_pipe_t*     pipe,
 | 
			
		||||
	mio_dev_pipe_sid_t  sid
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@ -804,6 +804,14 @@ MIO_EXPORT int mio_dev_read (
 | 
			
		||||
	int                enabled
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The mio_dev_timedread() function enables or disables the input watching.
 | 
			
		||||
 * If tmout is not MIO_NULL, it schedules to fire the on_read() callback
 | 
			
		||||
 * with the length of -1 and the mio error number set to MIO_ETMOUT.
 | 
			
		||||
 * If there is input before the time elapses, the scheduled timer job
 | 
			
		||||
 * is automaticaly cancelled. A call to mio_dev_read() or mio_dev_timedread()
 | 
			
		||||
 * with no timeout also cancels the unfired scheduled job.
 | 
			
		||||
 */
 | 
			
		||||
MIO_EXPORT int mio_dev_timedread (
 | 
			
		||||
	mio_dev_t*         dev,
 | 
			
		||||
	int                enabled,
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user