correct the retry condition of poll()
[platform/core/uifw/libtdm.git] / client / tdm_client.h
1 /**************************************************************************
2  *
3  * libtdm
4  *
5  * Copyright 2015 Samsung Electronics co., Ltd. All Rights Reserved.
6  *
7  * Contact: Eunchul Kim <chulspro.kim@samsung.com>,
8  *          JinYoung Jeon <jy0.jeon@samsung.com>,
9  *          Taeheon Kim <th908.kim@samsung.com>,
10  *          YoungJun Cho <yj44.cho@samsung.com>,
11  *          SooChan Lim <sc1.lim@samsung.com>,
12  *          Boram Park <sc1.lim@samsung.com>
13  *
14  * Permission is hereby granted, free of charge, to any person obtaining a
15  * copy of this software and associated documentation files (the
16  * "Software"), to deal in the Software without restriction, including
17  * without limitation the rights to use, copy, modify, merge, publish,
18  * distribute, sub license, and/or sell copies of the Software, and to
19  * permit persons to whom the Software is furnished to do so, subject to
20  * the following conditions:
21  *
22  * The above copyright notice and this permission notice (including the
23  * next paragraph) shall be included in all copies or substantial portions
24  * of the Software.
25  *
26  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
27  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
29  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
30  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
31  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
32  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33  *
34 **************************************************************************/
35
36 #ifndef _TDM_CLIENT_H_
37 #define _TDM_CLIENT_H_
38
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42
43 /**
44  * @file tdm_client.h
45  * @brief The header file for a client of TDM.
46  * @par Example
47  * @code
48  * #include <tdm_client.h>    //for a client of TDM
49  * @endcode
50  */
51
52 /**
53  * @brief The client error enumeration
54  */
55 typedef enum {
56         TDM_CLIENT_ERROR_NONE                  = 0,  /**< none */
57         TDM_CLIENT_ERROR_OPERATION_FAILED      = -1, /**< operaion failed */
58         TDM_CLIENT_ERROR_INVALID_PARAMETER     = -2, /**< wrong input parameter */
59         TDM_CLIENT_ERROR_PERMISSION_DENIED     = -3, /**< access denied */
60         TDM_CLIENT_ERROR_OUT_OF_MEMORY         = -4, /**< no free memory */
61         TDM_CLIENT_ERROR_DPMS_OFF              = -5, /**< dpms off */
62 } tdm_client_error;
63
64 /**
65  * @brief The TDM client object
66  */
67 typedef void *tdm_client;
68
69 /**
70  * @brief The client vblank handler
71  * @see #tdm_client_wait_vblank
72  */
73 typedef void
74 (*tdm_client_vblank_handler)(unsigned int sequence, unsigned int tv_sec,
75                                                          unsigned int tv_usec, void *user_data);
76
77 /**
78  * @brief Create a TDM client object.
79  * @param[out] error #TDM_CLIENT_ERROR_NONE if success. Otherwise, error value.
80  * @return A TDM client object if success. Otherwise, NULL.
81  * @see #tdm_client_destroy
82  */
83 tdm_client*
84 tdm_client_create(tdm_client_error *error);
85
86 /**
87  * @brief Destroy a TDM client object
88  * @param[in] client A TDM client object
89  * @see #tdm_client_create
90  */
91 void
92 tdm_client_destroy(tdm_client *client);
93
94 /**
95  * @brief Get the file descriptor
96  * @param[in] client A TDM client object
97  * @param[out] fd The file descriptor
98  * @return #TDM_CLIENT_ERROR_NONE if success. Otherwise, error value.
99  * @see #tdm_client_handle_events
100  * @par Example
101  * @code
102  * #include <tdm_client.h>    //for a client of TDM
103  *
104  * err = tdm_client_get_fd(client, &fd);
105  * if (err != TDM_CLIENT_ERROR_NONE) {
106  *     //error handling
107  * }
108  *
109  * fds.events = POLLIN;
110  * fds.fd = fd;
111  * fds.revents = 0;
112  *
113  * while(1) {
114  *    ret = poll(&fds, 1, -1);
115  *    if (ret < 0) {
116  *       if (errno == EINTR || errno == EAGAIN)
117  *          continue;
118  *       else {
119  *          //error handling
120  *       }
121  *    }
122  *
123  *    err = tdm_client_handle_events(client);
124  *    if (err != TDM_CLIENT_ERROR_NONE) {
125  *        //error handling
126  *    }
127  * }
128  * @endcode
129  */
130 tdm_client_error
131 tdm_client_get_fd(tdm_client *client, int *fd);
132
133 /**
134  * @brief Handle the events of the given file descriptor
135  * @param[in] client A TDM client object
136  * @return #TDM_CLIENT_ERROR_NONE if success. Otherwise, error value.
137  * @see #tdm_client_get_fd
138  */
139 tdm_client_error
140 tdm_client_handle_events(tdm_client *client);
141
142 /**
143  * @brief Wait for VBLANK
144  * @details After interval vblanks, a client vblank handler will be called.
145  * If 'sw_timer' param is 1 in case of DPMS off, TDM will use the SW timer and
146  * call a client vblank handler. Otherwise, this function will return error.
147  * @param[in] client A TDM client object
148  * @param[in] name The name of a TDM output
149  * @param[in] sw_timer 0: not using SW timer, 1: using SW timer
150  * @param[in] interval vblank interval
151  * @param[in] sync 0: asynchronous, 1:synchronous
152  * @param[in] func A client vblank handler
153  * @param[in] user_data The user data
154  * @return #TDM_CLIENT_ERROR_NONE if success. Otherwise, error value.
155  * @see #tdm_client_vblank_handler
156  */
157 tdm_client_error
158 tdm_client_wait_vblank(tdm_client *client, char *name,
159                                            int sw_timer, int interval, int sync,
160                                            tdm_client_vblank_handler func, void *user_data);
161
162 #ifdef __cplusplus
163 }
164 #endif
165
166 #endif /* _TDM_CLIENT_H_ */